2015-04-01 80 views
0

我在工作中继承了一些相当狭隘的“屏幕抓取”代码。它似乎一切正常,除了在某些Windows XP机器上,点击事件永远不会让它进入我们希望以编程方式“点击”的按钮。SendMessage vs SendNotifyMessage user32.dll api

以下片段用于我们代码的各个部分中,以“单击”按钮。

[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的区别。任何想法为什么你会想要一个在另一个?

+2

SendMessage阻塞,直到消息被处理; SendNotifyMessage立即返回(除非窗口属于同一个线程)。 – Blorgbeard 2015-04-01 22:58:50

+0

另请参见['SendMessageTimeout()'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952.aspx)。 – 2015-04-02 01:27:38

+1

@本州:你确认'SystemWindow w'是按钮的正确窗口,而'w.HWnd'是有效的吗?当按钮没有响应时,发送(通知)消息()的返回值是什么?只有当WAIT是真或假,或者两者都发生时,才会发生故障吗?您是否尝试过使用Spy ++或类似工具来监控窗口消息并确保您的消息([[BM_CLICK]](https://msdn.microsoft.com/en-us/library/windows/desktop/bb775985.aspx) - 不要硬编码它的数值)到达按钮? – 2015-04-02 01:31:15

回答

2

0x00F5BM_CLICK。它的文档包含以下注意事项:

如果按钮是一个对话框,该对话框不活跃,的BM_CLICK消息可能会失败。为确保在这种情况下成功,请在发送BM_CLICK消息到按钮之前调用SetActiveWindow函数来激活对话框。

相关问题