![]() |
Mousehook friert alles ein
Seas,
ich habe in meine Anwendung einen fertigen Mousehook (JournalRecord) installiert und dessen Hauptfunktionen in einer "UHooks" Unit ausgelagert, wenn ich nun den MouseHook starte friert mein gesamter Bildschirm ein. Diesen Zustand kann ich nur mit Strg + Alt + Entf rückgängig machen. Kann mir einer sagen inwiefern ich mein Script modifizieren muss, um den MouseHook erfolgreich zu starten? P.S. durch suche mit Haltepunkten bin ich darauf gekommen dass ab dieser Stelle der "Freeze" eintritt:
Delphi-Quellcode:
MouseHook Unit:
FMouseHook := SetWindowsHookEx(WH_JOURNALRECORD, @TFMain.JournalProc, hInstance, 0);
Delphi-Quellcode:
Main Unit:
unit UHooks;
interface uses windows, messages, sysutils, dialogs; var {Mouse Hook} FMouseHook: THandle; FMouseHookActive:Boolean; {Mouse Hook Ende} {Mouse Hook} procedure MouseUsed(var Msg: tagMSG;var Handled: Boolean); procedure StartMouseHook; procedure StopMouseHook; {Mouse Hook Ende} implementation uses UMain; procedure StartMouseHook; begin if not FMouseHookActive then FMouseHook := SetWindowsHookEx(WH_JOURNALRECORD, @TFMain.JournalProc, hInstance, 0); if FMouseHook>0 then FMouseHookActive:=true else FMouseHookActive:=falsE; end; procedure StopMouseHook; begin if FMouseHookActive then begin UnhookWindowsHookEx(FMouseHook); FMouseHookActive:=false; FMouseHook:=0; end; end; procedure MouseUsed(var Msg: tagMSG; var Handled: Boolean); begin Handled := False; if (Msg.message = WM_CANCELJOURNAL) then FMouseHook := SetWindowsHookEx(WH_JOURNALRECORD, @TFMain.JournalProc, hInstance, 0); end; end.
Delphi-Quellcode:
MfG
unit UMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, CheckLst, UComTypes, UHooks; type TFMain = class(TForm) BT_StaSto: TButton; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure BT_StaStoClick(Sender: TObject); private public Recording:boolean; function JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg): Integer; stdcall; end; var FMain: TFMain; implementation {$R *.dfm} function TFMain.JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg): Integer; begin Result := CallNextHookEx(FMouseHook, Code, wParam, Longint(@EventStrut)); if Code < 0 then Exit; if Code = HC_SYSMODALON then Exit; if Code = HC_ACTION then begin {Mouse Action} end; end; procedure TFMain.BT_StaStoClick(Sender: TObject); begin Recording:=not Recording; if Recording then begin // Record Active BT_StaSto.caption:='Stop Recording'; StartMouseHook; end else begin // Record InActive BT_StaSto.caption:='Start Recording'; StopMouseHook; end; end; procedure TFMain.FormClose(Sender: TObject; var Action: TCloseAction); begin StopMouseHook; end; end. //edit: achja kann mir jemand noch sagen in welcher procedure ich mit den MouseHook informationen arbeiten muss Auswahl: "MouseUsed" (aus UHooks) oder "JournalProc" (aus UMain) Ich hab mir gedacht mit "JournalProc" müsste es gehen (bin ja eh nie zum testen gekommen), also von daher ;) |
Re: Mousehook friert alles ein
Du solltest die nächste Callback-Proc vielleicht nach deinem code aufrufen. Bei SetWindowsHookEX sollte auch nicht wParam sondern 0 stehen:
Zitat:
|
Re: Mousehook friert alles ein
dann verstehe ich aber nicht wie das hier gemeint war:
![]() weil da is der code auch in der unit .. //edit ich dachte halt dass der unterschied von JournalRecord zum normalen Hook gerade darin liegt, dass keine Dll erzeugt werden muss |
Re: Mousehook friert alles ein
Moin!
Zitat:
MfG Muetze1 |
Re: Mousehook friert alles ein
Zitat:
Zitat:
//edit: Ich habs mir jetzt überlegt alle procedures die ich kopiert habe in die UHooks zu packen also auch die "Journal Proc" und dann schreib ich einfach eine procedure in FMain die dann von der Handle Procedure des Hooks aufgerufen wird.. nur weiß ich nicht welches die Handle Procedure ist. In dem oben genannten Link wird eine TEventMsg benutzt aber scheinbar geht das ja nicht.. Also meine Frage: In welche Procedure muss ich meinen Procedureaufruf zum Abarbeiten des Message einbauen, und wie komme ich an die verschiedenen Informationen (Mouse Down, Up usw.) MfG |
Re: Mousehook friert alles ein
ich bin auch fehlbar, so isses nicht... zumal ich gerade selbst dranrumfuhrwerke *g*
|
Re: Mousehook friert alles ein
*push*
keine idee? |
Re: Mousehook friert alles ein
na doch, schau mal wie ich es gelöst habe...
![]() spaßeshalber installiere ich da noch einen globalen Mousehook. (Mousehook geht gut mit WH_MOUSE_LL ;) )
Delphi-Quellcode:
WH_MSGFILTER = -1 // local WH_JOURNALRECORD = 0 // global WH_JOURNALPLAYBACK= 1 // global WH_KEYBOARD = 2 // local WH_GETMESSAGE = 3 // local WH_CALLWNDPROC = 4 // local WH_CBT = 5 // local WH_SYSMSGFILTER = 6 // global WH_MOUSE = 7 // local WH_HARDWARE = 8 // global WH_DEBUG = 9 // local WH_SHELL = 10 // local WH_FOREGROUNDIDLE = 11 // local WH_CALLWNDPROCRET = 12 // local WH_KEYBOARD_LL = 13 // global WH_MOUSE_LL = 14 // global |
Re: Mousehook friert alles ein
habe mir deine hook Dll mal angeguckt, blicke da aber leider nicht richtig durch. Hast du keine "InstallHook" Procedure oder sowas in der Art? (Habe jetzt keine gefunden)
Und eigentlich wüsste ich echt gern was an meinem Code falsch ist, sodass dieser Freeze entsteht .. |
Re: Mousehook friert alles ein
Deine JournalProc muss eine freie Routine sein, keine Methode einer Klasse.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 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-2025 by Thomas Breitkreuz