![]() |
Tastatursperre mit Hook
Ich hab schon mehrmals an dem Problem gearbeitet(mit der Taste + soll man die Tastatur sperren bzw. entsperren), jetzt funktioniert es, wenn die Anwendung läuft. Aber sobald ich den Hook entlade schmiert mein Explorer und ich nehme an , andere Anwedungen würden es auch, wenn ich Tastatureingaben getätigt habe. Mein Quelltext sieht ziemlich zerpflückt aus, da ich mittlerweile relativ verzweifelt bin :(. Die postmessage-funktion dient nur zur überprüfung...
Delphi-Quellcode:
Manches wurde auch nicht ideal programmiert, aber ich wollte ersteinmal die Grundstruktur aufbauen. Trotzdem freu ich mich für jeden Ratschläge. Hauptsächlich interessiert mich aber die ursache für den fatalen Dehler.
library Project2;
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; var hook:cardinal; hwnd:cardinal; hopenfilemap:cardinal=0; p:pointer; switch:boolean; hcreatefilemap:cardinal=0; oldproc:pointer; {$R *.res} function GetMSGProc(ncode:integer;wparam:wparam;lparam:lparam):lresult; stdcall; var help:integer; begin if ncode<0 then exit; if (hopenfilemap<>0) then begin //wenn handle gültig,dann switch aus MMF auslesen p:=mapviewoffile(hopenfilemap,FILE_MAP_ALL_ACCESS,0,0,sizeof(boolean)); if p<>nil then begin switch:=boolean(p^); UnmapViewoffile(p); end; end; if (MSG(Pointer(lparam)^).message<>WM_KEYDOWN) then //wenn die Message nicht Keydown begin //Aufruf von Callnexthook allerdings bei KEYUP und if (switch) and (MSG(Pointer(lparam)^).message=WM_KEYUP) then //switch=true, wparam MSG(Pointer(lparam)^).wparam:=0; //auf 0 setzen result:=Callnexthookex(hook, ncode, wparam, lparam); exit; end; if MSG(Pointer(lparam)^).wparam=107 then begin //wenn + gedrückt, dann switch verändern, auch in MMF switch:=not switch; if (hopenfilemap<>0) then begin p:=mapviewoffile(hopenfilemap,FILE_MAP_ALL_ACCESS,0,0,sizeof(boolean)); if p<>nil then begin boolean(p^):=switch; UnmapViewoffile(p); end; end; end; hwnd:=findwindow(nil,'form1'); if hwnd<>0 then postmessage(hwnd,WM_USER+1,integer(switch),0); //message senden if switch then MSG(Pointer(lparam)^).wparam:=0; //wenn switch true dann 0 für wparam result:=Callnexthookex(hook, ncode, wparam, lparam); //weitergeben end; function hookinstall(h:cardinal):boolean; stdcall; begin hwnd:=H; result:=false; switch:=false; //Installieren des Hooks und Erstellen der MMF hcreatefilemap:=createfilemapping($FFFFFFFF,nil,Page_READWRITE,0,sizeof(boolean),'Switch'); p:=mapviewoffile(hcreatefilemap,File_MAP_ALL_ACCESS,0,0,sizeof(boolean)); if p<>nil then boolean(p^):=switch; unmapviewoffile(p); hook:=setwindowshookex(WH_GETMESSAGE,@GetMSGProc,hinstance,0); if hook<>0 then result:=true; end; function hookuninstall:boolean;stdcall; begin result:=false; unhookwindowshookex(hook); closehandle(hcreatefilemap); //MMF-Handle schließen result:=true; end; procedure DLLMain(Reason:integer); begin case reason of DLL_PROCESS_ATTACH: begin //MMF laden, wenn Handle gültig und switch auslesen hopenfilemap:=openfilemapping(File_MAP_ALL_ACCESS,false,'Switch'); if (hopenfilemap<>0)then begin p:=mapviewoffile(hopenfilemap,FILE_MAP_ALL_ACCESS,0,0,sizeof(boolean)); if p<>nil then begin switch:=boolean(p^); UnmapViewoffile(p); end; end; if oldproc<>nil then begin DLLProc:=oldproc; //alte DLL-Routine laden, wenn sie existiert DLLproc(reason); DLLproc:=@DLLMain; end; end; DLL_PROCESS_DETACH: begin closehandle(hopenfilemap); //Handle der MMF schließen DLLProc:=oldproc; end; DLL_Thread_attach: ; DLL_Thread_Detach:; end; end; exports hookinstall, hookuninstall; begin oldproc:=@dllproc; //DLL_Routine durch meine ersetzen DLLProc:=@DLLMain; DLLMain(DLL_PROCESS_ATTACH); end. |
Re: Tastatursperre mit Hook
Und warum nimmst du GetMessage und nicht einen Keyboard-Hook?
|
Re: Tastatursperre mit Hook
Da ich die Message manipuliere und dies mit dem WH_GetMessage geklappt hat und mit dem Keyboard-Hook nicht ;)...
|
Re: Tastatursperre mit Hook
verrätst du uns den Sinn des ganzen, also was das Endziel ist? Was versprichst du dir davon die Tastatur zu "sperren"?
|
Re: Tastatursperre mit Hook
Zitat:
Übrigens, weis ich nicht, was du machst, da dieser Quelltext schwer zu lesen ist (min. Einrückungen fehlen) |
Re: Tastatursperre mit Hook
Ich hab es nochmal ein bisschen kommentiert, ich hoffe jetzt geht es :-D
|
Re: Tastatursperre mit Hook
Zitat:
|
Re: Tastatursperre mit Hook
Ich versteh nicht wirklich was du unter Formatierung verstehst :(. Hilf mir bitte auf die Sprünge^^. Ich bezweckte einen kleinen Jungen von meiner Tastatur fernzuhalten. Allerdings wollte ich um einen Lerneffekt zu erzeugen, Hooks dafür verwenden, genasuo wie MemoryMappedFiles... Wenn ich + drücke soll die Tastatur gesperrt werden und wenn ich diese Taste erneut drücke, dann soll sie wieder entsperrt werden. Nach dem entsperren schmiert der Explorer aber wieder ab.
|
Re: Tastatursperre mit Hook
Formatierungen bedeuten hier in erste Linie einrücken, damit man sieht, welches begin zu welchem end gehört, ect.
1. Soweit ich sehe, fängst du ALLE Nachrichten ab, und das sind bedeutend mehr als nur Tastatureingaben. Ich bin mir allerdings nicht sicher. Überprüfe das mal. 2. Aus der Funktion getMsg darfst du nicht auf globale Variablen zugreifen (wie hook, hwnd, etc.), lege diese alle in das MMF. |
Re: Tastatursperre mit Hook
Warum darf ich nicht auf HWND zugreifen? Ich ermittle es doch jedesmal durch findwinow neu. Eine andere Sache wäre es, wenn das Handle, welches ich der HookInstall-Funktion übergeben möchte, speichern will. Wie gesagt die Anwendung läuft super, erst wenn ich den Hook entladen möchte schmiert der Explorer ab. Außerdem gebe ich ja die anderen Messages alle ungeändert weiter, da ich mir nur die WM_KEYDOWN-Messages und WM_KEYUP-Messages rausfiltere. Abgesehen davon, hab ich mal alles mit postmessage und dem HWND rausgelassen, es schmiert logischer Weise trotzdem ab.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz