2009-08-23 4 views
0

저는 현재 특정 창을 감시하고 PostMessage(hWnd,WM_CLOSE,0,0); 후크 포함하는 DLL로를 닫 글로벌 후크 실행 : 당신이 할 수는 Win32 WH_CBT 훅 -가 생성되기 전에 창 닫기

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;  

     } 
    } 

... 

을 나는 현재 활성화 된 창이 닫히는 창이 있다면 윈도우 제목으로 결정하기 위해 GetWindowText(hWnd, wintext, 80)을 사용하고있다. 나는 창이 활성화 될 때 창을 닫고 창의 창을 닫을 때 을 닫습니다. HCBT_CREATEWND이 true 일 때 창을 닫을 때 닫고 싶습니다.

것은 내가 창 제목을 얻을 GetWindowText(hWnd, wintext, 80)를 사용 HCBT_CREATEWND가 호출 될 때 윈도우가 fully created을하고 아무 제목, GetWindowText(hWnd, wintext, 80) 반환 무관하지 않았기 때문에 창을 닫아야합니다 경우에 따라서 결정 할수 없어 것입니다.

제 질문을 요약하십시오 : HCBT_CREATEWND이 사실 일 때 창 제목을 얻거나 다른 방법으로 어떤 종류의 창인지를 결정할 수 있습니까?

답변

2

윈도우 텍스트를 읽는 대신 GetClassName을 사용해도 되겠습니까?

아마도 윈도우 텍스트 (국제화)를 읽는 것이 더 신뢰할 수 있습니다. 창 클래스 이름을 쉽게 찾을 수있는 방법은 spy ++ 유틸리티를 사용하는 것입니다. 편리한 튜토리얼은 here입니다.

0

창이 아직 생성되지 않았습니다. 즉, GetWindowText()를 호출 할 수 없습니다. 대신 lParam을 LPCBT_CREATEWND로 사용하십시오. 이렇게하면 포인터를 통해 CREATESTRUCT에 액세스 할 수 있습니다. lpszName을 사용하여 창 이름에 액세스 할 수 있습니다. 이 같은

뭔가 -

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