Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 忽略鼠标单击并将键盘输入发送到外部应用程序_C#_Winapi_Hook_Uikeyboard_Keyboard Hook - Fatal编程技术网

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

C# 忽略鼠标单击并将键盘输入发送到外部应用程序,c#,winapi,hook,uikeyboard,keyboard-hook,C#,Winapi,Hook,Uikeyboard,Keyboard Hook,如何在旧程序中单击鼠标时模拟击键。注意!程序可能不知道单击了鼠标 我正在试验 IntPtr module = LoadLibrary("user32.dll"); _mouseHookHandle = (HookType.MouseLowLevel, _mouseDelegate, module, 0); 并测试从HookProc返回-1。但是当我这样做时,SendInput不会将我的输入发送到应用程序。 如果我从CallNextHookEx返回结果,SendInput起作用,但随后鼠标单

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

我正在试验

 IntPtr module = LoadLibrary("user32.dll");
 _mouseHookHandle = (HookType.MouseLowLevel, _mouseDelegate, module, 0);
并测试从
HookProc
返回-1。但是当我这样做时,
SendInput
不会将我的输入发送到应用程序。 如果我从
CallNextHookEx
返回结果,
SendInput
起作用,但随后鼠标单击会被发送到旧版应用程序,以进行更新

背景

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

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

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

忽略鼠标事件更加困难。您需要对该窗口进行子类化,即附加您自己的自定义窗口过程以过滤窗口消息。要实现这一点,您需要将DLL注入受控进程。

整个任务相当复杂,它不是一个简单的代码片段,您可以复制粘贴。

如果我理解您的意思,那么您可以通过鼠标单击事件上的代码或使用System.Windows.Form.SendKeys->Send({KeyBoardKey})的脚本发送密钥


文档:

如果您的屏幕键盘应用程序是传统应用程序的一个独立进程,那么它应该相当容易

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

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

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

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


我正在使用发送输入。但这不是问题所在。问题是在忽略通过低级鼠标挂钩接收到的鼠标单击后发送输入。您需要pinvoke GetForegroundWindow+GetWindowThreadProcessId来找出哪个进程具有焦点。我通过创建一个透明窗口并将其置于屏幕上解决了这一问题。它负责鼠标点击,然后我将SendMessage发送到鼠标下的窗口