Уведомлять CDialog-Window при выборе другого окна - PullRequest
0 голосов
/ 17 февраля 2011

Я получил диалоговое окно 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 ]

0 голосов
/ 17 февраля 2011

Код, который вы показали, не должен даже компилироваться. Функция 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 s. Я мог бы написать это вместо:

void CMyDlg::OnKillFocus( CWnd* pNewWnd )
{
    CDialog::OnKillFocus(pNewWnd);
    if(m_bSelectorModeActive)
    {
        CWnd* pForeWnd = GetForegroundWindow();
        CString windowText;
        pForeWnd->GetWindowText(windowText);
        MessageBox(windowText);
    }
}
0 голосов
/ 17 февраля 2011

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

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

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

0 голосов
/ 17 февраля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...