将快速文本输入发送到另一个进程(窗口)
Posted
技术标签:
【中文标题】将快速文本输入发送到另一个进程(窗口)【英文标题】:Send fast textinput to another process (Window) 【发布时间】:2011-09-24 22:06:11 【问题描述】:我正在编写一个 C# WPF 程序,它将文本消息发送到另一个程序的窗口。我有一个宏程序作为我的键盘驱动程序(Logitech g15)的一部分,它已经这样做了,尽管它不会直接将击键发送到进程,而是发送到当前聚焦的窗口。它运作良好,但我也需要能够从我的程序发送输入。还有其他人在使用该过程,因此来自我的程序的输入文本消息需要足够快,以便我的文本不会干扰他们的输入。 问题是,当我尝试使用 c# 程序执行此操作时,我得到了太多延迟。宏程序 (Logitech G-Series Profiler) 立即发送命令。我尝试了以下三个命令来发送消息以进行处理。 (按从慢到快的顺序排列)
SetForegroundWindow(_hWnd);
SendKeys.SendWait("EnterThis is a keystroke input.Enter");
它可能是在名称中,但是它执行命令的速度很慢,以至于我实际上可以用眼睛跟随文本,因为它是一个字母一个字母地输入的。我曾尝试使用“SendKeys.Send”方法,但收到一条错误消息:“SendKeys 无法在此应用程序中运行,因为该应用程序未处理 Windows 消息。”
PostMessage((IntPtr)_hWnd, (uint)WMessages.WM_KEYUP, (int)key, (int)key);
PostMessage 有点快,但对于我的程序而言仍然不够快。此外,该方法在进程读取消息之前返回,这意味着两个连续的 PostMessage 调用可能不会发送连续的消息。
SendMessage(_hWnd, 0x100, (int) VKeys.VK_2, (int) VKeys.VK_2);
这比 PostMessage 快,但不如罗技的宏程序快。此外,接收程序对输入的处理方式也很奇怪,显然与处理键盘“真正”输入的方式不同。
SetForegroundWindow(_hWnd);
const string text = "This is a keystroke input.";
IInputElement target = Keyboard.FocusedElement;
IInputElement target = InputManager.Current.PrimaryKeyboardDevice.FocusedElement;
var routedEvent = TextCompositionManager.TextInputEvent;
target.RaiseEvent(new TextCompositionEventArgs(InputManager.Current.PrimaryKeyboardDevice, new TextComposition(InputManager.Current, target, text)) RoutedEvent = routedEvent );
这是我尝试的最后一件事。文本发送到进程的方式似乎是即时的。但是,我只能将它发送到我自己的程序,因为当我将另一个程序设置为前景窗口时,Keyboard.FocusedElement 返回 null。 如果有人能告诉我如何获取另一个窗口的 IInputElement,我肯定想知道。或者,如果有人对发送输入的更好方法提出建议,我非常想听听。
规格:Windows 7、64 位 Visual Studio 2010,框架 4
【问题讨论】:
【参考方案1】:首先,您是否有意在SendMessage
示例中使用WM_KEYDOWN (0x0100)
而不是WM_KEYUP (0x0101)
?这只会按下按键,永远不会释放它们,因此应用程序将无法正确处理它们。
另一种值得尝试的方法是发送WM_SETTEXT,假设控件正确解释它(如编辑控件或组合框)。
最后一个选项是使用SendInput,它在非常低的级别上合成键盘和鼠标输入,但与键盘的宏程序类似,这需要您激活正确的窗口并设置焦点,这可以痛苦。
【讨论】:
谢谢。我搜索 SendInput 并找到了这个:“inputsimulator.codeplex.com”这确实成功了。【参考方案2】:根据您其他人的程序窗口类型,您可以使用UI Automation。在此处查看此示例:
Add Content to a Text Box Using UI Automation
【讨论】:
以上是关于将快速文本输入发送到另一个进程(窗口)的主要内容,如果未能解决你的问题,请参考以下文章
mfc中,怎么把一个窗口的编辑框内容调用到另一个窗口的控件里