C# Low-Level-Hooks

Fou-Lu

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
290
Hallo Leute,

ich bin momentan bisschen am rumexperimentieren mit Hooks und hab da ein Problem für das ich die Lösung irgendwie nicht ganz so herleiten kann.

Bzw. es noch bisschen mit dem Verständnis happert, so dass ich die Exception selber nicht "ganz" verstehe.


Ich habe das nach dem Tutorial von CodeProject gemacht (HIER). Und soweit funktioniert es auch (ich wende es auf die LWin und RWin Taste an). Die werden tatsächlich abgefangen und auch die von mir gewünschte Aktion wird stattdessen ausgeführt.

Aber wenn ich die paar mal benutze, dann tritt eine Exception auf:

CallbackOnCollectedDelegate:
Für den von der Garbage Collection gesammelten Delegaten vom Typ "HookTest!HookTest.KeyboardHook+HookProc::Invoke" wurde ein Rückruf durchgeführt. Dies kann Anwendungsabstürze, Datenbeschädigung und -verlust zur Folge haben. Beim Übergeben von Delegaten an nicht verwalteten Code müssen die Delegaten von der verwalteten Anwendung beibehalten werden, bis sichergestellt ist, dass sie nie aufgerufen werden.

Hoffentlich könnt ihr mir da weiterhelfen :)
Ergänzung ()

Wie kann ich den diesen Aufruf von den Callbacks unterbinden oder umgehen (oder was auch immer), hauptsache die Exception taucht halt nicht mehr auf??? :D :D
 
Der Garbage Collector von .NET räumt das Delegate-Objekt auf nachdem es an den unmanaged-Code übergeben wurde, da er denkt es wird nicht mehr verwendet.
Laut diesem Thread und dem darin verlinkten MSDN Artikel reicht es eine globale Variable auf den Delegate anzulegen, oder zumindest die Referenz noch einmal zu speichern.
In deinem Fall könnte das innerhalb der Klasse globalKeyboardHook.cs sein, die der CodeProject Beitrag zur Verfügung stellt.
 
Hey tausend Dank!! :) :) :)

Die Lösung in den Kommentaren hat tatsächlich funktioniert.
Die sollte man vielleicht auch mal lesen... :rolleyes: :D
 
Zurück
Oben