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

0

Решение

Обрабатывать 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);
}
1

Другие решения

case WM_KEYDOWN:
SetFocus(Parent_Hwnd);
return SendMessage(Parent_Hwnd,WM_KEYDOWN,wParam,lParam);
-1