Win32 WH_CBT Hook - закрыть окно перед его созданием - PullRequest
0 голосов
/ 24 августа 2009

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

Ответы [ 2 ]

2 голосов
/ 24 августа 2009

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

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

0 голосов
/ 28 августа 2014

Окно еще не создано. Это означает, что вы не сможете вызвать :: 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...