Тема: Перехват
Показать сообщение отдельно
  #1  
Старый 19.11.2010, 20:41
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию Перехват

Доброе время суток, спецы! Знаю что тема истерзана до дыр, но всетаки есть момент, который я не могу решить. Есть DL в котором я реализовал перехват клавиатуры. Пользовался стандартными методами создания HOOK'а. Вот проца хука и проца обработки хука, реализованной в DLL:
Код:
 function KeyMsgProc(Code: integer; wParam: word;
                     lParam: LongInt): LongInt; stdcall;
   var kn: array[0..50] of Char;
  begin
   if (Code = HC_ACTION) then
    begin
     GetKeyNameText(lParam, kn, SizeOf(kn));
     CurrKey:= StrPas(kn);
     CurrKey:= '|' + CurrKey + '|';
     if (((lParam shr 16) and KF_UP) = 0) and (Pos(CurrKey, ShortC) = 0) then
      begin
       ShortC:= ShortC + '+' + CurrKey;
       if ShortC[Length(ShortC)] = '+' then Delete(ShortC, Length(ShortC), 1);
       if ShortC[1] = '+' then Delete(ShortC, 1, 1);
       GenerateMsg(ShortC);
      end
     else
     if (((lParam shr 16) and KF_UP) = KF_UP) then
      begin
       GetKeyNameText(lParam, kn, SizeOf(kn));
       CurrKey:= StrPas(kn);
       CurrKey:= '|' + CurrKey + '|';
       Delete(ShortC, Pos(CurrKey, ShortC), Length(CurrKey));
       CurrKey:= '';
       if (ShortC <> '') then
        begin
         if (ShortC[Length(ShortC)] = '+') then Delete(ShortC, Length(ShortC), 1);
         if (ShortC[1] = '+') then Delete(ShortC, 1, 1);
        end;
      end;
    end;
   Result:= CallNextHookEx(KHook, Code, wParam, lParam);
  end;

 procedure RunStopHook(State: boolean); stdcall; export;
   begin
    if (KHook <> 0) and State then exit;
    if State then
     begin
      ShortC:= '';
      KHook:= SetWindowsHookEx(WH_KEYBOARD, @KeyMsgProc, HInstance, 0);
     end
    else
     begin
      if KHook = 0 then exit;
      UnHookWindowsHookEx(KHook);
      KHook:= 0;
     end;
   end;
где GenerateMsg(ShortC) - моя проца обработки строки, которая является пародием сочетания клавиш. А переменная ShortC это просто строка. Так вот вопрос: почему этот хук работает тока тада, када активно окно, которым я запускаю хук, но если в процу GenerateMsg(ShortC) вставить строку типа MessageBox(0, ShortC, '', MB_OK), то сообщения генерируются даже при неактивном окне, т.е. я делаю вывод что проца GenerateMsg(ShortC) выполняется всегда, однако почему-то если нет строки MessageBox то проца GenerateMsg(ShortC) не выполняется, мож я что недопонимаю, почему так странно работает Хук?
__________________
APPLICATION.TERMINATOR
Ответить с цитированием