【问题标题】:SendMessage vs SendNotifyMessage in user32.dll apiuser32.dll api 中的 SendMessage 与 SendNotifyMessage
【发布时间】:2015-06-06 18:40:00
【问题描述】:

我在工作中继承了一些相当简单的“屏幕抓取”代码。除了在某些 Windows XP 机器上点击事件永远不会到达我们希望以编程方式“点击”的按钮之外,这一切似乎都运行良好。

以下 sn-p 用于我们代码的各个部分以“单击”按钮。

    [DllImport("user32.dll")]
    public extern static int SendMessage(IntPtr hwnd, uint msg, uint wParam, uint lParam);
    [DllImport("user32.dll")]
    public extern static int SendNotifyMessage(IntPtr hwnd, uint msg, uint wParam, uint lParam);
    static public void SendClick(SystemWindow w, bool WAIT = true, int delay=100)
    {
        if (w != null)
            if (WAIT == true)
                SendMessage(w.HWnd, 0x00F5, 0, 0);
            else
            {
                SendNotifyMessage(w.HWnd, 0x00F5, 0, 0);
                System.Threading.Thread.Sleep(delay);
            }
    }

让我困惑的是 SendMessage 和 SendNotifyMessage 之间的区别。知道为什么你会想要一个而不是另一个吗?

【问题讨论】:

  • SendMessage 阻塞,直到消息被处理; SendNotifyMessage 立即返回(除非窗口属于同一个线程)。
  • 也看看SendMessageTimeout()
  • @Benju:您确认SystemWindow w 是按钮的正确窗口,并且w.HWnd 有效吗?按钮无响应时Send(Notify)Message()的返回值是多少?只有当WAIT 为真或假时才会发生故障,还是两者都发生?您是否尝试过使用 Spy++ 或类似工具来监控窗口消息并确保您的消息(即BM_CLICK - 不要对其数值进行硬编码)到达按钮?

标签: c# .net winapi screen-scraping user32


【解决方案1】:

0x00F5BM_CLICK。其文档包含以下注释:

如果按钮在对话框中并且对话框未激活,BM_CLICK 消息可能会失败。为确保在这种情况下成功,请在向按钮发送 BM_CLICK 消息之前调用SetActiveWindow 函数来激活对话框。

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 2012-03-23
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    相关资源
    最近更新 更多