【问题标题】:Simulate clicking a button in another window in C#在 C# 中模拟单击另一个窗口中的按钮
【发布时间】:2009-06-12 13:50:56
【问题描述】:

我想关闭一个自动弹出的对话框,但我在让它工作时遇到了一些问题。经过几年的有限使用,我的 Win32 编程有点生疏了。

我正在使用 FindWindowEx 来获取对话框的句柄和我想要单击的按钮。我的印象是发送 WM_COMMAND 到对话框,在 wParam 参数中使用按钮句柄就可以了。

Window window = Window.FindWindow("TSomeDialog", null);
Window cancelButton = Window.FindWindow("TButton", "Cancel", window);

Message message = Message.Create(window.HWnd, 0x0111, cancelButton.HWnd, IntPtr.Zero);
PostMessage(message);

public void PostMessage(Message message)
{
    // Win32 API import
    PostMessage(message.HWnd, message.Msg, message.WParam, message.LParam);
}

Window 是一个实现 IWin32Window 并包装了一些 Win32 API 调用的类。我已经内联了 WM_COMMAND (0x111) 的常量。

我做错了什么? :)

【问题讨论】:

    标签: c# winapi button sendmessage


    【解决方案1】:

    嗯,根据 WM_COMMAND 的文档,lParam 应该是控件窗口的句柄(看起来你是在 wParam 中传递它)。

    wParam 的高位字应等于 BN_CLICKED,其低位字应等于控件的标识符。

    (您可以使用带有 GWL_ID 的 GetWindowLong 来检索它,但可能是它的 IDCANCEL。)

    【讨论】:

    • 谢谢,我刚刚发现自己应该改用 lParam。永远不要假设其他人写的是正确的:(
    【解决方案2】:

    为什么不直接发送带有 SC_CLOSE 参数的 WM_SYSCOMMAND 消息?那应该关闭窗口。

    【讨论】:

      【解决方案3】:

      为什么不发送 WM_CLOSE 消息呢?

      【讨论】:

      • 在这种情况下我需要按下一个特定的按钮。这是一个……特别的……对话框。
      猜你喜欢
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2015-04-07
      • 2013-12-09
      • 1970-01-01
      相关资源
      最近更新 更多