Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Low Level MouseHook funktioniert nicht wenn Registry offen.. (https://www.delphipraxis.net/184126-low-level-mousehook-funktioniert-nicht-wenn-registry-offen.html)

Nelphin 28. Feb 2015 09:35

Delphi-Version: 5

Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Hallo,

In einem meiner Projekte möchte ich gerne mit WH_MOUSE_LL arbeiten.
Das funktioniert auch soweit sehr gut.
Gestern fiel mir aber auf das wenn ich das Registry Fenster (in Start RegEdit eingeben) im Vordergrund habe, stoppt der MouseHook.

Fragen hierzu:

Warum ist das Verhalten so?
Gibt es weitere Anwendungen bei denen der LowLevel Mousehook nicht funktioniert? Denn mein Programm soll möglichst immer funktionieren unabhängig davon, welches Fenster vorne ist.


Hier eine Beispielanwendung die das Problem nachbildet:
Das kleine Beispiel soll einfach die Caption einer Form hochzählen wenn die Maus bewegt wird, funktioniert bei mir auch wunderbar, nur nicht wenn die Registry im Vordergrund ist.


Delphi-Quellcode:
unit Unit11;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm11 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    var q : integer;
    { Public-Deklarationen }
  end;

var
  Form11: TForm11;

implementation

{$R *.dfm}
    var
  HookHandle: Cardinal;

Type
  tagMSLLHOOKSTRUCT = record
    POINT: TPoint;
    mouseData: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: DWORD;
  end;

  TMSLLHOOKSTRUCT = tagMSLLHOOKSTRUCT;
  PMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT;

function LowLevelMouseProc(nCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;

begin
  if (nCode >= 0) then
  begin
    if wParam = WM_MOUSEMOVE then
    begin
      inc(form11.q);
      Form11.Caption := inttostr(form11.q);


    end;

  end;
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;

function InstallMouseHook: Boolean;
begin
  Result := False;
  if HookHandle = 0 then
  begin
    HookHandle := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);
    Result := HookHandle <> 0;
  end;
end;


procedure TForm11.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    if HookHandle <> 0 then
    UnhookWindowsHookEx(HookHandle);
end;

procedure TForm11.FormCreate(Sender: TObject);
begin
q:=0;
InstallMouseHook;

end;

end.

himitsu 28. Feb 2015 09:41

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Du hast nicht zufällig den RegistryEditor als Admin gestartet? :stupid:

Nelphin 28. Feb 2015 09:53

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Doch, warum?

Äh EDIT... nein eigentlich nicht, Windows fragt ob ich zulassen will das das Programm Aenderungen an meinem Computer vornimmt. Das muss ich mit Ja beantworten.

Sir Rufo 28. Feb 2015 09:56

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Und die Benachrichtigung vom Hook erfolgt in irgendeinem Thread-Kontext, darum sollten die Zugriffe auf die Form dort auch synchronisiert erfolgen (bzw. besser ist es diese nicht blockierend an die Form zu senden).

Jupp und wenn der Benutzer-Kontext sich ändert, dann gibt es für den Benutzer-Kontext der Anwendung keine Maus-Ereignisse mehr ;)

Sir Rufo 28. Feb 2015 09:58

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Zitat:

Zitat von Nelphin (Beitrag 1291847)
Doch, warum?

Äh EDIT... nein eigentlich nicht, Windows fragt ob ich zulassen will das das Programm Aenderungen an meinem Computer vornimmt. Das muss ich mit Ja beantworten.

Das ist die UAC. Du bist zwar Admin aber läufst mit normalen Rechten. Erst wenn Admin-Rechte benötigt werden, wird nachgefragt und dann der Benutzer-Kontext gewechselt. Aber eben nur für diese Aktion/diese Anwendung (regedit.exe).

Nelphin 28. Feb 2015 10:00

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Zitat:

Zitat von Sir Rufo (Beitrag 1291848)
Und die Benachrichtigung vom Hook erfolgt in irgendeinem Thread-Kontext, darum sollten die Zugriffe auf die Form dort auch synchronisiert erfolgen (bzw. besser ist es diese nicht blockierend an die Form zu senden).

Jupp und wenn der Benutzer-Kontext sich ändert, dann gibt es für den Benutzer-Kontext der Anwendung keine Maus-Ereignisse mehr ;)

puh... leider verstehe ich nur Bahnhof.
was bedeutet das fette synchronisiert? (Vielleicht auf meinen Beispielcode bezogen?)

Benutzer-Kontext?

ich habe jetzt diverse andere Programme als Admin gestartet und der mousehook arbeitet wie er soll weiter... nur wenn das registry fenster vorne ist eben nicht.

EDIT: oops verkuckt, der mousehook arbeitet tatsächlich nicht wenn ich anwendungen als Admin starte... (hatte nen workaround mit timer laufen der funktioniert)

