【问题标题】:Send Click Message to another application process将点击消息发送到另一个应用程序进程
【发布时间】:2010-12-23 11:38:34
【问题描述】:

我有一个场景,我需要将点击事件发送到一个独立的应用程序。我使用以下代码启动了该应用程序。

private Process app;
app = new Process();
app.StartInfo.FileName = app_path;
app.StartInfo.WorkingDirectory = dir_path;
app.Start();

现在我想向该应用程序发送鼠标点击消息,我有相对于应用程序窗口的特定坐标。我如何使用 Windows 消息或任何其他技术来做到这一点。

我用过

[DllImport("user32.dll")]
private static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, IntPtr dwExtraInfo);

它工作得很好,但也会导致指针移动。所以不适合我的需要。

然后我用。

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

它适用于最小化最大化,但不适用于鼠标事件。

我使用的mousevents代码是,

WM_LBUTTONDOWN = 0x201, //Left mousebutton down
WM_LBUTTONUP = 0x202,   //Left mousebutton up
WM_LBUTTONDBLCLK = 0x203, //Left mousebutton doubleclick
WM_RBUTTONDOWN = 0x204, //Right mousebutton down
WM_RBUTTONUP = 0x205,   //Right mousebutton up
WM_RBUTTONDBLCLK = 0x206, //Right mousebutton do

提前感谢您的帮助,等待反馈。

【问题讨论】:

  • 停止发送输入消息,它们应该被发布。无论如何,使用SendInput() 可能会更好,这是伪造输入的正确方法。

标签: c# .net winapi


【解决方案1】:

对于一次单击,您应该同时发送两个鼠标事件以获得精确的鼠标单击事件。

SendMessage(nChildHandle, 0x201, 0, 0); //Mouse left down
SendMessage(nChildHandle, 0x202, 0, 0); //Mouse left up

它在我的项目中工作。

【讨论】:

  • 窗口不需要被聚焦来使用它是吗?是否有可能将其最小化,并且我们可以在某些 x 和 y 处合成点击?
【解决方案2】:

保存光标位置,使用 mouse_event 并将光标向后移动。 mouse_event 确实是最好的方法。

【讨论】:

  • 一次单击涉及多个消息,例如鼠标移动、按下按钮、按下按钮、单击以及可能的其他消息。我并不是说用 SendMessage 模拟是不可能的,因为它确实是,只是要困难得多。您应该创建一个简单的表单应用程序,它将所有收到的消息转储到一个文本文件中,然后看看会发生什么。
  • 我刚刚找到了这个库programmersheaven.com/download/56171/download.aspx ,它工作得很好,但仍然不适用于点击。还尝试了许多其他方法,但单击不起作用。 Windows7 有什么问题吗,我读过一些 Windows Vista + OS 有一些用户界面保护的地方。是这个问题吗?
  • 当我试图戳一个不想被戳的应用程序时,它也无法在 XP 上运行。
猜你喜欢
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 2012-05-31
相关资源
最近更新 更多