2010-01-18 42 views
0

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; 
    } 

回答

4

您正在發送WM_SETFOCUS,但沒有設置焦點。如果消息獲得或失去焦點,則該消息被髮送到控件,但是當該消息被髮送/接收時,焦點變化已經發生。要實際設置焦點(不需要發送WM_SETFOCUS消息),請使用SetFocus()(如果您知道對話框中的哪個控件應獲得焦點),或者使用SetForegroundWindow()將焦點設置爲對話框本身並讓對話確定哪個子控件實際上將獲得焦點。 這兩個API都會自動發送WM_SETFOCUS。

1

ShowWindow(hwndAppDlg,SW_SHOW);

+0

它甚至沒有激活對話框。 – Ashish 2010-01-18 13:56:52

0

我已經使用::SetForegroundWindow(hwndAppDlg)來激活和設置對話框的焦點,它很酷。