如何使用Windows API将键击发送到窗口而不必激活它?

Sli*_*all 26 winapi keystroke sendmessage sendkeys

    我已经创建了一个应用程序,它将命令发送到激活的窗口.我希望能够在我的进程运行时使用计算机,因为只要我将焦点切换到另一个窗口,通过发送键发送的击键将转到我刚切换到的窗口.

    目前我使用Windows API中的FindWindow,IsIconic和ShowWindow.我必须检查窗口是否有FindWindow,并将我的对象设置为该调用返回的特定窗口,然后检查是否使用IsIconic最小化并调用ShowWindow,如果是,最后我必须调用Interaction.AppActivate将焦点设置到该窗口.所有这一切都在我发送击键之前完成.似乎应该有一种方法来发送击键而不必显示窗口并激活它.最重要的是,当我的应用程序运行按键时,我无法在计算机上执行任何操作.

Kev*_*ose 31

好吧,我确信这有点令人失望,但你从根本上不能 100%可靠地做到这一点.

Windows假定活动窗口是获取键盘输入的窗口.伪造键盘输入的正确方法是使用SendInput,您会注意到它只向活动窗口发送消息.

话虽这么说,你可以发送SendMessage WM_KEYUP,WM_CHARWM_KEYDOWN消息(取决于接收它们的WndProc)可能会侥幸逃脱.但请记住,它在某些情况下破裂.


Ant*_*ler 7

一旦你有了Windows HWND,你可以直接SendMessage()将WM_KEYDOWN和WM_KEYUP消息发送到它的消息队列。该窗口不必处于活动状态。

但是,请理解这取决于目标应用程序处理键盘输入的方式。有几种不同的方法可以处理它。

WM_KEYUP/WM_KEYDOWN 最常见,某些应用程序仅处理其中之一(通常是 WM_KEYDOWN)。

WM_CHAR 也相当常见

某些程序使用 GetAsyncKeyState、GetKeyState 或 GetKeyboardState。这是极其不寻常的,但可以有效地防止使用 SendMessage() 进行按键注入。如果是这种情况,则回退到由键盘驱动程序直接处理的 keybd_event() 。当然,窗口必须处于活动状态


Rem*_*eau 6

听起来像是在使用keybd_event()或SendInput(),它们都会将键击发送到当前活动的窗口.要将击键定向到特定窗口,无论该widnow是否被聚焦,您都需要先找到它的HWND句柄,然后将适当格式化的WM_KEYUP/DOWN和WM_CHAR消息直接发布到它.