【问题标题】:Ignore mouse click and send keyboard Input to external application忽略鼠标点击并将键盘输入发送到外部应用程序
【发布时间】:2012-05-24 18:14:28
【问题描述】:

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

我正在尝试

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

并测试从HookProc 返回 -1。但是当我这样做时,SendInput 不会将我的输入发送到应用程序。 如果我从CallNextHookEx 返回结果,SendInput 有效,但随后鼠标点击被发送到遗留应用程序。

背景

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

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

【问题讨论】:

  • 你需要 pinvoke GetForegroundWindow + GetWindowThreadProcessId 来找出哪个进程有焦点。

标签: c# winapi hook uikeyboard keyboard-hook


【解决方案1】:

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

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

【讨论】:

  • 我通过创建一个放在屏幕上的透明窗口来解决它。它负责鼠标点击,然后我将 SendMessage 发送到鼠标下方的窗口
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

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

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

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

您还需要获取旧应用程序的 HWND,您可以使用 FindWindow()/FindWindowEx() API 来完成。我假设该应用程序将有一个独特的自定义类名,这应该会很容易。

此处详细介绍如何使用 SendMessage() 发送命令序列字符:

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

【讨论】:

    猜你喜欢
    • 2017-11-21
    • 2013-06-20
    • 2011-07-19
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多