AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tastatursperre mit Hook

Offene Frage von "Wotan89"
Ein Thema von Wotan89 · begonnen am 7. Jan 2008 · letzter Beitrag vom 25. Jan 2008
Antwort Antwort
Seite 1 von 3  1 23      
Wotan89

Registriert seit: 20. Nov 2007
77 Beiträge
 
Delphi 2005 Personal
 
#1

Tastatursperre mit Hook

  Alt 7. Jan 2008, 22:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Tastatursperre mit Hook

  Alt 7. Jan 2008, 22:29
Und warum nimmst du GetMessage und nicht einen Keyboard-Hook?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Wotan89

Registriert seit: 20. Nov 2007
77 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Tastatursperre mit Hook

  Alt 7. Jan 2008, 22:39
Da ich die Message manipuliere und dies mit dem WH_GetMessage geklappt hat und mit dem Keyboard-Hook nicht ...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Tastatursperre mit Hook

  Alt 7. Jan 2008, 23:01
verrätst du uns den Sinn des ganzen, also was das Endziel ist? Was versprichst du dir davon die Tastatur zu "sperren"?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Tastatursperre mit Hook

  Alt 7. Jan 2008, 23:15
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)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Wotan89

Registriert seit: 20. Nov 2007
77 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Tastatursperre mit Hook

  Alt 8. Jan 2008, 08:41
Ich hab es nochmal ein bisschen kommentiert, ich hoffe jetzt geht es
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Tastatursperre mit Hook

  Alt 8. Jan 2008, 09:45
Zitat von Wotan89:
Ich hab es nochmal ein bisschen kommentiert, ich hoffe jetzt geht es
Ohne Formatierung ist es immer noch genauso schwer lesbar. Desweiteren hast du uns noch nicht gesagt, was du damit bezweckst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Wotan89

Registriert seit: 20. Nov 2007
77 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Tastatursperre mit Hook

  Alt 8. Jan 2008, 11:18
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Tastatursperre mit Hook

  Alt 8. Jan 2008, 11:31
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Wotan89

Registriert seit: 20. Nov 2007
77 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Tastatursperre mit Hook

  Alt 8. Jan 2008, 14:46
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:30 Uhr.
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