带C#的鼠标钩子

我试图模仿“硬件”鼠标点击,因为看起来有些软件阻止来自PostMessage的输入。 我知道有SendInput,但这不是一个选项,因为我需要它在后台窗口兼容。 解决方案似乎是一个低级别的鼠标钩子,但我已经四处搜索,除了记录器之外找不到任何东西,没有移动鼠标的操作,点击等等。我希望这样做而不必写一些用作伪造鼠标驱动程序的C ++ / C包装器。

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

任何帮助赞赏:)

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

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

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

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

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

在定位特定窗口时,您需要使用SendMessage ,但正如您所指出的,它不适用于所有内容。

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

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

当我必须模拟鼠标输入时,我首先尝试使用SendMessage,但有时一些控件或应用程序可能会吃掉消息。 在那种情况下,我使用间谍++拦截持有控件的窗口的消息,我正是我想要模拟的,然后,我只是使用:

GetWindowLong(hwnd,GWL_WNDPROC);

获取窗口proc然后直接调用wnd proc:

CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)

发送我使用Spy ++看到的那些消息。 这总是有效,因为窗口proc被立即调用而不是在消息循环中排队。