Einzelnen Beitrag anzeigen

Benutzerbild von Coder1990
Coder1990

Registriert seit: 3. Nov 2007
116 Beiträge
 
Delphi 2005 Personal
 
#1

Mousehook friert alles ein

  Alt 31. Jul 2008, 12:36
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
  Mit Zitat antworten Zitat