Форум: "WinAPI";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];
ВнизПерехват нажатия клавиш! Найти похожие ветки
← →
vixic (2002-09-27 08:48) [0]Знаю вопрос изжованый до нельзя, но сколь искал так толкового ответа ненашол! Вопрос вот в чём мне нужно перехватывать нажатия клавиш на клаве и РАЗРЕШАТЬ ИЛИ ЗАПРЕЩАТЬ ВЫПОЛНЕНИЕ реакций системы или др. приложений на нажатие этих клавиш!
Спасибо!
← →
Song (2002-09-27 08:50) [1]См. статью "Хуки. Аспекты реализации".
← →
vixic (2002-09-27 08:52) [2]>Song
адресок статьи моно :o)
← →
Song (2002-09-27 08:54) [3]http://delphi.mastak.ru/articles/hooks/index.html
← →
vixic (2002-09-27 12:03) [4]>Song
Почитал! ММММ ДА! как всё запутано, В принцепе схема понятна НО! примеры не работают !!!!
Чё делать?
← →
_Кто-то из толпы (2002-09-27 12:42) [5]Повеситься... :-)
← →
Андрей Прокофьев (2002-09-27 12:46) [6]_Кто-то из толпы (27.09.02 12:42)
>> Повеситься... :-)
На хуке... :)
← →
Sodom (2002-09-27 17:34) [7]Выковыряй из клавиатуры клавиши на которые тебе надо запрещать нажатие.
← →
FAN (2002-09-27 23:41) [8]А в чем проблема-то?
- Клавиши перехватывать?
Тут главное обратить внимание на такую "мелочь": для перехвата нажатий клавиш в винде нужно SetWindowsHookEx из DLL-ки вызывать! В противном случае хук будет работать только когда нажатия программе твоей предназначены (если верить хелпу).
- Какому хелпу?
Тому, который по умолчанию в "\Program Files\Common Files\Borland Shared\MSHelp\win32.hlp"
- Как обрабатывать их, т.е. "запрещать"?
Очень просто! Твоя CALLBACK функция должна вернуть число, не равное 0, и клавиша "не нажмется". Даже более того! Ты можешь "изменить" нажатую клавишу.
- А что такое CALLBACK?
Это такая функция, написанная тобой (её адрес ты указал при вызове SetWindowsHookEx), которая вызывается виндами каждый раз, когда клавиша нажмается (не тобой вызывается, а виндами - поэтому и "CALLBACK").
← →
Alex4444444444 (2002-09-28 00:59) [9]Posmotry f forms.pas HookHintHooks (or smth like this) i
sdelay (pochti) takzhe. Nazhmi na F1 dlya detaley...
← →
SVM (2002-09-29 07:51) [10]Народ посмотрите на следующий код, в чем здесь ошибка (он не работает), или предложите свой.
library bddll;
uses
Windows, Messages;
var
Hook2: DWORD;// dd ?
DopK: array[0..50] of Char;// db 50 dup(?)
DopK0: array[0..4] of Char;// db 4 dup(?)
BufKey0: array[0..1000] of Char;// db 1000 dup(?)
BufKey1: array[0..1500] of Char;// db 1500 dup(?)
BufKey: array[0..1500] of Char;// db 1500 dup(?)
BoolKey: DWORD;// dd ?
LenKey1: DWORD;// dd ?
LenKey2: DWORD;// dd ?
cmd1: DWORD;// dd ?
const
Flash0 = #13#10;// db 13,10,0
NilStr = "";//db " ",0
DateStr1 = "dd.MM.yyyy";//db "dd.MM.yyyy",0
DateStr2 = "hh : mm : ss";//db "hh : mm : ss",0
DateStr3 = " ";//db " ",0
DopStr1 = "WRITE IN FILE ";// db "WRITE IN FILE ",0
DopStr2 = "---------------------------------------------------------------------------";//db "---------------------------------------------------------------------------",0
DopStr3 = "ACTIVE WINDOW (TITLE): ";// db "ACTIVE WINDOW (TITLE): ",0
DopStr4 = "ACTIVATE (day.month.year, hour:min:sec) ";// db "ACTIVATE (day.month.year, hour:min:sec) ",0
RegValue2 = "ks000log.txt";// db "ks000log.txt" ,0
Flash1 = "\";//db "\",0
Key1 = "Shift+";//db "Shift+",0
Key2 = "Ctrl+";//db "Ctrl+",0
Key3 = 536870912;//equ 536870912
Key4 = "Alt+";//db "Alt+",0
procedure DLLEntryPoint(Reason: DWORD);
begin
//
← →
vixic (2002-09-30 08:06) [11]Спасибо Song и FAN!:o)
← →
FAN (2002-09-30 21:55) [12]Отвечаю:
1) Код работает, но не так как ты ожидаешь :) Для установки хука необходимо вызвать функцию SetWindowsHookEx
2) Вот пример (пояснения в конце):
dll:
library brd;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library"s USES clause AND your project"s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
messages,
dialogs,
windows;
type
mflags = record
rc: Word;
vcc: byte;
other: byte;
end;
myflags = record
case integer of
1: (w: Cardinal);
2: (f: mflags);
end;
var
SaveExit: pointer;
hook: integer;
procedure LibExit; stdcall;
begin
ExitProc := SaveExit; // restore exit procedure chain
end;
procedure delayy;
var
x: cardinal;
begin
for x:=0 to 1000000 do;
end;
function BroodHook(nCode: integer; wParam: integer; lParam: integer): integer; stdcall;
var
h: word;
m: ^msg;
newm: ^msg;
ff: myflags;
begin
if ncode=HC_ACTION then begin
m:=Pointer(lParam);
if (m^.message=WM_KEYDOWN) and (m^.wParam=$50) then begin
new(newm);
newm^:=m^;
newm^.wParam:=$4C;
ff.w:=newm^.lParam;
ff.f.vcc:=$26;
newm^.lParam:=ff.w;
{m^:=newm^;}
{PostMessage(m^.hwnd,WM_KEYDOWN,newm^.wParam,newm^.lParam);}
{delayy;}
PostMessage(m^.hwnd,WM_KEYUP,newm^.wParam,newm^.lParam);
newm^.wParam:=49;
ff.f.vcc:=$2;
newm^.lParam:=ff.w;
{delayy;}
PostMessage(m^.hwnd,WM_KEYUP,newm^.wParam,newm^.lParam);
delayy;
{PostMessage(m^.hwnd,WM_KEYUP,newm^.wParam,newm^.lParam);}
newm^.wParam:=$4C;
ff.f.vcc:=$26;
PostMessage(m^.hwnd,WM_KEYDOWN,newm^.wParam,newm^.lParam);
dispose(newm);
m^.hwnd:=1;
end;
end;
result:=CallNextHookEx (Hook, nCode, wParam, lParam);
end;
procedure SetHook; stdcall;
begin
Hook:=SetWindowsHookEx(WH_GETMESSAGE, @BroodHook,
HInstance, 0);
end;
procedure DeleteHook; stdcall;
begin
UnhookWindowsHookEx(Hook);
end;
exports
SetHook, DeleteHook;
begin
SaveExit := ExitProc; // save exit procedure chain
ExitProc := @LibExit; // install LibExit exit procedure
end.
Комментарии:
Функция SetHook устанавливает хук, функция DeleteHook снимает хук.
В m:=Pointer(lParam) в m заносится нажатая клавиша.
За код ногами не бейте (писАл для себя), смысл этого кода таков:
клавиша <p> заменяется на последовательность <l><1><l> :)
Есть такая игра - StarCraft Brood Wars, там в первых версиях баг у зергов - если выбрать собачек (зерлингов) или кого-либо другого в группу(отряд) №1 (Ctrl+1), потом выбрать гидролиска (у которого есть опция превратиться в паучка), а потом нажать p (=<1> <l> <1>), то вместо гидралиска проапгрейдится отряд №1. Если отменить апгрейд, то получаться муталиски (на халяву). Это можно сделать и на клаве, но сложно :).
P.S.: Я не читер :)))
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c