В моей программе 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) мог снова работать? Я надеялся, что смогу просто щелкнуть строку заголовка главного окна, и это вернет ее в нормальное состояние, но это не работает (потому что, очевидно, моей программе не хватает какой-то дополнительной логики).
Обрабатывать 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);