Уведомлять CDialog-Window при выборе другого окна

Я получил диалоговое окно MFC-Tool, которое должно отображать заголовок окна другого приложения в окне сообщения, когда я нажимаю на него. Моя проблема в том, что WM_KILLFOCUS здесь не работает. Возможно я делаю это неправильно. Я делаю следующее:

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

Есть идеи, что случилось?

3 ответа

Я решил это, спасибо за ваши усилия.

Да, я использую CStrings, это был всего лишь маленький пример более сложной вещи, которую я делаю. Моя проблема была не в самой функции, а в событии WM_KILLFOCUS, которое, похоже, не работало. Может быть, я не был достаточно ясен здесь, извините.

WM_ACTIVATE делает то, что мне нужно. Он уведомляет мой диалог, когда фокус установлен и / или потерян.

Код, который вы показали, не должен даже компилироваться. GetForegroundWindow Функция, предоставляемая MFC, не возвращает HWND, так что вы не можете инициализировать hwnd переменная, используя возвращаемое значение.

Если вы хотите получить HWNDнужно позвонить GetForegroundWindow из Windows API путем экранирования вызова с ::так же, как вы сделали для 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);
    }
}

Это мое предположение

Заменить HWND на hwnd(GetForegroundWindow()); с GetActiveWindow(void) .

Другие вопросы по тегам