Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.11;
Скачать: CL | DM;

Вниз

Глобальный хук на клавиатуру без dll.   Найти похожие ветки 

 
begin...end ©   (2006-06-26 20:13) [40]

> programania ©   (26.06.06 19:33) [39]

Мой пример ничего не блокирует, а только показывает, как можно посмотреть на интересующие сообщения до того, как они попадут в оконные процедуры. В том числе, и на сообщения от клавиш Ctrl, Alt и Del (даже нажатых вместе).

> кстати, Ваш пример в W98 вообще ничего не ловит

Совершенно верно -- мой пример не работает в Win98. Надеюсь, что ни для кого из читающих ветку, кроме Вас, это новостью не является, ведь я сам сказал об этом ещё в [6].

> а мой работает нормально

Совершенно верно -- Ваш пример работает в Win98. Правда, к теме ветки он не имеет ни малейшего отношения.

LOL.


 
Elen ©   (2006-06-27 07:59) [41]

Хей Мастера! А как вам такой примерчик? :


procedure TForm1.Timer1Timer(Sender: TObject);
var i:word;
begin
for i:=0 to 255 do begin
if (GetKeyState(i)=-128) or (GetKeyState(i)=127) then begin
 memo1.Lines.Append ( chr(i));
end else
end;
end;


У кого-нибудь повернется язык назвать это глобальным перехватом?


 
Игорь Шевченко ©   (2006-06-27 10:36) [42]


> У кого-нибудь повернется язык назвать это глобальным перехватом?


А GetKeyState относится к локальной очереди потока...


 
cerber   (2006-10-28 14:37) [43]

Лови, студент!


const
 WH_KEYBOARD_LL = 13;
 WH_MOUSE_LL = 14;
 LLKHF_EXTENDED = KF_EXTENDED shr 8;
 LLKHF_INJECTED = $00000010;
 LLKHF_ALTDOWN = KF_ALTDOWN shr 8;
 LLKHF_UP = KF_UP shr 8;
 LLMHF_INJECTED = $00000001;
{ Structure used by WH_KEYBOARD_LL }
type
 tagKBDLLHOOKSTRUCT = packed record
   vkCode : DWord;
   scanCode : DWord;
   flags : DWord;
   time : DWord;
   dwExtraInfo : PDWord;
 end;
 TKBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
 PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
{ Structure used by WH_MOUSE_LL }
 tagMSLLHOOKSTRUCT = packed record
   pt : TPoint;
   mouseData : DWord;
   flags : DWord;
   time : DWord;
   dwExtraInfo : PDWord;
 end;
 tMSLLHOOKSTRUCT = tagMSLLHOOKSTRUCT;
 PMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT;
 Вот, например, что когда-то предлагал Джеф Рихтер для
 отключения любимых номеров (в вольном переводе):
function LowLevelKeyboardProc(nCode :Longint; awParam: WParam; alParam:
LParam): DWord; stdcall;
var
 fEatKeystroke: Boolean;
 p: PKBDLLHOOKSTRUCT;
 buf: array [0..255] of Char;
 sc: UINT;
begin
  fEatKeystroke := False;
  if (nCode = HC_ACTION) then
     case (awParam) of
      WM_KEYDOWN, WM_SYSKEYDOWN,
      WM_KEYUP, WM_SYSKEYUP:
        begin
         p := PKBDLLHOOKSTRUCT(alParam);
         fEatKeystroke :=
           ((p.vkCode = VK_TAB) and (p.flags and LLKHF_ALTDOWN <> 0)) or
           ((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
           ((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000)
<>0));
        end;
      end;
  if fEatKeystroke then
    Result := 1
  else
    Result := CallNextHookEx(0, nCode, awParam, alParam);
end;
var
 hhk: HHOOK;
procedure TForm1.Button1Click(Sender: TObject);
begin
 hhk:= SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
 UnHookWindowsHookEx(hhk);
end;



 
Leonid Troyanovsky ©   (2006-10-28 14:52) [44]


> cerber   (28.10.06 14:37) [43]

> Лови, студент!


Ты б хоть сослался.
Джефу Рихтеру, наверное, это пофигу,
а мне, как переводчику, было б приятно.

--
Regards, LVT.


 
Psychedelic ©   (2006-10-29 00:11) [45]

Спасиб! Посмеялся хоть :))
Наивный programania и старающийся не выйти из себя begin..end


 
GrayFace ©   (2006-10-29 15:41) [46]

Еще есть WH_JOURNALRECORD.

programania ©   (20.06.06 20:30) [9]
Если в Windows произойдет событие нажатия заданой клавиши,
то будет вызвана заданная процедура это и есть hook на это событие
причем это произойдет при [b]любой[/b] активной программе
это и есть глобальный hook

В Morrowind, I of the Dragon к любым относятся? Хуки в них работают, горячие клавиши - нет. Соответственно, никаких хуков в RegisterHotKey не спрятано, оно работает по другому.
Хотя в какой-то игре и хуки не работают, поэтому я перехватывал клаву по таймеру в своей подсобной проге.

programania ©   (23.06.06 19:44) [26]
так и в вашем примере все сообщения получает одно окно TestForm
и уже потом посылает другим - CallNextHookEx
а у меня - SendMessage(GetForegroundWindow

Гы. Ну да, хуки - это, оказывается, таже окна...

Игорь Шевченко ©   (27.06.06 10:36) [42]
А GetKeyState относится к локальной очереди потока...

Но обычно он работает! В упомянутой подсобной проге вызывал по таймеру и управлял ВинАмпом и т.п. Перестает работать, например, когда установлен WH_JOURNALRECORD.


 
Gero ©   (2006-10-29 15:44) [47]

> begin...end ©

Будь самим собой, не нужно изображать из себя Юрия Зотова. Ты изменился в худшую сторону.

PS: Это никоим образом не наезд на Юрия.


 
cerber   (2006-10-29 16:31) [48]


> Leonid Troyanovsky ©   (28.10.06 14:52) [44]


Забыл скопировать:


Leonid Troyanovsky 9 Нояб. 2003 03:10
Группы новостей: fido7.ru.delphi.chainik
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/ba088c4f6ad9649f
Приветствую, Denis.
LT> Установка системных WH_KEYBOARD_LL и WH_MOUSE_LL, т.е. хуков низкого
LT> уровня, не требуют библиотеки.
DVS> жаль только Delphi о них понятия не имеет.




Страницы: 1 2 вся ветка

Текущий архив: 2007.03.11;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.03 c
15-1171561649
alien1769
2007-02-15 20:47
2007.03.11
Вакансия для программиста на С++


1-1169029785
MegaVolt
2007-01-17 13:29
2007.03.11
Какой шрифт использовать для многоязычных программ.


2-1171953044
Sapos
2007-02-20 09:30
2007.03.11
Как вернуть путь к папке в которой установлена ОС?


15-1171349663
Virgo_Style
2007-02-13 09:54
2007.03.11
Помогите найти старый мультфильм


4-1162327378
wp2
2006-10-31 23:42
2007.03.11
Как в библиотеке узнать какая ее вызвала программа?