SendMessage с возвращаемым значением TDM_CLICK_BUTTON всегда равен нулю

В моем приложении C # я пытаюсь использовать сообщение TDM_CLICK_BUTTON, чтобы нажать кнопку в TaskDialog. Это в основном работает нормально. То, что я ожидаю, случается. Я даже получаю TDN_BUTTON_CLICKED уведомление.

Но в документации говорится, что возврат значение SendMessage будет отличным от нуля, если вызов завершится успешно. Но для меня он всегда возвращает ноль.

Это мой код:

public void ClickButton( int buttonId ) {
  bool success = UnsafeNativeMethods.SendMessage(
    WindowHandle,
    (uint)UnsafeNativeMethods.TASKDIALOG_MESSAGES.TDM_CLICK_BUTTON,
    (IntPtr)buttonId,
    IntPtr.Zero ) != IntPtr.Zero;
  if( !success ) {
    int lastWin32Error = Marshal.GetLastWin32Error();
    throw new Win32Exception( lastWin32Error, "SendMessage for TDM_CLICK_BUTTON failed." );
  }
}

lastWin32Error всегда равен нулю при возникновении исключения. Что было бы еще одним показателем того, что все в порядке.

SendMessage объявлен в моем коде следующим образом:

[DllImport( "user32.dll", SetLastError = true )]
internal static extern IntPtr SendMessage( IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam );

Документация неверна, или я неправильно использую сообщение?


person Der Hochstapler    schedule 19.06.2010    source источник
comment
Не ответ, но вам нужно добавить SetLastError=true в ваш DllImport, чтобы Marshal.GetLastWin32Error() работал правильно. msdn.microsoft.com/en-us/ библиотека /   -  person shf301    schedule 20.06.2010
comment
Спасибо. Я добавил это, но lastWin32Error по-прежнему остается 0.   -  person Der Hochstapler    schedule 20.06.2010
comment
Если бы я воспользовался документацией, нет, это не так. Возвращаемое значение - ноль. Но то, что я намеревался сделать с вызовом (вызвать действие, которое произошло бы, если была нажата определенная кнопка), успешно. Я даже получаю уведомление TDN_BUTTON_CLICKED. Что и является причиной всего моего замешательства.   -  person Der Hochstapler    schedule 20.06.2010


Ответы (1)


Поэтому я взял образец C ++ Windows SDK TaskDialog и также попробовал это сообщение. Возвращаемое значение SendMessage всегда остается нулевым.

Я заметил, что всегда будет отправляться TDN_BUTTON_CLICKED уведомление (даже если идентификатор кнопки не существует). Если кнопка существует или нет, это не влияет на возвращаемое значение SendMessage.

Затем я подозревал, что возвращаемое значение для этого уведомления может иметь эффект, но независимо от того, что я возвращаю из обратного вызова (TRUE/FALSE/S_OK/42), мое возвращаемое значение SendMessage остается нулевым.

Итак, учитывая, что я не нашел способа сделать это сбой и / или вернуть ненулевое значение, я могу только предположить, что документация неверна.

изменить: я получил ответ на свой отзыв о документации, который я отправил несколько дней назад. Оказывается, документация действительно неверна. Возвращаемое значение следует игнорировать.

person Der Hochstapler    schedule 21.06.2010