在不改变z顺序的情况下聚焦窗口

时间:2014-07-15 18:53:30

标签: c winforms winapi

我有一个有点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

0 个答案:

没有答案