Крюк Win32 WH_CBT - закрыть окно до его создания

В настоящее время я запускаю глобальный хук, который следит за определенным окном, а затем закрывает его с помощью 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), чтобы определить по заголовку окна, нужно ли закрыть текущее активное окно. Я закрываю окно, когда оно активируется, а не когда оно создается. Я хотел бы закрыть окно, когда оно создается, то есть когда HCBT_CREATEWND истинно.

Дело в том, что я не могу использовать GetWindowText(hWnd, wintext, 80) для получения заголовка окна и тем самым определить, должно ли окно быть закрыто, потому что при вызове HCBT_CREATEWND окно не было полностью создан и не имеет заголовка, GetWindowText(hWnd, wintext, 80) ничего не возвращает.

Подытожу мой вопрос: можно ли получить заголовок окна или каким-то другим способом определить, что это за окно, когда HCBT_CREATEWND истинно?


person Community    schedule 23.08.2009    source источник


Ответы (2)


Не могли бы вы попробовать GetClassName вместо текст окна?

Наверное, надежнее чтение текста окна (интернационализация). Простой способ узнать имя класса окна — использовать утилиту spy++ — удобное руководство описано здесь.

person Alan    schedule 23.08.2009

Окно еще не создано. Это означает, что вы не сможете вызвать ::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;
        }
    }
}
person mvpete    schedule 27.08.2014