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;
}
答案 0 :(得分:5)
您正在发送WM_SETFOCUS,但这不会设置焦点。如果该消息获得或失去焦点,则将该消息发送给控件,但是当发送/接收该消息时,焦点更改已经发生。
要实际设置焦点(您不需要发送WM_SETFOCUS消息),如果您知道对话框中的哪个控件应该获得焦点,请使用SetFocus(),或SetForegroundWindow()将焦点设置到对话框本身,让对话框确定哪个子控件实际上将获得焦点。 这两个API都会自动发送WM_SETFOCUS。
答案 1 :(得分:2)
ShowWindow(hwndAppDlg,SW_SHOW);
答案 2 :(得分:0)
我已经使用::SetForegroundWindow(hwndAppDlg)
激活并将焦点设置在对话框上并且效果很好。