为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

墨色风雨 2019-08-28 15:11:33

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

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

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


查看完整描述

3 回答

?
qq_遁去的一_1

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

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

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


查看完整回答
反对 回复 2019-08-28
?
慕森王

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


查看完整回答
反对 回复 2019-08-28
?
慕侠2389804

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

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

WM_KEYUP / WM_KEYDOWN是最常见的,有些应用程序只处理一个或另一个(通常是WM_KEYDOWN)。

WM_CHAR也很常见

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


查看完整回答
反对 回复 2019-08-28

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信