Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mousehook friert alles ein (https://www.delphipraxis.net/118094-mousehook-friert-alles-ein.html)

Coder1990 31. Jul 2008 11:36


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:
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 ;)

helgew 31. Jul 2008 11:49

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:

hMod
[in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.
Konsequenz: Wenn du einen Globalen Hook willst, musst du die CallbackProc in eine DLL auslagern und das durch LoadLibrary zurückgegebenen Modulhandle verwenden ( Kommunikation des DLL-Codes mit dem Programm geht dann über Message Broadcast, Pipes oder DDE.. wie du willst )

Coder1990 31. Jul 2008 12:06

Re: Mousehook friert alles ein
 
dann verstehe ich aber nicht wie das hier gemeint war:
Klick


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

Muetze1 31. Jul 2008 12:59

Re: Mousehook friert alles ein
 
Moin!

Zitat:

Zitat von Coder1990
ich dachte halt dass der unterschied von JournalRecord zum normalen Hook gerade darin liegt, dass keine Dll erzeugt werden muss

Da liegst du auch vollkommen richtig. JournalHook und PlaybackHook können innerhalb der Anwendung eingehängt werden ohne DLL.

MfG
Muetze1

Coder1990 31. Jul 2008 13:09

Re: Mousehook friert alles ein
 
Zitat:

Zitat von helgew
Konsequenz: Wenn du einen Globalen Hook willst, musst du die CallbackProc in eine DLL auslagern und das durch LoadLibrary zurückgegebenen Modulhandle verwenden ( Kommunikation des DLL-Codes mit dem Programm geht dann über Message Broadcast, Pipes oder DDE.. wie du willst )

Zitat:

Zitat von Muetze1
Da liegst du auch vollkommen richtig. JournalHook und PlaybackHook können innerhalb der Anwendung eingehängt werden ohne DLL.

also entweder ist der JournalHook nicht global (was ich aber nicht glaube da der in der Delphi Hilfe ja empfohlen wird für Makro Erstellung und die verläuft ja bekanntlich außerhalb der Form bzw. der Anwendung) oder mein Fehler liegt woanders und nicht an der fehlenden Dll.

//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

helgew 31. Jul 2008 14:14

Re: Mousehook friert alles ein
 
ich bin auch fehlbar, so isses nicht... zumal ich gerade selbst dranrumfuhrwerke *g*

Coder1990 3. Aug 2008 11:52

Re: Mousehook friert alles ein
 
*push*
keine idee?

helgew 3. Aug 2008 12:34

Re: Mousehook friert alles ein
 
na doch, schau mal wie ich es gelöst habe...

http://www.delphipraxis.net/internal...t.php?t=139471

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

Coder1990 3. Aug 2008 15:56

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 ..

Apollonius 3. Aug 2008 16:05

Re: Mousehook friert alles ein
 
Deine JournalProc muss eine freie Routine sein, keine Methode einer Klasse.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz