Win32 WH_CBT Hook - 在创建之前关闭窗口

时间:2009-08-23 20:47:54

标签: winapi hook

我当前正在运行一个全局钩子,它监视某个窗口,然后用PostMessage(hWnd,WM_CLOSE,0,0);关闭它 包含钩子的DLL:

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)按窗口标题确定当前激活的窗口是否为要关闭的窗口。 i'm 在激活窗口时关闭窗口,而不是在创建窗口时关闭窗口。我想在创建窗口时关闭窗口,即HCBT_CREATEWND为真。

问题是我无法使用GetWindowText(hWnd, wintext, 80)来获取窗口标题,从而确定是否应该关闭窗口,因为调用HCBT_CREATEWND时窗口不是{{3} }并且没有标题,GetWindowText(hWnd, wintext, 80)什么都不返回。

总结我的问题:当HCBT_CREATEWND为真时,是否有可能获得窗口的标题或以任何其他方式确定它是什么类型的窗口?

2 个答案:

答案 0 :(得分:2)

您可以尝试GetClassName而不是阅读窗口文字吗?

阅读窗口文本(国际化)可能更可靠。发现窗口类名的简单方法是使用spy ++实用程序 - 描述了一个方便的教程here

答案 1 :(得分: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;
        }
    }
}