Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tastatursperre mit Hook (https://www.delphipraxis.net/106244-tastatursperre-mit-hook.html)

Wotan89 7. Jan 2008 21:25


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:
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.
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.

sirius 7. Jan 2008 21:29

Re: Tastatursperre mit Hook
 
Und warum nimmst du GetMessage und nicht einen Keyboard-Hook?

Wotan89 7. Jan 2008 21:39

Re: Tastatursperre mit Hook
 
Da ich die Message manipuliere und dies mit dem WH_GetMessage geklappt hat und mit dem Keyboard-Hook nicht ;)...

SirThornberry 7. Jan 2008 22:01

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"?

sirius 7. Jan 2008 22:15

Re: Tastatursperre mit Hook
 
Zitat:

Zitat von Wotan89
Da ich die Message manipuliere und dies mit dem WH_GetMessage geklappt hat und mit dem Keyboard-Hook nicht ;)...

Soweit ich mich richtig erinnere, habe ich auch mal die Tastatur mittels Keyboard-Hook gesperrt (durch einfaches nicht weiterleiten wahrscheinlich). War ja nur ne Idee.
Übrigens, weis ich nicht, was du machst, da dieser Quelltext schwer zu lesen ist (min. Einrückungen fehlen)

Wotan89 8. Jan 2008 07:41

Re: Tastatursperre mit Hook
 
Ich hab es nochmal ein bisschen kommentiert, ich hoffe jetzt geht es :-D

Luckie 8. Jan 2008 08:45

Re: Tastatursperre mit Hook
 
Zitat:

Zitat von Wotan89
Ich hab es nochmal ein bisschen kommentiert, ich hoffe jetzt geht es :-D

Ohne Formatierung ist es immer noch genauso schwer lesbar. Desweiteren hast du uns noch nicht gesagt, was du damit bezweckst.

Wotan89 8. Jan 2008 10:18

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.

sirius 8. Jan 2008 10:31

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.

Wotan89 8. Jan 2008 13:46

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 03:03 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz