我有一个有点hackish实用程序,使用SendInput()
向窗口发送击键。这很好,但是,目标窗口需要是前台窗口,因此在发送任何内容之前,该实用程序需要调用SetForegroundWindow()
。从用户的角度来看,这很烦人,因为目标窗口闪烁到顶部(即使实用程序立即切换回最近的活动窗口,以便用户可以继续工作)。
有没有办法在不改变z顺序的情况下聚焦窗口?我意识到这不是一个常见的用例,因为在正常情况下,如果用户有一个活动的后台窗口,他们甚至可能看不到他们正在键入的内容,这将是非常令人沮丧的。我尝试将SetFocus()
和SetWindowPos()
与SWP_NOZORDER
同时使用,但它们都没有实际激活窗口。
请注意,我尝试激活的窗口不属于调用线程。另请注意,我无法使用SendMessage()
,因为键击是CTRL+NUMPAD3
组合,目标窗口不会对单独的WM_KEYDOWN
/ WM_KEYUP
事件作出反应,我&# 39;我试过了。我试图在Windows 7上使用它可能是相关的。
到目前为止我的代码是:
HWND h_target = FindWindow(...);
INPUT p_input[2] = {0};
p_input[0].type = INPUT_KEYBOARD;
p_input[0].ki.wVk = VK_CONTROL;
p_input[1].type = INPUT_KEYBOARD;
p_input[1].ki.wVk = VK_NUMPAD3;
// prepare input
HWND h_act = GetForegroundWindow();
// remember this
SetForegroundWindow(h_target); // works
//SetWindowPos(h_target, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // does not work
// activate the target window first
SendInput(2, p_input, sizeof(INPUT));
// send the keystrokes
p_input[0].ki.dwFlags |= KEYEVENTF_KEYUP;
p_input[1].ki.dwFlags |= KEYEVENTF_KEYUP;
SendInput(2, p_input, sizeof(INPUT));
// don't forget to release the keys
SetForegroundWindow(h_act);
// put the active window back