![]() |
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. |
AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
Du hast nicht zufällig den RegistryEditor als Admin gestartet? :stupid:
|
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. |
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 ;) |
AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
Zitat:
|
AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
Zitat:
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.. |
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.
|
AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
Zitat:
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ß. |
AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
Was willst du denn eigentlich erreichen?
|
AW: Low Level MouseHook funktioniert nicht wenn Registry offen..
Zitat:
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 ![]() ich glaub ich geh zurück auf timer, dann läuft er halt im hintergrund... :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 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