将输入发送到最小化窗口

本文关键字:最小化 窗口 输入 | 更新日期: 2023-09-27 17:57:58

是否可以在当前没有焦点的窗口上使用sendInput函数,或者通过使用多线程,同时向多个最小化的窗口发送输入,或者在处理另一个窗口时向一个窗口发送输入?

我想在c#中做这样的事情

提前谢谢。

将输入发送到最小化窗口

您只能使用SendInput将输入发送到具有键盘焦点的HWND。此外,窗口必须附加到调用线程的消息队列,因此也不能简单地SetFocus

您需要使用GetProcessIdOfThread获取窗口的线程id。

当您拥有线程id时,您可以使用AttachThreadInput函数将您的线程附加到其他线程的输入处理。

在所有这些之后,您可能可以使用SetFocusSendInput

您可能希望在发送输入后分离线程。

要访问这些方法,您必须使用C#或C++/CLI的p/Invoke。PInvoke.net作为参考非常方便。导入所有这些函数将是一件小家务,但当您完成后,您应该能够将输入发送到您想要的任何"窗口"。

顺便说一句,我不确定您是否知道这一点,但在纯Win32中,所有东西都被视为一个窗口,甚至是一个按钮。如果运气不好,您可能不得不将输入发送到属于记事本应用程序的文本控件的句柄。

SendInput不可能做到这一点。您可能想做的是找到操作系统在执行特定事件时发送到窗口的消息,然后模拟它们。您可以使用Spy++附加到目标窗口并执行您的事件。然后使用SendMessage()和PostMessage()来重现事件生成的消息。这适用于记事本。

如果您确实使用此方法,请注意,您需要将消息发送到记事本的子窗口,您可以使用类名为"edit"的FindWindowEx()找到该子窗口。例如,要键入文本,可以尝试WM_KEYDOWN。您应该注意,这种方法并不一定可靠:http://blogs.msdn.com/b/oldnewthing/archive/2005/05/30/423202.aspx