2009-08-03 150 views
18
 

     我已经提出的申请已经将命令发送到激活的窗口。我希望能够在我的进程正在运行时使用计算机,因为只要我将焦点切换到另一个窗口,通过发送键发送的击键就会转到我刚切换到的窗口。如何将按键发送到窗口而无需使用Windows API激活它?

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

+0

你在使用什么操作系统? – 2009-08-03 11:38:24

回答

24

好吧,这是一种令人失望的我敢肯定,但你根本无法做到这一点 100%可靠。

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

话虽这么说,你可以SendMessageWM_KEYUPWM_CHARWM_KEYDOWN消息和(取决于接收的WndProc他们)可能逃脱它。但请记住,在某些情况下,它的going to break期间。

6

听起来你正在使用keybd_event()或SendInput(),这两者发送键击当前活动窗口。要将键击指向特定的窗口,无论该窗口是否为焦点,您需要先找到它的HWND句柄,然后将适当格式化的WM_KEYUP/DOWN和WM_CHAR消息直接发送给它。

0

一旦你的窗口HWND,你可以直接SendMessage函数()的WM_KEYDOWN和WM_KEYUP消息发送到其消息队列。该窗口不必是活动的。

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

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

WM_CHAR也相当普遍

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