找到一个窗口并设置焦点

时间:2010-01-18 13:47:20

标签: mfc visual-c++

1.我想找一个窗口并设置焦点,但窗口没有聚焦。

2.如果我使用HWND_TOP,那么它不会激活窗口,如果我使用HWND_TOPMOST,那么它会使窗口始终位于顶部。

任何人都可以帮助我吗?

HWND hwndAppDlg = ::FindWindowEx(hwndDesktop,NULL,lpszClass,lpszWindow);

    if(hwndAppDlg && IsWindow(hwndAppDlg))
    {
        CRect rcAppDlg;
        if( 0 == ::GetWindowRect(hwndAppDlg,rcAppDlg))
        {
            OutputDebugString(L"\n GetWindowRect failed...");           
            return FALSE;
        }
        if(0 == ::SetWindowPos(hwndAppDlg,HWND_TOPMOST,rcAppDlg.left,rcAppDlg.top,rcAppDlg.Width(),rcAppDlg.Height(),SWP_SHOWWINDOW))
        {
            OutputDebugString(L"\n SetWindowPos failed...");            
            return FALSE;
        }
        if(0 == ::PostMessage(hwndAppDlg,WM_SETFOCUS,0,0))
        {
            OutputDebugString(L"\n WM_SETFOCUS failed");        
            return FALSE;
        }

        return TRUE;
    }

3 个答案:

答案 0 :(得分:5)

您正在发送WM_SETFOCUS,但这不会设置焦点。如果该消息获得或失去焦点,则将该消息发送给控件,但是当发送/接收该消息时,焦点更改已经发生。

要实际设置焦点(您不需要发送WM_SETFOCUS消息),如果您知道对话框中的哪个控件应该获得焦点,请使用SetFocus(),或SetForegroundWindow()将焦点设置到对话框本身,让对话框确定哪个子控件实际上将获得焦点。 这两个API都会自动发送WM_SETFOCUS。

答案 1 :(得分:2)

ShowWindow(hwndAppDlg,SW_SHOW);

答案 2 :(得分:0)

我已经使用::SetForegroundWindow(hwndAppDlg)激活并将焦点设置在对话框上并且效果很好。