2010-06-19 1 views
1

내 C# 응용 프로그램에서 TDM_CLICK_BUTTON 메시지를 사용하여 TaskDialog의 단추를 클릭하려고합니다. 이것은 기본적으로 잘 작동합니다. 내가 기대하는 것은 일어난다. 심지어 TDN_BUTTON_CLICKED 알림을받습니다.TDM_CLICK_BUTTON 반환 값이있는 SendMessage는 항상 0입니다.

그러나 documentation에 따르면 호출이 성공하면 SendMessage의 반환 값은 0이 아닙니다. 그러나 그것은 항상 제로를 돌려줍니다. 예외가 슬로우되면

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는 항상 0입니다 :

내 코드입니다. 어떤 것이 든 괜찮다는 또 다른 지표가 될 것입니다.

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

+0

감사. 나는 그것을 추가했지만 lastWin32Error는 여전히 0으로 남아 있습니다. –

+0

호출이 성공합니까? –

답변

1

그래서 C++ Windows SDK TaskDialog 샘플을 가져 와서이 메시지도 시도했습니다. SendMessage의 반환 값은 항상 0입니다.

단추 ID가없는 경우에도 TDN_BUTTON_CLICKED 알림이 항상 전송되는 것으로 나타났습니다. 버튼이 있거나 존재하지 않으면 SendMessage 반환 값에 영향을주지 않습니다.

그런 다음 해당 알림의 반환 값이 영향을 미칠 수 있지만 콜백 (TRUE/FALSE/S_OK/42)에서 반환 한 것과 관계없이 내 SendMessage 반환 값은 0으로 유지됩니다.

따라서이 방법을 사용하지 못하게하거나 0이 아닌 값을 반환 할 방법이 없다는 것을 생각하면 문서가 올바르지 않다고 가정 할 수 있습니다.

편집 : 며칠 전에 보낸 문서에 대한 회신을 보내 왔습니다. 실제로 설명서가 틀렸다고 밝혀졌습니다. 반환 값은 무시됩니다.