PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : System Hook


Felix Kaiser
21.03.2002, 14:45
Ich wollt nen Infoserverproggi von mir ausrüsten mit ner Funktion um die Dauer der Inaktivität des Anwenders zu messen. Wollte dazu nen Hook installieren des Typs WH_KEYBOARD. Hab das KeyboardProc sachgemäß angelegt und über CallNextHook oder wie das heißt auch sachgemäß weitergeleitet. Nur der Haken ist jetzt: Wenn ich z.B. die Taste für Win95 Taskleiste drücke und dann versuche mit den Buchstabentasten durchs Startmenü zu navigieren läuft das System unkontrollierte Funktionen ab. :mauer: Plötzlich verschwinden TrayIcons, Delphi meldet plötzlich ein ungültiges Fensterhandle, einige Anwendungen verschwinden plötzlich auch und ich weiß nicht warum :(

Einer ne Idee? (bitte praxisgetestete Ideen, Theorien nützen hier wohl nicht)


Diogenes
22.03.2002, 14:07
Schau einmal nach, was Du deinen Hook zurückgeben läßt. Die Rückgabewerte der Hooks haben oft Funktionen und Wirkungen.

Felix Kaiser
22.03.2002, 14:13
Hab ich zichfach nachgeprüft und zichfach variiert, aber immer gings in die Hose und im System ging was kaputt. Dann hatte ich mal die Routinen rausgemacht, die auf eine TForm Komponente zugreifen und dafür einfach nur einen Befehl zum inkrementieren einer lokalen Integervariable eingesetzt. Somit waren alle Störungen weg und der hatte auch die Events gezählt! Fand ich wunderbar, nur ... sobald ich die Events außerhalb des eigenen Fensters ausgeführt hab (z.B. Maus außerhalb des Clientbereiches bewegt, nichts geklickt) wurde der Hook gestoppt. X(

Die Dinger scheinen zu machen was sie wollen und nicht was ich will ;(

Diogenes
22.03.2002, 14:24
Es kann sein, dass der Hook nur dann reagiert (aufgerufen wird), wenn die installierende Anwendung aktiv ist - wäre typisch für Microsoft.

Felix Kaiser
22.03.2002, 22:01
Trifft ja aber leider auch nicht zu, beim Reaktivieren der Anwendung ist der Hook immernoch inaktiv, also allgemein lahmgelegt.

Diogenes
23.03.2002, 17:00
Naja, auch das ist typisch... :rolleyes:

Leider nur Theorie, aber vielleicht mußt Du den Hook jedesmal neu installieren :mauer:

Felix Kaiser
23.03.2002, 17:05
Auch schon überlegt, aber ich weiß imo noch nicht wie ich feststellen könnte, ob der Hook deaktiviert / zerstört wurde. Vielleicht ist das Hookhandle ja noch gültig, weiß ich alles nicht. Daher habe ich mein Problem kurzfristig mit dieser ´Behelfsmethode´ gelöst:

Habe nun einen Timer mit Interval 1ms, der die Mausposition prüft und somit deren Veränderung relativ genau messen kann. Trotzdem wär mir ein ´funktionierender´ Hook oder was zu 100% ebenwürdiges viel viel lieber X(

Diogenes
23.03.2002, 17:11
Wenn Du nur die Maus unter Kontrolle haben willst, dann laß dir doch den Mausfang geben:
Die API-Funktionen
SetCapture
ReleaseCapture
GetCapture
sind zum Übernehmen und Loslassen der Mauskontrolle da.
Miau

Felix Kaiser
26.03.2002, 21:22
Maus hab ich ja nun über Timer und GetCursorPos oder wie des hieß gelöst, is ja nich schwer. Aber Tastatur ... das is blöd X( Hab auch nix in der SDK gefunden, was irgendwie in Verbindung mit einem systemglobalen Handler steht, so dass ich jede gedrückte Taste mitbekomme. Wenns da was gäbe? Ich habs erstmal auf Tertiäre Priorität zurückgestellt.

Patrik Graf
27.03.2002, 00:46
Guru... ich hab da was für dich:


Var b: Byte;
asm
mov al, 60h
mov b, al
end;


:D :D

nj0y
27.03.2002, 08:43
Original von Grafitty
Guru... ich hab da was für dich:


Var b: Byte;
asm
mov al, 60h
mov b, al
end;


:D :D


???

Patrik Graf
27.03.2002, 09:03
@njOy:

Das ist doch klar was das ist, siehste das nicht? :))
Nee, Spass bei Seite... Das ist ein kleines ASM-Proggi das nichts anderes macht, als ein Byte aus dem I/O-Bereich der für die Tastatur von Windows reserviert wurde ausliest und in eine Variable vom Typ Byte speichert. :D

nj0y
27.03.2002, 09:55
Für mich sieht das eher so aus wie ein Äquivalent für:


Var b: Byte;
b := $60;


;)

Aber ich lasse mich gerne eines Besseren belehren...

Übrigens, so eine Inaktivitätsprüfung bräuchte ich auch für ein Programm, wenn es funktioniert, wäre dann wohl einer so nett, das ganze nochmal im Zusammenhang niederzuschreiben? :)

Felix Kaiser
27.03.2002, 13:14
Grafitty: Nö.

Wäre so:


var
b: byte;
begin
asm
in al, 60h
mov b,al
end;
end;


Und klappt eh nur bei Win9x und außerdem ließt es den letzten Scancode vom PS/2 Datenport. Wenn man zu dem noch ne PS/2 kompatible Maus benutzt -> Kacke!

Nene, so kommen wir nicht weiter :(

Patrik Graf
27.03.2002, 23:20
Guru... sei doch nicht so kleinlich :D