OP 现在说他需要将输入发送到最小化的应用程序而不激活它们。这不可能以任何方式可靠地完成,即使使用专门的硬件也是如此。我从事自动化工作。这是不可能的。
实际上,将输入发送到最小化的应用程序是可能的,不确定鼠标输入,但键盘输入工作得很好。在以前的答案中考虑一下这是我能够完成的(代码在 Delphi 中,但它非常简单,因此您可以将其翻译成您需要的语言):
procedure SendKeys(const Win : HWND; const Key,sKey: Cardinal);
var
thrID : Cardinal;
KB : TKeyBoardState;
begin
if sKey <> 0 then
begin
thrID := GetWindowThreadProcessId(win,nil);
GetKeyboardState(KB);
AttachThreadInput(GetCurrentThreadID, thrID, True);
KB[sKey] := KB[sKey] or $80;
SetKeyboardState(KB);
end;
SendMessage(Win,WM_KEYDOWN,Key,0);
SendMessage(Win,WM_KEYUP,Key,0);
if sKey <> 0 then
begin
KB[sKey] := 0;
SetKeyBoardState(KB);
AttachThreadInput(GetCurrentThreadId, thrID, False);
end;
end;
[Win] 必须是接收输入的控件,而不是其父窗体等。 [Key] 是要按下的键;[sKey] 是在按下 [Key] 时按下的替代键,例如 CTRL/SHIFT(ALT 通过消息本身传输,有关详细信息,请参阅 MSDN WM_KEYDOWN 参考)。
发送一个单独的击键相当简单,您只需发送消息即可完成,但如果您需要 CTRL+SPACE 之类的东西,这里就变得复杂了。每个线程都有自己的 KeyboardState,在您自己的应用程序中更改 KeyboardState 不会影响另一个线程,除非您通过 AttachThreadInput 函数加入他们的线程输入。当应用程序处理 WM_KEYDOWN 消息时,它还通过调用 GetKeyboardState 函数(可以通过 WM_KEYDOWN 消息的附加参数发送 ALT 键)来测试当前的移位状态(CTRL/SHIFT),这就是附加线程输入发挥作用的时候。