2011-04-28 137 views
2

打开了一些窗口,并从我的过程中,我想要启动一个窗口(高优先级),其中用户必须输入凭证。我想把这个凭证窗口放到前台,反过来它可能给用户带来很好的体验,因为他不需要手动选择凭证窗口。这是一次启动,绝对不是烦人的,但用户输入信用是强制性的。如何在前台投影我的窗口为活动窗口

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

回答

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(); 
} 

我在一个聊天应用程序使用此所以新的聊天消息可以偷焦点(可选明显一些用户不喜欢这样)。

0

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

0

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

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