gpt4 book ai didi

c# - 将快速文本输入发送到另一个进程(窗口)

转载 作者:行者123 更新时间:2023-11-30 17:16:04 28 4
gpt4 key购买 nike

我正在编写一个 C# WPF 程序,它将文本消息发送到另一个程序的窗口。我有一个宏程序作为我的键盘驱动程序 (Logitech g15) 的一部分,它已经这样做了,尽管它不会将击键直接发送到进程,而是发送到当前聚焦的窗口。它运行良好,但我也需要能够从我的程序发送输入。还有其他人在使用这个过程,所以我程序的输入文本消息需要足够快,这样我的文本才不会干扰他们的输入。问题是,当我尝试使用 c# 程序执行此操作时,我会延迟太多。宏程序 (Logitech G-Series Profiler) 立即发送命令。我尝试了以下三个命令来发送要处理的消息。 (按从慢到快的顺序列出)

SetForegroundWindow(_hWnd);
SendKeys.SendWait("{Enter}This 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 快,但不如 Logitech 的宏程序快。此外,接收程序处理输入的方式很奇怪,显然与处理键盘“真正”输入的方式不同。

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

最佳答案

首先,您是否有意在 SendMessage 示例中使用 WM_KEYDOWN (0x0100) 而不是 WM_KEYUP (0x0101)?这只会按下按键,永远不会释放它们,因此应用程序无法正确处理它们。

另一种值得尝试的方法是发送 WM_SETTEXT ,假设控件正确解释它(如编辑控件或组合框)。

最后一个选择是使用 SendInput它在非常低的水平上合成键盘和鼠标输入,但与键盘的宏程序类似,这需要您激活正确的窗口并设置焦点,这可能会非常痛苦。

关于c# - 将快速文本输入发送到另一个进程(窗口),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7542226/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com