Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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

Доброе время суток, спецы! Знаю что тема истерзана до дыр, но всетаки есть момент, который я не могу решить. Есть DL в котором я реализовал перехват клавиатуры. Пользовался стандартными методами создания HOOK'а. Вот проца хука и проца обработки хука, реализованной в DLL:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
Ответить с цитированием
  #2  
Старый 19.11.2010, 21:11
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Наверно ошибка в самой GenerateMsg(ShortC)
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 19.11.2010, 21:19
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

Там ошибки быть не может.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
  procedure GenerateMsg(ShortCut: string); stdcall;
   begin
//    MessageBox(0, PChar(ShortCut), '', 0);
      if ShortCut = ххх then
       begin
         ....
       end
      else
      if ShortCut = ууу then
       begin
        ...
       end;
   end;
Почему я уверен, так это потому что, када окно активно то действия между begin и tnd выполняются, но када такое же значение ShortCut и окно не активно, то никакой реакции
__________________
APPLICATION.TERMINATOR
Ответить с цитированием
  #4  
Старый 19.11.2010, 22:18
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Очень странно. У меня в одной программке вроде хук на клаву ставился так же (она блочила все комбинации типа Alt+F4, Alt+Tab и т.д.), но при этом все срабатывало даже при неактивном окне. У меня даже из-за этого траблы были - не мог ее отрубить, когда соскакивала активность куда-нить
Возможно код выполняется, но из-за неактивности формы этого не заметно? ^_^
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:19.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025