如何使用C ++将窗口带到Vista的前台?

时间:2009-02-10 21:17:09

标签: c++ winapi window

我有一段代码使用WinXP的SetForegroundWindow API将光标下的窗口带到前台。我一直在测试它的Vista,但API似乎不再正确地完成工作。

AllowSetForeground没有帮助,我的进程是后台进程。

我可以用什么来实现这个目标?

7 个答案:

答案 0 :(得分:7)

尝试以下代码,看看它是否适合您:

SetWindowPos(WndHandle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(WndHandle,HWND_NOTOPMOST,0,0,0,0,SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);

答案 1 :(得分:2)

只是一个警告:有一个公共API来做(SetForegroundWindow),现在它不再将窗口带到前台了。

现在窗口闪烁。

但这是有原因的。这样做的应用程序会从当前窗口“窃取”焦点(通常没有充分理由)并且可能导致各种问题。

因此,在尝试规避操作系统对此类行为的保护之前,请确保您不会惹恼您的用户。问问自己:“即使我的应用程序在后台,我真的必须跳到我的用户面前吗?”

答案 2 :(得分:1)

如果SetForegroundWindow()失败,您是否尝试过设置窗口WS_EX_TOPMOST,然后在致电SetForegroundWindow()后立即排在最右侧?

这可能与人们抱怨应用程序在您最不期望的时候弹出应用程序有关。

答案 3 :(得分:1)

如果使用MFC,这在Windows 7 x64中适用于我:

    RECT rc;
    m_pMainWnd->GetWindowRect(&rc);

    int nBoxWidth = rc.left-rc.right;
    int nBoxHeight = rc.bottom-rc.top;
    int nBoxTop = rc.top;
    int nBoxLeft = rc.left;

    SetWindowPos(m_pMainWnd->GetSafeHwnd(), HWND_TOPMOST,
                    nBoxLeft, nBoxTop, nBoxWidth, nBoxHeight,
                    SWP_NOMOVE || SWP_NOSIZE);
    SetWindowPos(m_pMainWnd->GetSafeHwnd(), HWND_NOTOPMOST,
                    nBoxLeft, nBoxTop, nBoxWidth, nBoxHeight,
                    SWP_SHOWWINDOW || SWP_NOMOVE || SWP_NOSIZE);

答案 4 :(得分:0)

VOID SwitchToThisWindow(HWND hWnd, BOOL fAltTab);

适用于XP到Windows 7 http://msdn.microsoft.com/en-us/library/ms633553.aspx

答案 5 :(得分:0)

设置当前线程是否为我做了,并将其设置为非最顶层之前:

OS.SetWindowPos(handle, OS.HWND_NOTOPMOST, 0, 0, 0, 0, OS.SWP_NOMOVE | OS.SWP_NOSIZE);
try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    LOG.error("sleeping thread was interrupted", e);
}
OS.SetWindowPos(handle, OS.HWND_TOPMOST, 0, 0, 0, 0, OS.SWP_NOMOVE | OS.SWP_NOSIZE);

答案 6 :(得分:-3)

使用windows powertoys tweakui程序来改变焦点的许可状态。

选择“general”然后“focus”,然后取消选中该框以允许其他程序获得焦点。

当每个人的建议似乎都不起作用时,这种方法就有效了(实际上他们都这样做了)。

微软在他们的无限智慧中决定调用setforegrondwindow等的响应现在将为空。

他们懒得说tjat你仍然可以通过tweakui回到原来!!!!

享受.....