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:
FMouseHook := SetWindowsHookEx(WH_JOURNALRECORD, @TFMain.JournalProc, hInstance, 0);
MouseHook Unit:
Delphi-Quellcode:
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.
Main Unit:
Delphi-Quellcode:
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.
MfG
//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