user32.dll api中的SendMessage与SendNotifyMessage

时间:2015-04-01 22:57:13

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

我继承了一些相当狭隘的屏幕抓取"工作中的代码。在一些Windows XP机器上似乎工作正常,其中点击事件从未进入我们希望以编程方式按下的按钮"点击"。

我们的代码的各个部分使用以下代码段来"点击"一个按钮。

    [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之间的区别。知道为什么你会想要一个超过另一个吗?

1 个答案:

答案 0 :(得分:2)

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

  

如果按钮位于对话框中且对话框未激活, BM_CLICK消息可能会失败。为确保在这种情况下取​​得成功,请在将BM_CLICK消息发送到按钮之前调用SetActiveWindow功能激活对话框。