2010-11-14 80 views
1

我想模拟“硬件”鼠标点击,因为它看起来像是一些软件从PostMessage输入例如。我知道有SendInput,但这不是一个选项,因为我需要它在后台窗口中兼容。该解决方案似乎是一个低级别的鼠标挂钩,但我搜索周围,找不到任何东西,只是记录器,没有移动鼠标,点击等操作。我希望这发生,而不必写一些某种C++/C包装用作假鼠标驱动程序。用C鼠标钩#

http://support.microsoft.com/kb/318804,我发现这个,但它似乎没有任何进一步的帮助。

任何帮助理解:)

+0

低级别的鼠标钩子不模拟新的鼠标事件,它只是允许处理现有的事件。 – 2010-11-14 13:47:57

+1

对不起,我不知道有什么方法让鼠标驱动程序发送一个真正的点击给系统,而用户没有真正按下按钮,从安全的角度来看,我想这是有道理的。你可能想,我不知道,训练一只猫去点击那个按钮...... – 2010-11-14 13:48:48

回答

1

mouse_event或用于注入鼠标输入SendInput。但就像一个真正的鼠标,它是全局输入,不能在隐藏的窗口上工作。

低级别鼠标钩子也是全局的,但它用于截取和操纵鼠标输入,而不是注入输入。

针对特定窗口时,您需要使用SendMessage,但正如您所指出的,它并不适用于所有应用。

您还可以使用dll挂钩(例如IAT挂钩)来拦截对返回gobal光标位置或鼠标按钮状态的API的调用。但为此,您需要将dll注入到目标应用程序中,并且该dll不应使用.net。

+0

我该如何去做一个IAT钩子?我已经做了一个引导程序,并注入了一个托管程序集,所以我想我可以实现它。 – miceiken 2010-11-14 18:29:56

+0

使用IAT挂钩是最后的手段。检查你是否真的无法使它发送消息。信息应该在大多数程序中工作(通常只有游戏不能工作)。并且不要使用托管代码。对于其中的一个,你会在整个.net运行时带入开销。由于无法并行加载多个.net版本(至少对.net 1到3是真的,可能与4一起使用),它也可能导致问题。 http://blogs.msdn.com/b/oldnewthing/archive/2006/12/18/1317290.aspx – CodesInChaos 2010-11-14 18:35:38

+0

要编写一个IAT钩子,你需要注入一个DLL,然后检查目标模块的导入地址表,并替换指向你想用你的替换函数指针钩住的函数的指针。如果你真的想这样,我可以提供Delphi代码。 – CodesInChaos 2010-11-14 18:37:20

2

不知道'某些软件'可能是什么,但是可以肯定的是,UAC阻止你将消息戳到高级程序的窗口中。它被称为UIPI,用户界面特权隔离。

一般来说,使用PostMessage伪造输入根本不起作用。键盘输入尤其是一个问题,但鼠标输入也有问题。没有好办法改变另一个进程的键盘状态。当程序在处理输入消息时检查Shift,Ctrl和Alt键的状态时,这很重要。很多人都这样

唯一真正的解决方案是使用SendInput()模拟输入。现在你有一个焦点问题需要解决。

+0

一些软件,例如游戏.. – miceiken 2010-11-14 18:29:11

+0

游戏通常不使用消息循环来获取鼠标和键盘信息。 PostMessage()确实不适合他们,SendInput应该。 – 2010-11-14 19:23:10

0

当我必须模拟鼠标输入时,我首先尝试使用SendMessage,但有时一些控件或应用程序可能会吃掉该消息。在这种情况下,我使用spy ++拦截持有该控件的窗口的消息,我完全按照我想要模拟的内容,然后,我只使用:

GetWindowLong(hwnd,GWL_WNDPROC);

得到窗口过程,然后直接调用WND PROC:

CallWindowProc的(WNDPROC lpPrevWndFunc,HWND的HWND,UINT消息,WPARAM wParam参数,LPARAM lParam的)

发送正是我看到使用这些消息间谍++。这总是有效,因为窗口过程立即被调用,而不是在消息循环中排队。

1

看看这个库http://globalmousekeyhook.codeplex.com/。 它是100%托管的c#代码来安装全局鼠标和键盘钩子。

+0

谢谢,但我实际上是在寻找相反的东西。一种“发送”键和鼠标点击的方式,就好像它是硬件一样。 – miceiken 2011-10-21 16:12:38