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

时间:2011-04-28 06:28:44

标签: c++ windows winapi windows-7 mfc

打开了一些窗口,从我的流程开始,我想再启动一个窗口(高优先级),用户必须输入凭据。我想将此凭据窗口置于前台,反过来,它可能为用户提供良好的体验,因为他不需要手动选择凭据窗口。这是一次发布,绝对不是烦人的,但用户输入信用是强制性的。

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

3 个答案:

答案 0 :(得分:2)

这对我有用,而无需使用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();
}

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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