2010-11-17 181 views
2

我登記我的類在下面的方法:BringWindowToTop甚至沒有工作

BOOL CNDSClientDlg::InitInstance() 
{ 
    //Register Window Updated on 16th Nov 2010, @Subhen 
    // Register our unique class name that we wish to use 
    WNDCLASS wndcls; 
    memset(&wndcls, 0, sizeof(WNDCLASS)); 

    wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; 
    wndcls.lpfnWndProc = ::DefWindowProc; 
    wndcls.hInstance = AfxGetInstanceHandle(); 
    wndcls.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
    wndcls.lpszMenuName = NULL; 

    //Class name for using FindWindow later 
    wndcls.lpszClassName = _T("CNDSClientDlg"); 
    // Register new class and exit if it fails 

    if(!AfxRegisterClass(&wndcls)) // [C] 

    { 
     return FALSE; 
    } 
} 

,然後調用的InitInstance方法和類的構造函數創建窗口:

CNDSClientDlg::CNDSClientDlg(CWnd* pParent /*=NULL*/) 
    : CDialog(CNDSClientDlg::IDD, pParent) 

{ 
InitInstance(); 

    HWND hWnd; 
    hInst = AfxGetInstanceHandle(); // Store instance handle in our global variable 
    hWnd = CreateWindow(_T("CNDSClientDlg"), "NDS", WS_OVERLAPPEDWINDOW, 
         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL); 


} 

現在在我的其他應用程序我發現窗口,並試圖把頂部:

編輯 能帶來newlyCreated窗戶用下面的代碼

CWnd *pWndPrev = NULL; 
        CWnd *FirstChildhWnd = NULL; 
        pWndPrev = CWnd::FindWindow(_T("CNDSClientDlg"),NULL); 
        if(pWndPrev != NULL) 
        { 
         //pWndPrev->BringWindowToTop(); 
         WINDOWPLACEMENT wndplacement; 
         pWndPrev->GetWindowPlacement(&wndplacement); 
         wndplacement.showCmd = SW_RESTORE; 
         pWndPrev->SetWindowPlacement(&wndplacement); 
         pWndPrev->SetForegroundWindow(); 

         FirstChildhWnd = pWndPrev->GetLastActivePopup(); 
         if (pWndPrev != FirstChildhWnd) 
         { 
          // a pop-up window is active, bring it to the top too 
          FirstChildhWnd->GetWindowPlacement(&wndplacement); 
          wndplacement.showCmd = SW_RESTORE; 
          FirstChildhWnd->SetWindowPlacement(&wndplacement); 
          FirstChildhWnd->SetForegroundWindow(); 
         } 

我能找到窗口pWndPrev不爲空,但它不是把我的應用程序前。我需要註冊任何其他類而不是CNDSClientDlg。我想把我的MFC應用程序置頂。

回答

11

有幾件事情來看待......

1)儘量SetForegroundWindow()而不是BringWindowToTop()。我已經完成了Win32編程已經有一段時間了,但我似乎記得BringWindowToTop()有一些限制(特別是在不同進程中使用Windows時)。

2)微軟對從Windows 2000開始的SetForegroundWindow()有一些規定。簡短的版本是隻有最前面的應用程序可以改變前景窗口。這個想法是,一個不是最前面的應用程序不能「跳到」活動應用程序的前面。如果後臺應用程序調用SetForegroundWindow(),則Windows將刷新該應用程序的任務欄按鈕,但實際上不會將該應用程序放在前面。用戶必須這樣做。我簡化了規則,但根據具體情況,這可能是需要考慮的事情。

6
+0

@cbranch,@FrédéricHamidi,感謝這是Workinng。但是這會產生一個新的空白窗口,而不是我的跑窗。我認爲這是因爲創建窗口。我需要顯示我的應用程序不是新窗口 – Simsons 2010-11-17 07:25:54

+0

@Subhen,你的意思是你在其他應用程序中創建了一個具有相同類名的窗口? – 2010-11-17 07:28:48

+0

我不太確定什麼是相同的類名。但是,我的MFC應用程序中有多個類(對話框),我正在使用其中的一個,CNDSClientDlg – Simsons 2010-11-17 07:32:05

2

在調用SetForegroundWindow之前,您可能需要在「其他」應用程序中調用AllowSetForegroundWindow

這是假設你的其他應用程序是前臺應用程序,並試圖通過窗口將其前臺狀態傳遞給應用程序。

如果這兩個應用程序都不是前臺應用程序,那麼你不是假設能夠爲前面帶來一個窗口,雖然有辦法(無意和故意)。

0
SetWindowPos(&wndTopMost, -1, -1, -1, -1, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); 
SetForegroundWindow(); 
+0

請詳細解答這個問題。 – 2012-09-18 14:34:11

+0

你能解釋一下這個答案如何解決OP的問題,這樣我們都可以從中學習嗎?現在它看起來像一個神奇的咒語。 – 2012-09-21 17:37:21

相關問題