如何将我的窗口投影为前台的活动窗口

Posted

技术标签:

【中文标题】如何将我的窗口投影为前台的活动窗口【英文标题】:how to project my window as active window on foreground 【发布时间】:2011-04-28 06:28:43 【问题描述】:

打开了一些窗口,我想从我的进程中再启动一个窗口(高优先级),用户必须在其中输入凭据。而且我想将此凭据窗口置于前台,反过来它可能会给用户带来良好的体验,因为他不需要手动选择凭据窗口。这是一次启动,绝对不烦人,但用户必须输入凭据。

实现这一目标的最佳方法是什么?我不认为模拟鼠标点击是个好主意。有没有办法将消息发送到其他窗口以失去焦点?这样当我启动窗口时,它就会出现在前台。

【问题讨论】:

【参考方案1】:

这对我有用,而无需使用 SetWindowPos 使窗口“始终位于顶部”:

HWND foreGround = GetForegroundWindow();
if (foreGround != m_hWnd)

    if (!::SetForegroundWindow(m_hWnd))
    
        if (!foreGround)
        
            foreGround = FindWindow(_T("Shell_TrayWnd"), NULL);
        

        DWORD idForeground = GetWindowThreadProcessId(foreGround, NULL);
        DWORD idTarget = GetWindowThreadProcessId(m_hWnd, NULL);

        AttachThreadInput(idForeground, idTarget, TRUE);

        ::SetForegroundWindow(m_hWnd);

        AttachThreadInput(idForeground, idTarget, FALSE);
    

    BringWindowToTop();

我在聊天应用程序中使用它,因此新的聊天消息可以抢占焦点(显然是可选的,因为有些用户不喜欢这个。)

【讨论】:

【参考方案2】:

您需要使用wndTopMost 参数调用SetWindowPos 以将您的窗口设置在所有其他窗口的顶部。

【讨论】:

【参考方案3】:

这种 UI 模式(输入强制值的窗口)通常称为 模态对话框。在 MFC 中,您将寻找 CDialog::DoModal。 IE。您从CDialog 派生您的凭据窗口,然后调用继承的DoModal 方法。

模态对话框会阻止用户在应用程序的其他窗口中输入,因此会自动移动到被阻止的窗口之前。

【讨论】:

以上是关于如何将我的窗口投影为前台的活动窗口的主要内容,如果未能解决你的问题,请参考以下文章

MFC:将焦点设置到子窗口时如何防止应用程序成为前台窗口

如何在 OS X 上将进程窗口置于前台?

如何知道前台窗口何时更改

MainWindowHandle 为 0 时将窗口置于前台

WPF 让窗口激活作为前台最上层窗口的方法

前景与活动窗口