【发布时间】: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 立即返回(除非窗口属于同一个线程)。
-
@Benju:您确认
SystemWindow w是按钮的正确窗口,并且w.HWnd有效吗?按钮无响应时Send(Notify)Message()的返回值是多少?只有当WAIT为真或假时才会发生故障,还是两者都发生?您是否尝试过使用 Spy++ 或类似工具来监控窗口消息并确保您的消息(即BM_CLICK- 不要对其数值进行硬编码)到达按钮?
标签: c# .net winapi screen-scraping user32