Pregunta

En mi aplicación C # Estoy intentando utilizar el mensaje TDM_CLICK_BUTTON hacer clic en un botón en un TaskDialog. Básicamente, esto funciona muy bien. Lo que espero que suceda, sucede. Incluso recibo de la notificación TDN_BUTTON_CLICKED.

Pero el documentación dice, que el valor de retorno de SendMessage sería distinto de cero si la llamada se realiza correctamente. Pero siempre devuelve cero para mí.

Este es mi código:

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 es siempre cero cuando se produce la excepción. Lo cual sería otro indicador de que todo está bien.

SendMessage se declara en mi código como el siguiente:

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

Es la documentación incorrecta o estoy usando el mensaje de forma incorrecta?

¿Fue útil?

Solución

Así que tomé la muestra C ++ SDK de Windows TaskDialog y trató este mensaje en allí también. El valor de retorno de SendMessage permanece siempre cero.

Me di cuenta de que siempre se enviará una notificación TDN_BUTTON_CLICKED (incluso si el botón Identificación no existe). Si existe el botón o no tiene ningún efecto sobre el valor de retorno SendMessage.

Luego se sospecha, que el valor de retorno para que la notificación podría tener un efecto, pero no importa lo que vuelvo de la devolución de llamada (TRUE/FALSE/S_OK/42), mi valor de retorno SendMessage sigue siendo cero.

Por lo tanto, dado que no he encontrado ninguna manera de hacer que esto falle y / o devuelve un valor distinto de cero, sólo puedo suponer que la documentación es correcta.

editar: Me dieron una respuesta a mi comentarios de la documentación que envié hace unos días. Resulta que la documentación es de hecho incorrecto. El valor de retorno es para ser ignorado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top