Also gibt es Lösung die Benutzer-Kontext unabhängig funktioniert? Falls nicht muß ich mit timer arbeiten und den mousehook vergessen..

Bernhard Geyer 28. Feb 2015 11:25

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Den Mousehook wirst du vergessen können. Das was MS gemacht hat war mit voller absicht. Es gab scheinbar ein paar Viren/Würmer die mit an Firewall/Virenscanner gesendeten WM-MOUSE-Events diese abgeschaltet haben, genauso als wenn es der User mit der Maus gemacht hätte. Diese Sicherheitslücke wurde mit der UAC geschlossen. Was natürlich den Nachteil das auch legitime Anwendungen keinen Zugriff mehr auf per UAC gestartete Anwendungen haben.

Nelphin 28. Feb 2015 11:59

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1291853)
Den Mousehook wirst du vergessen können. Das was MS gemacht hat war mit voller absicht. Es gab scheinbar ein paar Viren/Würmer die mit an Firewall/Virenscanner gesendeten WM-MOUSE-Events diese abgeschaltet haben, genauso als wenn es der User mit der Maus gemacht hätte. Diese Sicherheitslücke wurde mit der UAC geschlossen. Was natürlich den Nachteil das auch legitime Anwendungen keinen Zugriff mehr auf per UAC gestartete Anwendungen haben.

okay blöd...

kann man das Abfragen also ob der Benutzer Kontext gewechselt wird?
Dann könnte ich nur in dem Fall den Timer anwerfen und ansonsten mit Hook arbeiten... ich finds blöd wenn ich permanent per timer die mauskoordinaten abfragen muß.

Luckie 28. Feb 2015 13:08

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Was willst du denn eigentlich erreichen?

Nelphin 28. Feb 2015 13:21

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Zitat:

Zitat von Luckie (Beitrag 1291859)
Was willst du denn eigentlich erreichen?

Verschiedene Dinge die mauspositionsabhängig sind.

Also zum Beispiel die aktuellen Mauskoordinaten anzeigen (X,Y) und eventuell darauf reagieren.
Das hatte ich bislang immer über Timer gelöst also ein timer ruft ständig GetCursorPos(); auf und ich verwerte das dann.
Eigentlich würde es ja aber genügen auf ein mousemove zu reagieren, da ich das aber desktopweit will, also auch außerhalb meiner Forms kam ich zum low level mousehook, der ja soweit auch schön arbeitet aber eben nicht wenn die registry, bzw wie ich jetzt gelernt habe wenn ein programm als admin gestartet wird.

ich hab jetzt eben versucht über das hier den Nutzerwechsel abzufragen aber das funktioniert leider nicht bei dieser admin geschichte

ich glaub ich geh zurück auf timer, dann läuft er halt im hintergrund... :roll:

Luckie 28. Feb 2015 14:24

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Geht es etwas konkreter? Das hört sich alles nach Frickelei an, was du da machst.

Nelphin 28. Feb 2015 15:20

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Zitat:

Zitat von Luckie (Beitrag 1291862)
Geht es etwas konkreter? Das hört sich alles nach Frickelei an, was du da machst.

??

Mauskoordinaten zu jedem Zeitpunkt anzeigen.

was daran ist denn nicht konkret?

Aviator 28. Feb 2015 16:10

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Also möglich sein müsste es. Ich habe ein Programm um Screenshots zu machen. Das zeigt mir beim Erstellen des Screenshots die Mauskoordinaten an, da man einen Bereich markieren kann, der aufgenommen werden soll. Der funktioniert auch, wenn Regedit geöffnet ist. Wie die das allerdings intern machen, keine Ahnung. :roll:

Sir Rufo 28. Feb 2015 16:35

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Sobald eine "normale" Anwendung wieder aktiviert wird läuft es auch wieder, trotz dass RegEdit läuft.

Das ist also kein Hexenwerk.

Nelphin 28. Feb 2015 17:08

AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
 
Zitat:

Zitat von Sir Rufo (Beitrag 1291871)
Sobald eine "normale" Anwendung wieder aktiviert wird läuft es auch wieder, trotz dass RegEdit läuft.

Das ist also kein Hexenwerk.

Das verstehe ich wieder nicht... ???

Es gibt eine Lösung, über Timer - die auch nur funktioniert weil mir beispielsweise Mausklicks für mein Projekt egal sind. Mal angenommen ich würde gerne eine kleine Animation oder einen kleinen Sound abfeuern bei jedem Mausklick dann würde diese Animation in "als Admin gestarteten" Fenstern ja auch nicht funktionieren weil der Mousehook dann die Klicks nicht mitbekommt. In meinem Projekt geht es mir ja zum Glück nur um die Cursor Position aber die will ich eben immer wissen und nicht nur wenn "normale" Anwendungen vorne sind.

Kennt denn jemand eine Alternative zur Timer Lösung, die auch Klicks mitbekommt?

Danke :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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