Wątek zablokowany 2015-02-20 21:39 przez furious programming.

[Delphi] Hook

0

Mam problem z blokowaniem klawisza windows. pq podpowiedział, żeby założyć hook na cały system. Rozwiązanie wydaje się logiczne. Żeby założyć hook na cały system trzeba bo umieścić w DLL. Procedura BlokujWin zakłada hook, OdblokujWin zdejmuje. Funkcja KeyboardProc ma za zadanie przjąć informacje wysyłane przez klawiaturę i wrazie naciśnięcia klawisza Windows (kod 91) nie przekazać dalej sygnału lub chociaż zmienić przesyłany klawisz. Procedury BlokujWin i OdblokujWin są wywoływane z innego pliku. Wszystko działa (można odczytać klawisze;sprawdzając czy zapisuje do pliku tekstowego) oprócz blokownia ;(

Moja prośba. Jeżeli ktoś wie gdzi tu jest błąd to niech pomoże.

var
hkprcSysMsg:TFNHookProc;
hinstDLL:HMODULE;
hhookSysMsg:HHOOK;

procedure BlokujWin;stdcall;
begin
hinstDLL:=0;
hkprcSysMsg:=nil;
hinstDLL:=LoadLibrary('test.dll');
if hinstDLL&lt&gt0 then begin
hkprcSysMsg:=GetProcAddress(hinstDLL,'KeyboardProc');
if Assigned(hkprcSysMsg) then
hhookSysMsg:=SetWindowsHookEx(WH_KEYBOARD,hkprcSysMsg,hinstDLL,0);
end;
end;

procedure OdblokujWin;stdcall;
begin
UnhookWindowsHookEx(hhookSysMsg);
if hinstDLL&lt&gt0 then FreeLibrary(hinstDLL);
hinstDLL:=0;
end;

function KeyboardProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
var
Plik:TextFile;
begin
AssignFile(Plik, 'c:\raport.txt');
Append(Plik);
if code&lt0 then begin
Result:=CallNextHookEx(hhookSysMsg,Code,wParam,lParam);
end else
if wparam=91{kod klawisza windows} then begin
Write(Plik, 'Windows ');
Result:=CallNextHookEx(hhookSysMsg,HC_ACTION,VK_Return,lParam); //gdzieś tu jest błąd
end else begin
Write(Plik, Chr(wparam));
Result:=CallNextHookEx(hhookSysMsg,Code,wParam,lParam);
end;
CloseFile(Plik);
end;

Exports
BlokujWin index 1 name 'BlokujWin',
OdblokujWin index 3 name 'OdblokujWin',
KeyboardProc index 2 name 'KeyboardProc';
begin
end.

Aaa biblioteka ma nazwę test.dll. Jak ktoś chce również plik wywołujący te procedury to mogę wszystko przesłać.

Za każdą wskazówkę z góry dziękuję.--Jest jeszcze jeden błąd ... :)

0

Duzo nad tym kombinowalem, i nic.

moja funkcja wygladal mniej wiecej tak:

function KeyProc(nCode : integer; WPARAM : wParam; LPARAM :lParam) :lresult;
stdcall;
begin
if (nCode &lt 0) then // do not process the message
begin
Result:=CallNextHookEx(hhk, nCode, wParam, lParam);
Exit;
end;
if (wparam=VK_LWIN) or (wparam=VK_RWIN) then Result:=1 else

Result:=CallNextHookEx(hhk, nCode, wParam,
lParam);
end;

