Delphi-PRAXiS
Seite 1 von 2  1 2      

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:


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