2009-08-23 9 views
0

Je suis en cours d'exécution d'un hook global qui surveille une certaine fenêtre et se ferme ensuite avec PostMessage(hWnd,WM_CLOSE,0,0); La DLL contenant le crochet:Crochet Win32 WH_CBT - fermer la fenêtre avant sa création

LRESULT CALLBACK MyFunc(int code, WPARAM wParam, LPARAM lParam) 
{  
    switch(code) 
    { 
    case HCBT_CREATEWND: 
     { 
      HWND hWnd = (HWND)wParam; 
      //GetWindowText(hWnd, wintext, 80) returns nothing 
      //if (strcmp(wintext, ("Kaspersky Internet Security: license notification")) == 0) 
      //   {  
      //   Beep(70,100); 
      //   PostMessage(hWnd,WM_CLOSE,0,0); 
      //   } 


      break; 

     } 
    case HCBT_ACTIVATE: 
     { 

      HWND hWnd = (HWND)wParam; 
      GetWindowText(hWnd, wintext, 80); 

      if (strcmp(wintext, ("Kaspersky Internet Security: license notification")) == 0) 
      {  
       Beep(70,100); 
       PostMessage(hWnd,WM_CLOSE,0,0); 
      } 
      break;  

     } 
    } 

... 

Comme vous pouvez voir que j'utilise GetWindowText(hWnd, wintext, 80) pour déterminer par titre de fenêtre si la fenêtre actuellement activée est celle à fermer. Je suis fermant la fenêtre quand elle est activée et non quand elle est créée. Je voudrais fermer la fenêtre lors de sa création, c'est-à-dire HCBT_CREATEWND est vrai.

La chose est que je ne peux pas utiliser GetWindowText(hWnd, wintext, 80) pour obtenir le titre de la fenêtre et déterminer ainsi si la fenêtre doit être fermée parce que quand HCBT_CREATEWND est appelée la fenêtre n'a pas été fully created et n'a pas de titre, GetWindowText(hWnd, wintext, 80) ne renvoie rien.

Pour résumer ma question: est-il possible d'obtenir le titre de la fenêtre ou de toute autre manière déterminer quel type de fenêtre c'est, quand HCBT_CREATEWND est vrai?

Répondre

2

Pourriez-vous essayer GetClassName au lieu de lire le texte de la fenêtre?

Il est probablement plus fiable de lire le texte de la fenêtre (internationalisation). Un moyen facile de découvrir le nom d'une classe de fenêtre est d'utiliser l'utilitaire spy ++ - un tutoriel pratique est décrit here.

0

La fenêtre n'est pas encore créée. Ce qui signifie que vous ne pourrez pas appeler :: GetWindowText(). Au lieu de cela, utilisez lParam comme LPCBT_CREATEWND. Cela vous donne accès à la CREATESTRUCT via un pointeur. Vous pouvez utiliser lpszName pour accéder au nom de la fenêtre.

Quelque chose comme ça -

CBTProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    switch(nCode) 
    { 
    case HCBT_CREATEWND: 
     { 
      LPCBT_CREATEWND lpCreate = (LPCBT_CREATEWND)lParam; 
      lpCreate->lpcs->lpszName; // this is the name 
      break; 
     } 
    } 
} 
Questions connexes