2010-06-19 45 views
1

在我的C#應用​​程序中,我試圖使用TDM_CLICK_BUTTON消息來單擊TaskDialog中的按鈕。這基本上工作得很好。我期望發生的事情發生。我甚至收到TDN_BUTTON_CLICKED通知。帶TDM_CLICK_BUTTON的SendMessage返回值始終爲零

documentation表示,如果調用成功,則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); 

是文檔不正確或我使用不正確的信息?

+1

不是答案,但是您需要爲''Marshal.GetLastWin32Error()''的DllImport添加'SetLastError = true'才能正常工作。 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getlastwin32error.aspx – shf301 2010-06-19 23:37:40

+0

謝謝。我補充說,但lastWin32Error仍然爲0. – 2010-06-19 23:45:58

+0

這個調用是否成功? – 2010-06-20 00:04:09

回答

1

所以我拿了C++的Windows SDK的TaskDialog示例,並在那裏嘗試了這個消息。 SendMessage的返回值總是保持爲零。

我注意到TDN_BUTTON_CLICKED通知總是會被髮送(即使按鈕ID不存在)。如果按鈕存在或沒有對SendMessage返回值沒有影響。

然後我懷疑該通知的返回值可能會有影響,但無論我從回調返回的什麼(TRUE/FALSE/S_OK/42),我的SendMessage返回值都保持爲零。

所以,鑑於我沒有辦法使這個失敗和/或返回一個非零值,我只能假設文檔是不正確的。

編輯:我收到了我前幾天寄給我的文檔反饋的回覆。原來文檔確實不正確。返回值將被忽略。