i nie blokowala. To znaczy, blokowala widocznosc klawiszy Win w aplikacjach (odczyt virtual code), ale nie w systemie. Widac winda sprawdza ten klawisz przed hookami :((. Znalazlem cos co sie nazywa low level keyboard hook, ale jego stale np WH_KEYBOARD_LL oraz struktury nie sa zdefiniwane u mnie w Delphi. wiec nie mam jak eksperymentowac.

--
Pawel {Delphi6 }

Po pierwsze: naciśnij F1

0

Znalazłem strukturę:

typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

Teraz brakuje mi tylko wartości WH_KEYBOARDLL (wszystkie wartości WH które mam są od 1 do 12. Według artykułu są jeszcze tylko dwie WH_KEYBOARD_LL i WH_MOUSE_LL więc może mają wartości 13 i 14?)

http://msdn.microsoft.com/lib[...]res/kbdllhookstruct.asp--Jest jeszcze jeden błąd ... :)

0

Ha ha udało mi się zablokować klawisze windows, alt+tab i ctrl+esc pod WinNT/2000/XP.

Oto rozwiązanie:

type
pkbll = ^tKBDLLHOOKSTRUCT;
tKBDLLHOOKSTRUCT = record
vkCode: INTEGER;
scancode: INTEGER;
flags: INTEGER;
time: INTEGER;
dwExtraInfo: INTEGER;
end;

CONST WH_KEYBOARD_LL=13;

VAR HookID: HHOOK;

function LLKeyHookFunc (hookcode:integer; keycode:wParam;
kstrokeinfo:lParam): LResult; stdcall;
var struct: pkbll;
begin
struct:=Ptr(kstrokeinfo);
Result:=0;
IF (hookcode &gt= 0)
THEN
BEGIN
IF ((struct.vkCode = VK_ESCAPE) AND (GetAsyncKeyState(VK_CONTROL)&lt-32766)) THEN Result:=1;
IF ((struct.vkCode = VK_TAB) AND (GetAsyncKeyState(VK_MENU)&lt-32766)) THEN Result:=1;
IF ((struct.vkCode = VK_LWIN) OR (struct.vkCode = VK_RWIN)) THEN Result:=1;
END;
IF (Result = 0)
THEN Result:=CallNextHookEx (HookID, hookcode, keycode, kstrokeinfo);
end;

procedure TForm1.LockSystem;
begin
HookID:=SetWindowsHookEx (WH_KEYBOARD_LL, @LLKeyHookFunc, hInstance,0)
end;

procedure TForm1.UnLockSystem;
begin
BEGIN
IF (NOT UnHookWindowsHookEx(HookID))
THEN
BEGIN
Application.ProcessMessages;
Application.ProcessMessages;
Application.ProcessMessages;
UnHookWindowsHookEx(HookID);
END;
END
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
LockSystem;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnLockSystem;
end;

Mam też coś o blokowaniu w Win9x/ME. Ale nie mam tych sytemów. Więc na razie tylko eksperymetnuję.

Jak ktoś ma 9x/ME to niech spróbuje blokować przez:
SystemParametersInfo (SPI_SCREENSAVERRUNNING , Word(TRUE) , @OldValue,0)
i odblokowywać przez:
SystemParametersInfo (SPI_SCREENSAVERRUNNING , Word(FALSE) , @OldValue, 0);

var OldValue: LongBool;

--
Jest jeszcze jeden błąd ... :)

--------------Blok reklamowy :) -----
kanał: #4programmers.net
w sieci POLNet
serwer np.: warszawa.ircnet.pl

0

&gt
&gtJak ktoś ma 9x/ME to niech spróbuje blokować przez:
&gtSystemParametersInfo (SPI_SCREENSAVERRUNNING , Word(TRUE) , @OldValue,0)
&gti odblokowywać przez:
&gtSystemParametersInfo (SPI_SCREENSAVERRUNNING , Word(FALSE) , @OldValue, 0);
&gt
&gtvar OldValue: LongBool;

Bingo!!! U mnie dziala (98)--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

pq napisał:
&gt
&gtBingo!!! U mnie dziala (98)
&gt
Nie jest to może blokowanie poszczególnych klawiszy i możliwość odczytu ich (co czasem przydaje się np. w grach), ale lepszy rydz niż nic. :-) --Jest jeszcze jeden błąd ... :)

--------------Blok reklamowy :) -----
kanał: #4programmers.net lub #4programmers
w sieci POLNet
serwer np.: warszawa.ircnet.pl

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0