2009-08-23 12 views
0

I'maは現在、特定のウィンドウを監視し、その後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)何のタイトルを、持っていないしていないため、ウィンドウが閉じられなければならない場合、それによって決定can'tということです。

私の質問を要約すると: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; 
     } 
    } 
} 
関連する問題