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

C++ 如何将我的窗口投影为前台的活动窗口,c++,windows,winapi,windows-7,mfc,C++,Windows,Winapi,Windows 7,Mfc,打开了一些窗口,我想从我的进程中再启动一个窗口(高优先级),用户必须在其中输入凭据。我想把这个凭证窗口放到前台,反过来它可能会给用户带来良好的体验,因为他不需要手动选择凭证窗口。这是一次发布,绝对不烦人,但用户必须输入creds 实现这一目标的最佳方式是什么?我认为模拟鼠标点击不是个好主意。有没有办法将消息发送到其他窗口以使其失去焦点?因此,当我启动窗口时,它将出现在前台。您需要使用wndTopMost参数调用,以将您的窗口设置为所有其他窗口的顶部。这对我来说很有效,而无需使用SetWindow

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


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

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

这对我来说很有效,而无需使用
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();
}
我在聊天应用程序中使用它,以便新的聊天信息可以窃取焦点(显然是可选的,因为有些用户不喜欢这样。)

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

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