2009-02-10 22 views
2

我有一段代码,它使用SetForegroundWindow API for WinXP将光标下的窗口置于前台。我一直在测试它的Vista,但API似乎不再正确地完成这项工作。如何在Vista中使用C++将窗口置于前台?

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

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

回答

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); 
+0

这会为我 - 是只有一件事(使用MINIMIZE调用ShowWindow,然后使用带有RESTORE的ShowWindow),它使窗口处于前面。其他尝试,包括SetForegroundWindow和BringWindowToFront Just-Dont-Work,但是This-Approach-Does。 – 2012-02-16 05:49:55

+0

你输入“OR”这个词......是为了避免noobs复制面食? – 2015-03-04 02:31:36

1

如果SetForegroundWindow()失败,你尝试过,然后调用SetForegroundWindow()后非顶最右边的设置窗口WS_EX_TOPMOST和?

这可能与人们正确地抱怨应用程序在你最不期待的时候出现在应用程序中。

0
VOID SwitchToThisWindow(HWND hWnd, BOOL fAltTab); 

工程在XP到Windows 7 http://msdn.microsoft.com/en-us/library/ms633553.aspx

+0

不幸的是“[此功能不适用于一般用途,可能会在后续版本的Windows中更改或无法使用。]”:( – 2012-02-16 05:46:31

2

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

现在窗口只是闪烁。

但这是有原因的。应用程序会从当前窗口“窃取”焦点(通常没有很好的理由),并可能导致所有类型的问题。

所以在试图规避操作系统对这种行为的保护之前,请确保您不会惹恼您的用户。问问自己:“即使我的应用程序在后台,我真的 - 真的必须跳到用户的脸上吗?”

1

如果使用MFC,这为我工作在Windows 7 64位系统:

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); 
-3

使用Windows PowerToys的TweakUI程序来改变许可状态的焦点。

选择“一般”,然后选择“焦点”,然后取消选中允许其他程序关注的框。

当每个人的建议似乎都不起作用时(这实际上都行),这是有效的。

微软在这个无限的智慧决定,从setforegrondwindow等调用响应等现在将为空。

他们没有打扰说tjat你仍然可以通过tweakui回到原来的!

享受.....

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); 
相关问题