AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Low Level MouseHook funktioniert nicht wenn Registry offen..
Thema durchsuchen
Ansicht
Themen-Optionen

Low Level MouseHook funktioniert nicht wenn Registry offen..

Ein Thema von Nelphin · begonnen am 28. Feb 2015 · letzter Beitrag vom 28. Feb 2015
Antwort Antwort
Seite 1 von 2  1 2      
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#1

Low Level MouseHook funktioniert nicht wenn Registry offen..

  Alt 28. Feb 2015, 10:35
Delphi-Version: 5
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 28. Feb 2015, 10:41
Du hast nicht zufällig den RegistryEditor als Admin gestartet?
$2B or not $2B
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#3

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

  Alt 28. Feb 2015, 10:53
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

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

  Alt 28. Feb 2015, 10:56
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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

  Alt 28. Feb 2015, 10:58
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).
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 28. Feb 2015, 11:00
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..

Geändert von Nelphin (28. Feb 2015 um 11:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 28. Feb 2015, 12:25
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#8

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

  Alt 28. Feb 2015, 12:59
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ß.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

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

  Alt 28. Feb 2015, 14:08
Was willst du denn eigentlich erreichen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#10

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

  Alt 28. Feb 2015, 14:21
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...
  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 14:48 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