忽略鼠标单击并将键盘输入发送到外部应用程序

时间:2012-05-17 06:51:32

标签: c# winapi hook uikeyboard keyboard-hook

如何在旧程序中单击鼠标时模拟击键。注意!程序可能不知道单击鼠标

我正在尝试

 IntPtr module = LoadLibrary("user32.dll");
 _mouseHookHandle = (HookType.MouseLowLevel, _mouseDelegate, module, 0);

并测试从HookProc返回-1。但是当我这样做时,SendInput不会将我的输入发送到应用程序。 如果我从CallNextHookEx返回结果,SendInput可以正常工作,但鼠标点击会发送到旧版应用程序。

背景

我们有一个用特殊键盘控制的程序。当按键盘上的键时,它会发送一系列ESC和字母。然后程序根据鼠标放在屏幕上的内容执行操作。

我正在开发一个屏幕键盘,以便您可以在没有这个特殊键盘的情况下控制应用程序。用户使用鼠标选择屏幕键盘上的按钮。然后用户将鼠标指针移动到要将命令发送到的对象,然后再次单击。 但话虽如此,鼠标点击可能无法传递给程序,程序会在鼠标点击时执行另一项操作。

3 个答案:

答案 0 :(得分:2)

作为一种可能的方法,您可以使用简单的SendMessage将任何窗口消息直接发送到目标窗口。它可以与外部应用程序的窗口一起使用。 (但您需要找到目标窗口的句柄才能使用此功能)。通过这种方式,您也可以发送任何键盘和鼠标事件。

忽略鼠标事件更加困难。您需要子类化该窗口,即附加您自己的自定义窗口过程来过滤窗口消息。为此,您需要将DLL注入受控过程 整个任务非常复杂,它不是一个简单的代码片段,你可以复制粘贴。

答案 1 :(得分:0)

如果我理解了你的身份,那么你可以通过MouseClick事件上的代码发送SendKeys,或者使用System.Windows.Form.SendKeys - >发送({KeyBoardKey})

文档:http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx

答案 2 :(得分:0)

如果你的屏幕键盘应用程序是一个与遗留应用程序不同的进程,那么它应该相当容易。

在键盘应用中,您知道用户点击了哪个键。因此,您所要做的就是使用SendMessage()API将此信息传递给旧版应用程序。

你说物理键盘发送ESC和字母?因此,您需要某种键盘键查找表来命令序列。

此外,您还需要使用FindWindow()/ FindWindowEx()API获取遗留应用程序的HWND。我假设该应用程序将具有一个独特的自定义类名称,这应该使这很容易。

如何使用SendMessage()发送命令序列字符的详细信息:

Sending an application keystrokes with "SendMessage" (vb.net)