0

在我的 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)可以再次工作?我希望我可以单击主窗口的标题栏,这会使它恢复正常,但这不起作用(因为显然我的程序缺少一些额外的逻辑)。

4

2 回答 2

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);
}
于 2015-07-22T18:01:41.627 回答
0
case WM_KEYDOWN:
    SetFocus(Parent_Hwnd);
    return SendMessage(Parent_Hwnd,WM_KEYDOWN,wParam,lParam);
于 2015-10-15T10:31:51.167 回答