2011-02-17 66 views
0

我有一個基於對話框的MFC工具,當我點擊它時,應該顯示另一個應用程序窗口的標題。 我的問題是WM_KILLFOCUS在這裏不起作用。也許我做錯了。 我做了以下幾件事:當選擇另一個窗口時通知CDialog窗口

BEGIN_MESSAGE_MAP(CMyDlg, CDialog) 
    ON_WM_KILLFOCUS() 
END_MESSAGE_MAP() 

... 
... 

void CMyDlg::OnKillFocus(CWnd* pNewWnd) 
{ 
    CDialog::OnKillFocus(pNewWnd); 
    if(m_bSelectorModeActive) 
    { 
     HWND hwnd(GetForegroundWindow()); 
     TCHAR buf[512]; 
     ::GetWindowText(hwnd, buf, 512); 
     MessageBox(buf); 
    } 
} 

任何想法有什麼不對?

回答

0

這是我的猜想

更換HWND HWND(GetForegroundWindow());與GetActiveWindow(void)。

0

你所顯示的代碼甚至不應該編譯。由MFC提供的GetForegroundWindow函數不會返回HWND,因此您無法使用其返回值初始化hwnd變量。

如果你想獲得一個HWND,你需要逃避與::調用調用從Windows API GetForegroundWindow,就像你爲GetWindowText。所以,簡單地重寫代碼如下:

void CMyDlg::OnKillFocus(CWnd* pNewWnd) 
{ 
    CDialog::OnKillFocus(pNewWnd); 
    if(m_bSelectorModeActive) 
    { 
     HWND hwnd(::GetForegroundWindow()); 
     TCHAR buf[512]; 
     ::GetWindowText(hwnd, buf, 512); 
     MessageBox(buf); 
    } 
} 

除此之外,在看你的代碼,人們不禁要問,你似乎被忽略了面向對象的MFC這麼虛心試圖帶給Windows的API。你不需要直接使用窗口句柄。有人可能會爭辯說使用MFC的最有說服力的理由是它的CString類。你沒有理由再去處理一系列TCHAR了。我可能會這樣寫:

void CMyDlg::OnKillFocus(CWnd* pNewWnd) 
{ 
    CDialog::OnKillFocus(pNewWnd); 
    if(m_bSelectorModeActive) 
    { 
     CWnd* pForeWnd = GetForegroundWindow(); 
     CString windowText; 
     pForeWnd->GetWindowText(windowText); 
     MessageBox(windowText); 
    } 
} 
0

我解決了它,謝謝你的努力。

是的,我確實使用CStrings,這只是我做一些更復雜的事情的一個小例子。我的問題不是函數本身,而是事件WM_KILLFOCUS似乎沒有工作。 也許我在這裏不夠清楚,對不起。

WM_ACTIVATE做我需要的。當焦點被設置和/或丟失時,它會通知我的對話框。

+0

我很確定我的最後一個答案完全是基地外。我試着去看文檔,這並不總是最聰明的舉動。我實際上是在一個示例項目中嘗試過的,我已經相應地更新了我的答案。我現在展示的代碼工作得很好。唯一的問題是,如果你的對話框上有任何子控件,當用戶在它們之間切換時,你會得到很多「誤報」WM_KILLFOCUS消息。 – 2011-02-17 11:49:56