Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2008, 19:48   #11
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

создание, уничтожение, сворачивание, разворачивание и т.д. лучше юзать тип хука WH_CBT. На всё остальное лучше использовать WH_GETMESSAGE. Обрабатывай в хуке сответствующие сообщения (WM_CREATE, WM_MOVE, WM_SIZE, WM_PAINT....).
rpy3uH вне форума Ответить с цитированием
Старый 24.02.2009, 13:13   #12
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Решил поднять тему, т.к. при установки HCBT хука, бывает что через некоторое время обработчик хука просто перестает срабатывать, и приходится переустанавливать хук, но мне кажется что есть какое то рациональное решение, нежели просто по таймеру переустанавливать хук постоянно.
BOBAH13 вне форума Ответить с цитированием
Старый 24.02.2009, 13:17   #13
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

скорее всего это глюк в обработчике хука, надо смотреть код, отлаживать, тестить....
rpy3uH вне форума Ответить с цитированием
Старый 24.02.2009, 13:41   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если такая морока с хуками почему бы не получать список запущенных процессов раз в скажем пять сек. и не выяснять какая прога в сравнении с предидущим списком появилась в новом.
а потом уж и узнать экзешник, или модуль который ее запустил.
Зачем хуки то мучать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.02.2009, 13:50   #15
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вы не много не поняли. Цель: перехватывать сворачивание и восстановление окон. Вот код, незнаю что тут может быть не так.

Код:
library gKernel;

uses
  Windows, Messages;

{$R *.RES}
         
type
  PData = ^TData;
  TData = packed record
    HookCBT: HHOOK;
    WndCBT: HWND;
    WM_GDWINDOWMINMAX: DWord;
  end;

const
  MapName = 'gKernelHook';

var
  Data: PData;
  hMap: THandle;

function HookCBTProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
  // работает сначала, потом оп, и обработчик вообще не срабатывает
  if (code = HCBT_MINMAX) and (Data^.WndCBT > 0) then
  begin

    case LOWORD(lparam) of

      SW_MINIMIZE, SW_SHOWMINIMIZED:
      begin
        if IsWindowVisible(wparam) then
        begin
          Result := SendMessage(Data^.WndCBT, Data^.WM_GDWINDOWMINMAX, wparam, 0);
          if (Result = 1) then
          begin
            CallNextHookEx(Data^.WndCBT, code, wparam, lparam);
            Exit;
          end;                 
        end;
      end;

      else
        PostMessage(Data^.WndCBT, Data^.WM_GDWINDOWMINMAX, wparam, 1);
    end;

  end;

  Result := CallNextHookEx(Data^.HookCBT, code, wparam, lparam);
end;

procedure SetHook(State: Boolean); stdcall;
begin
  if State then
  begin
    if not Assigned(Data) then
    begin
      hMap := CreateFileMapping(INVALID_HANDLE_VALUE, NIL, PAGE_READWRITE, 0, SizeOf(TData), MapName);
      if (hMap = 0) then
        Exit;

      Data := MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
      if not Assigned(Data) then
      begin
        CloseHandle(hMap);
        Exit;
      end;

      Data^.WM_GDWINDOWMINMAX := RegisterWindowMessage('WM_GDWINDOWMINMAX');

      Data^.WndCBT := 0;
      Data^.HookCBT := SetWindowsHookEx(WH_CBT, @HookCBTProc, HInstance, 0);
    end;
  end else
  if Assigned(Data) then
  begin
    UnhookWindowsHookEx(Data^.HookCBT);
    
    UnmapViewOfFile(Data);
    Data := NIL;
    
    CloseHandle(hMap);
  end;
end;

procedure SetWndCBT(hWnd: HWND); stdcall;
begin
  if Assigned(Data) then
  begin
    Data^.WndCBT := hWnd;
  end;
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of

    DLL_PROCESS_ATTACH:
    if not Assigned(Data) then
    begin
      hMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, MapName);
      if (hMap = 0) then
        Exit;
      
      Data := MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
      if not Assigned(Data) then
        CloseHandle(hMap);
    end;

    DLL_PROCESS_DETACH:
    if Assigned(Data) then
    begin
      UnmapViewOfFile(Data);
      Data := NIL;
      CloseHandle(hMap);
    end;
    
  end;   
end;

exports
  SetHook name 'SetHook',
  SetWndCBT name 'SetWndCBT';

begin
  DisableThreadLibraryCalls(HInstance);
  DLLProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
BOBAH13 вне форума Ответить с цитированием
Старый 24.02.2009, 14:02   #16
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Код:
function HookCBTProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
  // работает сначала, потом оп, и обработчик вообще не срабатывает
  if (code = HCBT_MINMAX) and (Data^.WndCBT > 0) then
  begin

    case LOWORD(lparam) of

      SW_MINIMIZE, SW_SHOWMINIMIZED:
      begin
        if IsWindowVisible(wparam) then
        begin
          Result := SendMessage(Data^.WndCBT, Data^.WM_GDWINDOWMINMAX, wparam, 0);
          if (Result = 1) then
          begin
            CallNextHookEx(Data^.WndCBT, code, wparam, lparam);
            Exit;
          end;                 
        end;
      end;

      else
        PostMessage(Data^.WndCBT, Data^.WM_GDWINDOWMINMAX, wparam, 1);
    end;

  end;

  Result := CallNextHookEx(Data^.HookCBT, code, wparam, lparam);
end;
довольно-таки странный обработчик. во-первых, не рекомендуется передавать сообщения хуках такого типа и это главное.
во-вторых
Код:
          if (Result = 1) then
          begin
            CallNextHookEx(Data^.WndCBT, code, wparam, lparam);
            Exit;
          end;
что это такое? похоже на бред...

Последний раз редактировалось rpy3uH; 24.02.2009 в 14:05.
rpy3uH вне форума Ответить с цитированием
Старый 24.02.2009, 14:05   #17
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вопрос не в этом, result := нет, т.к. я прерываю цепь хука, чтобы окно не свернулось

Цитата:
передавать сообщения хуках такого типа и это главное.
Это Вы о чем ?
BOBAH13 вне форума Ответить с цитированием
Старый 24.02.2009, 19:59   #18
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Это Вы о чем ?
я о том что посылка сообщения может привести (прямо или косвенно) к вызову твоего обработчика и получится бесконечная рекурсия. В данном лсучае посылая сообщения надо точно знать что никакое новое окно не создастся.

функция CallNextHookEx в WinNT игнорирует первый параметр. поэтому строки
Код:
CallNextHookEx(Data^.WndCBT, code, wparam, lparam);
CallNextHookEx(Data^.HookCBT, code, wparam, lparam);
CallNextHookEx(0, code, wparam, lparam);
равнозначны!
и я не понимаю какой был смысл вызывать CallNextHookEx указав в качестве первого параметра хендл окна

Последний раз редактировалось rpy3uH; 24.02.2009 в 20:04.
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Global Hook - движение окон BOBAH13 Общие вопросы Delphi 5 16.09.2008 11:59
IP из заголовка TCP + контроль за портами Majestry Работа с сетью в Delphi 2 28.05.2008 09:54
Контроль перемещения мыши Falling_Tear Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 29.11.2007 19:43
Как получить список запускаемых программ? kozei Win Api 8 01.11.2007 16:07