2010-01-18 7 views
0

1. Je souhaite trouver une fenêtre et définir le focus, mais la fenêtre n'est pas active.Recherche d'une fenêtre et réglage de la mise au point

2.Si j'utilise HWND_TOP alors il ne rend pas la fenêtre active et si j'utilise HWND_TOPMOST alors il rend la fenêtre toujours au-dessus.

Quelqu'un peut-il m'aider?

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

Répondre

4

Vous envoyez WM_SETFOCUS, mais cela ne définit pas le focus. Ce message est envoyé à un contrôle s'il a gagné ou perdu le focus, mais quand ce message est envoyé/reçu, le changement de focus est déjà arrivé. Pour définir le focus (vous n'avez pas besoin d'envoyer le message WM_SETFOCUS), utilisez SetFocus() si vous savez quel contrôle dans la boîte de dialogue doit obtenir le focus ou SetForegroundWindow() pour définir le focus sur la boîte de dialogue lui-même et laissez la boîte de dialogue déterminer quel sous-contrôle aura effectivement le focus. Ces deux API enverront automatiquement WM_SETFOCUS.

1

Que diriez-vous ShowWindow (hwndAppDlg, SW_SHOW);

+0

il n'active même pas le dialogue. – Ashish

0

J'ai utilisé ::SetForegroundWindow(hwndAppDlg) pour activer et régler le focus sur la boîte de dialogue et cela fonctionne cool.

Questions connexes