3

在遗留程序中单击鼠标时如何模拟击键。笔记!程序可能不知道鼠标被点击

我正在试验

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

并测试从HookProc. 但是当我这样做时,SendInput不要将我的输入发送到应用程序。如果我从中返回结果 CallNextHookExSendInput则可以工作,但是鼠标单击将发送到旧应用程序。

背景

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

我正在开发一个屏幕键盘,这样您就可以在没有这个特殊键盘的情况下控制应用程序。用户用鼠标选择屏幕键盘上的按钮。然后用户将鼠标指针移动到他想要向其发送突击队的对象,然后再次单击。但是就是说,鼠标点击可能不会传递给程序,程序在鼠标点击时执行另一个操作。

4

3 回答 3

2

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

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

于 2012-05-22T07:26:06.343 回答
0

如果我了解您的目标,那么您可以通过 MouseClick 事件上的代码或使用 System.Windows.Form.SendKeys -> Send({KeyBoardKey}) 的某些脚本来发送密钥

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

于 2012-05-23T14:53:43.913 回答
0

如果您的屏幕键盘应用程序是遗留应用程序的独立进程,那么它应该相当容易。

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

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

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

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

使用“SendMessage”(vb.net)发送应用程序击键

于 2012-05-27T11:40:31.663 回答