2015-04-01 83 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函數來激活對話框。

相關問題