Win32: C++: как переориентироваться на родительское окно после щелчка в дочернем окне?

В моей программе Win32 CPP я определил некоторое дочернее окно для отображения различных текстовых строк, используя что-то вроде:

hnd_to_this_ch_window = CreateWindow( 
                        L"EDIT",L"Some initial text", WS_VISIBLE | WS_CHILD | ES_LEFT,  
                        position_of_this_window_X,              
                        position_of_this_window_Y,
                        TEXTOUT_DEFAULT_WIDTH,          
                        TEXTOUT_DEFAULT_HEIGHT, 
                        handle_to_my_parent_window, NULL,                        
                        hinstance_variable_used_by_create_window, 
                        NULL )

Моя проблема в том, что если я щелкаю мышью, чтобы выделить текст в одном из таких дочерних окон (скажем, скопировать его куда-нибудь), фокус приложения переходит к этому дочернему окну, и поэтому любые нажатия клавиш, которые раньше обрабатывались мои главные окна CALLBACK (в случае WM_KEYDOWN:) теперь захвачены в дочернее окно, где они отображаются как введенные символы. Какую магическую функцию я вызываю, чтобы фокус снова вернулся к родителю (чтобы мой WM_KEYDOWN) мог снова работать? Я надеялся, что смогу просто щелкнуть строку заголовка главного окна, и это вернет ее в нормальное состояние, но это не работает (потому что, очевидно, в моей программе отсутствует какая-то дополнительная логика).

2 ответа

Решение

Обрабатывать WM_KILLFOCUS сообщение в окне процедуры окна, которое вы хотите сфокусировать, и восстановить фокус, используя SetFocus функция. Если вы хотите сфокусировать окно, то оно было нажато, обработайте WM_LBUTTONDOWN сообщение.

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    // Restore the focus when it was lost.
    if (Msg == WM_KILLFOCUS) {
        SetFocus(hWnd);
        // Msg was handled, return zero.
        return 0;
    }
    // Or when the window is clicked.
    if (Msg == WM_LBUTTONDOWN) {
        SetFocus(hWnd);
        // Msg was handled, return zero.
        return 0;
    }
    return DefWindowProc(hWnd, Msg, wParam, lParam);
}
case WM_KEYDOWN:
    SetFocus(Parent_Hwnd);
    return SendMessage(Parent_Hwnd,WM_KEYDOWN,wParam,lParam);
Другие вопросы по тегам