AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mousehook friert alles ein

Offene Frage von "Coder1990"
Ein Thema von Coder1990 · begonnen am 31. Jul 2008 · letzter Beitrag vom 3. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Coder1990
Coder1990

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

Mousehook friert alles ein

  Alt 31. Jul 2008, 11: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
helgew

Registriert seit: 30. Jul 2008
125 Beiträge
 
#2

Re: Mousehook friert alles ein

  Alt 31. Jul 2008, 11:49
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 )
  Mit Zitat antworten Zitat
Benutzerbild von Coder1990
Coder1990

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

Re: Mousehook friert alles ein

  Alt 31. Jul 2008, 12:06
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Mousehook friert alles ein

  Alt 31. Jul 2008, 12:59
Moin!

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
  Mit Zitat antworten Zitat
Benutzerbild von Coder1990
Coder1990

Registriert seit: 2. Nov 2007
116 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Mousehook friert alles ein

  Alt 31. Jul 2008, 13:09
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 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
  Mit Zitat antworten Zitat
helgew

Registriert seit: 30. Jul 2008
125 Beiträge
 
#6

Re: Mousehook friert alles ein

  Alt 31. Jul 2008, 14:14
ich bin auch fehlbar, so isses nicht... zumal ich gerade selbst dranrumfuhrwerke *g*
  Mit Zitat antworten Zitat
Benutzerbild von Coder1990
Coder1990

Registriert seit: 2. Nov 2007
116 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Mousehook friert alles ein

  Alt 3. Aug 2008, 11:52
*push*
keine idee?
  Mit Zitat antworten Zitat
helgew

Registriert seit: 30. Jul 2008
125 Beiträge
 
#8

Re: Mousehook friert alles ein

  Alt 3. Aug 2008, 12:34
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
  Mit Zitat antworten Zitat
Benutzerbild von Coder1990
Coder1990

Registriert seit: 2. Nov 2007
116 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Mousehook friert alles ein

  Alt 3. Aug 2008, 15:56
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 ..
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Mousehook friert alles ein

  Alt 3. Aug 2008, 16:05
Deine JournalProc muss eine freie Routine sein, keine Methode einer Klasse.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
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