【问题标题】:SendMessage with TDM_CLICK_BUTTON return value is always zero带有 TDM_CLICK_BUTTON 返回值的 SendMessage 始终为零
【发布时间】:2010-06-19 21:57:28
【问题描述】:

在我的 C# 应用程序中,我尝试使用 TDM_CLICK_BUTTON 消息单击 TaskDialog 中的按钮。这基本上工作得很好。我期望发生的事情,发生了。我什至收到了TDN_BUTTON_CLICKED 通知。

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 );

是文档不正确还是我使用的消息不正确?

【问题讨论】:

  • 不是答案,但您需要将 SetLastError=true 添加到您的 DllImport 以使 Marshal.GetLastWin32Error() 正常工作。 msdn.microsoft.com/en-us/library/…
  • 谢谢。我添加了,但 lastWin32Error 仍然为 0。
  • 如果我要查看文档,不,它不会。返回值为零。但是我打算对调用执行的操作(调用单击某个按钮时会发生的操作)成功了。我什至收到了 TDN_BUTTON_CLICKED 通知。这是我整个困惑的基础。

标签: c# winapi sendmessage taskdialog


【解决方案1】:

因此,我采用了 C++ Windows SDK TaskDialog 示例并在其中尝试了此消息。 SendMessage 的返回值始终保持为零。

我注意到总是会发送TDN_BUTTON_CLICKED 通知(即使按钮 ID 不存在)。按钮是否存在对SendMessage返回值没有影响。

然后我怀疑,该通知的返回值可能会产生影响,但无论我从回调 (TRUE/FALSE/S_OK/42) 返回什么,我的 SendMessage 返回值都保持为零。

所以,鉴于我没有办法让这个失败和/或返回一个非零值,我只能假设文档不正确。

编辑:我收到了对几天前发送的文档反馈的回复。结果证明文档确实不正确。返回值将被忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2019-09-10
    • 1970-01-01
    相关资源
    最近更新 更多