SetWindowsHookEx HCBT_CREATEWND GetWindowText

Кто-нибудь знает, как получить текст созданного окна? Я установил хук на CreateWindow, но GetWindowText возвращает пустую строку.

hCBTHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) &CBTHook, g_appInstance, 0);

LRESULT CALLBACK CBTHook(int nCode, WPARAM wParam, LPARAM lParam)
{
     if(nCode == HCBT_CREATEWND)
     {
          HWND hwnd = (HWND)wParam;
          CHAR buf[256];
          GetWindowText(hwnd, buf, 256);
     }

     return CallNextHookEx(hCBTHook, nCode, wParam, lParam);
}

person user1277031    schedule 18.03.2012    source источник
comment
Крючки доступности работают намного лучше для такого рода вещей.   -  person Raymond Chen    schedule 18.03.2012


Ответы (1)


"Система вызывает процедуру подключения перед отправкой окну сообщения WM_CREATE или WM_NCCREATE."

В окне может еще не быть текста, ваш обратный вызов вызывается очень рано в процессе создания окна. Имя окна передается как часть сообщения CREATESTRUCT, отправленного с помощью WM_CREATE, которое будет самым ранним, когда окно сможет что-то сделать с текстом. Даже для того, чтобы что-то жестко закодировать, это должно быть в WM_NCCREATE, чего еще не произошло, когда вызывается ваш обратный вызов.

Однако сам обратный вызов также передается через CREATESTRUCT. Если вам нужно имя, которое было передано CreateWindow, это доступно и вам.

person Logan Capaldo    schedule 18.03.2012