2010-06-19 16 views
1

Dans mon application C# j'essaie d'utiliser le message TDM_CLICK_BUTTON pour cliquer sur un bouton dans un TaskDialog. Cela fonctionne essentiellement bien. Ce que je prévois arriver, arrive. Je reçois même la notification TDN_BUTTON_CLICKED.SendMessage avec la valeur de retour TDM_CLICK_BUTTON est toujours zéro

Mais le documentation indique que la valeur de retour de SendMessage serait non nulle si l'appel aboutit. Mais ça revient toujours à zéro pour moi.

Ceci est mon code:

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 est toujours égale à zéro lorsque l'exception est levée. Ce qui serait un autre indicateur que tout va bien.

SendMessage est déclaré dans mon code comme ceci:

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

La documentation est incorrecte ou ce que j'utilise le message de façon incorrecte?

+1

Pas une réponse, mais vous devez ajouter 'SetLastError = true' à votre DllImport pour' Marshal.GetLastWin32Error() 'pour fonctionner correctement. http://msdn.microsoft.com/fr-fr/library/system.runtime.interopservices.marshal.getlastwin32error.aspx – shf301

+0

Merci. J'ai ajouté cela, mais lastWin32Error reste toujours 0. –

+0

l'appel réussit-il? –

Répondre

1

J'ai donc pris l'exemple C++ Windows SDK TaskDialog et essayé ce message là aussi. La valeur de retour de SendMessage reste toujours zéro.

J'ai remarqué qu'une notification TDN_BUTTON_CLICKED sera toujours envoyée (même si l'ID du bouton n'existe pas). Si le bouton existe ou non n'a aucun effet sur la valeur de retour SendMessage.

Puis j'ai soupçonné que la valeur de retour pour cette notification pourrait avoir un effet, mais peu importe ce que je reviens du rappel (TRUE/FALSE/S_OK/42), ma valeur de retour SendMessage reste zéro. Donc, étant donné que je n'ai trouvé aucun moyen de faire échouer et/ou retourner une valeur différente de zéro, je ne peux que supposer que la documentation est incorrecte.

edit: J'ai reçu une réponse à mes commentaires sur la documentation que j'ai envoyé il y a quelques jours. Il s'avère que la documentation est en effet incorrecte. La valeur de retour doit être ignorée.