2011-04-28 55 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方法。

模式對話框會阻止您的應用程序中其他窗口中的用戶輸入,因此會在阻止的窗口之前自動移動。