我做了一个应用程序已经将命令发送到激活的窗口。 我希望能我的进程正在运行时使用电脑,因为一旦我将焦点切换到另一个窗口,通过发送键发送的击键会去我只是切换到窗口。
目前我使用FindWindow函数,IsIconic和的ShowWindow从Windows API。 我要检查,看看窗户是否有与FindWindow函数,并设置我的对象是与调用返回的特定的窗口,我再检查,如果它与IsIconic最小化,并调用的ShowWindow如果是,最后我不得不打电话Interaction.AppActivate将焦点设置到该窗口。 所有这一切之前,我甚至发击键完成。 好像应该有办法只发送击键而无需显示窗口并激活它。 最重要的事情是,而我的应用程序运行的击键,我不能在我的电脑上做任何事情。
好吧,这是一种令人失望的我敢肯定,但你根本无法与100%的可靠性做到这一点 。
Windows假定活动窗口是一个获取键盘输入。 假键盘输入正确的方法是用SendInput ,你会发现,它会向只有活动窗口。
话虽这么说,你可以SendMessage函数 WM_KEYUP , WM_CHAR和WM_KEYDOWN消息和(取决于接收的WndProc他们)可能逃脱它。 但要记住,它要打破在某些情况下,期。
听起来你正在使用keybd_event()或SendInput(),这两者发送键击当前活动窗口。 直接按键到一个特定的窗口,无论是widnow是否集中与否,你需要找到它的HWND处理,然后再上传格式正确WM_KEYUP / DOWN和WM_CHAR消息直接给它。
一旦你的窗口HWND,你可以直接SendMessage函数()的WM_KEYDOWN和WM_KEYUP消息发送到其消息队列。 该窗口没有被激活。
但是,明白这取决于目标应用程序如何处理键盘输入。 有几种不同的方式来处理它。
WM_KEYUP / WM_KEYDOWN是最常见的和一些应用程序仅处理一个或另一个(通常是WM_KEYDOWN)。
WM_CHAR也相当普遍
某些程序使用GetAsyncKeyState,函数GetKeyState,或GetKeyboardState。 这是极不寻常,但有效防止按键注射的SendMessage()。 如果是这样的话回落到keybd_event(),它是直接由键盘驱动程序处理。 当然,窗口将被激活
文章来源: How do I send key strokes to a window without having to activate it using Windows API?