Как поставить глобальный хук на разворачивание окон

VINNI5898
Дата: 05.06.2009 15:05:50
Доброго времени суток. Собственно, вопрос в теме. Нужно поймать момент, когда окно из панели задач разворачивается и становится активным.
Barmaley57
Дата: 05.06.2009 15:16:20
Как пытался ловить?
VINNI5898
Дата: 05.06.2009 15:18:11
Я знаю, что это нужно делать через хук. Но как - хз. Нужен пример.
Barmaley57
Дата: 05.06.2009 15:47:02
Пример не можешь найти?
Смотри справку. В особенности слова SetWindowsHook, WH_CBT и HCBT_ACTIVAT...
SNike
Дата: 05.06.2009 16:15:12
Сам сейчас с этим запариваюсь.
Вот в сокращенном варианте:
function CBTProc(code : integer; wParam : word; lParam : longint) : longint; export; stdcall;
begin
 Result := CallNextHookEx(SysHook, Code, wParam, lParam);
 if Code < 0 then Exit;

 case Code of
  HCBT_ACTIVATE:
    begin
    end;

  HCBT_CREATEWND:
   begin
   end;

  HCBT_DESTROYWND:
    begin
    end;
 end; // case Code
end;

function SetHook(UseProtect, LogCreate, LogActivate, LogDestroy: Boolean) : Boolean; export; stdcall;
begin
 SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);
end;

function StopHook: Boolean; export; stdcall;
begin
  UnhookWindowsHookEx(SysHook);
end;
VINNI5898
Дата: 05.06.2009 16:19:06
SNike, это должно находиться в dll?
Barmaley57
Дата: 05.06.2009 16:21:47
В dll - если хочешь перехватывать сообщения для всех запущенных GUI'шных приложений.

P.S. Информации по этой теме море
SNike
Дата: 05.06.2009 16:23:09
Да, в DLL
SNike
Дата: 05.06.2009 16:52:10
Кстати, может мне кто объяснит: почему когда выполняется CBTProc (из кода выше) не видно глобальных по DLL переменных?
Например:
1 - создал в SetHook переменную Lst := TStringList.Create
2 - при выполнении CBTProc эта Lst = Nil
3 - в StopHook - Lst уже снова не Nil
SNike
Дата: 05.06.2009 17:02:35
Получается что эта функция при исполнении оказывается в другом процессе и не видит переменных DLL ?