Уведомлять 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) .