我试图模仿“硬件”鼠标点击,因为看起来有些软件会阻止来自PostMessage的输入。我知道有SendInput,但这不是一个选项,因为我需要它在后台窗口兼容。解决方案似乎是一个低级别的鼠标钩子,但我已经四处搜索,除了记录器之外找不到任何东西,没有移动鼠标,点击等操作。我希望这样做而不必写一些用作伪造鼠标驱动程序的C ++ / C包装器。
http://support.microsoft.com/kb/318804,我发现了这一点,但它似乎没有任何进一步的帮助。
任何帮助表示赞赏:)
答案 0 :(得分:2)
不确定'某些软件'可能是什么,但可以肯定的是,UAC阻止您将消息戳到提升程序的窗口中。它被称为UIPI,用户界面权限隔离。
通常,使用PostMessage伪造输入根本不起作用。键盘输入尤其是一个问题,但鼠标输入也有问题。没有好办法改变另一个进程的键盘状态。当程序在处理输入消息时检查Shift,Ctrl和Alt键的状态时,这很重要。很多人都这样做。
唯一真正的解决方案是使用SendInput()模拟输入。现在你有一个需要解决的焦点问题。
答案 1 :(得分:1)
mouse_event或SendInput。但就像真正的鼠标一样,它是全局输入,不能在隐藏的窗口上工作。
低级鼠标钩子也是全局的,但它用于拦截和操纵鼠标输入,而不是注入输入。
在定位特定窗口时,您需要使用SendMessage
,但正如您所说,它不适用于所有内容。
您还可以使用dll挂钩(例如IAT挂钩)来拦截对返回gobal游标位置或鼠标按钮状态的API的调用。但是为此你需要在目标应用程序中注入一个dll,并且该DLL不应该使用.net。
答案 2 :(得分:1)
看看这个图书馆http://globalmousekeyhook.codeplex.com/。 它是100%托管的c#代码,用于安装全局鼠标和键盘钩子。
答案 3 :(得分:0)
当我必须模拟鼠标输入时,我首先尝试使用SendMessage,但有时某些控件或应用程序可能会吃掉该消息。 在那种情况下,我使用spy ++拦截持有控件的窗口的消息,我正是我想要模拟的,然后,我只是使用:
GetWindowLong(hwnd,GWL_WNDPROC);
获取窗口proc,然后直接使用:
调用wnd procCallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
发送我使用Spy ++看到的那些消息。这总是有效,因为窗口proc被立即调用而不是在消息循环中排队。