![]() |
auf richtigen InputDesktop prüfen (für GetCursorPos)
Hallo,
ich habe gerade gelernt das Mouse.Cursor (also GetCursorPos) eine Exception wirft wenn der Desktop der Anwendung nicht der InputDeskop ist. Das ![]() Ich habe folgendes probiert (Delphi 5):
Delphi-Quellcode:
Aber das schlägt immer fehl weil "hInputDesktop <> hProcDesktop".
function CheckDesktopIsActive: boolean;
var hProcDesktop : HDESK; hInputDesktop : HDESK; begin Result := false; hInputDesktop := 0; hProcDesktop := 0; try //Handle des Desktops auf dem das Programm läuft ermitteln hProcDesktop := GetThreadDesktop(GetCurrentThreadId); if hProcDesktop = 0 then Exit; //Handle des aktuellen Eingabe-Dektops ermitteln hInputDesktop := OpenInputDesktop(0, false, 0); Result := hProcDesktop = hInputDesktop; finally if hInputDesktop <> 0 then CloseDesktop(hInputDesktop); end; end; Oder reicht es etwa schon aus das OpenInputDesktop einen Wert ungleich 0 zurückliefert? Das würde bestimmt so sein wenn es einer Anwendung auf Desktop A nicht erlaubt ist Desktop B zu öffnen. Aber ob das so ist... keine Ahnung. |
AW: auf richtigen InputDesktop prüfen (für GetCursorPos)
Ich habe da mal ein Update:
OpenInputDesktop funktioniert beim Login tatsächlich. In diesen Fall liefert mir die Methode 0 zurück. Wenn allerdings der Bildschirmschoner (mit Kennwortabfrage beim der Reaktivierung!) gestartet wird gibt die Funktion weiterhin einen Wert <> 0 zurück. Mouse.CursorPos liefert aber trotzdem eine Exception. |
AW: auf richtigen InputDesktop prüfen (für GetCursorPos)
Kennst du dich mit Zeigern aus?
Ist fast genauso, wie mit Handles (HDESK). Du vergleichst Speicheraddressen, um zu prüfen, ob der Inhalt derselbe ist.
Delphi-Quellcode:
var P1, P2 : PINTEGER;
begin .. P1^ := 1234; P2^ := 1234; if P1 = P2 then OK; |
AW: auf richtigen InputDesktop prüfen (für GetCursorPos)
Zitat:
Such mal die Funktion in der MSDN, da steht: Zitat:
|
AW: auf richtigen InputDesktop prüfen (für GetCursorPos)
Zitat:
Zitat:
Die Handles zu vergleichen habe ich ja schon in meinem Beispiel bei der Threaderöffnung versucht.
Delphi-Quellcode:
Result := hProcDesktop = hInputDesktop;
Zitat:
Ich habe das getestet indem ich in meinem Programm einfach alle 5 Sek. die Funktion und die Cursorposition abgefragt und das Ergebnis in eine Logdatei geschrieben habe. Dann habe ich gewartet bis der Bildschirmschoner startet. Während der Bildschirmschoner läuft bekomme ich - wie oben beschrieben - einen Wert <> 0 zurück. Die Abfrage der CursorPosition liefert jedoch schon eine Exception. |
AW: auf richtigen InputDesktop prüfen (für GetCursorPos)
Zitat:
Um nochmal auf Pointer von Delphi zu kommen: Dort hast du in meinem Beispiel gesehen, dass die Werte dieselben sind. Das ist sozusagen dieselbe Kernelklasse. Nur die Zeiger P1 und P2 haben verschiedene Speicheraddresse. Würdest du jetzt da auf die Idee kommen und die Inhalte vergleichen wollen, indem zu P1 mit P2 direkt, als die Speicherstellen an denen sie stehen, vergleichst? Du musst schon den Namen des Desktops deiner Anwendung herausfinden und dann vergleichen...Nutze dazu GetUserObjectInformation oder ![]() Wenn der Anmeldebildschirm oder UAC Bildschirm aktiv ist, dann kann eine normale Anwendung nicht mehr darauf zugreifen und jede API verweigert den Zugriff auf den Desktop. Sobald du 0 für HDESK von OpenInputDesktop zurückbekommst, hast du keinen Zugriff mehr auf den Desktop des Benutzers. Dass du trotzdem Zugriff auf den Desktop des Bildschirmschoner hast liegt daran, dass der Bildschirmschoner in einem eigenen Desktop (InputDesktop = Screensaver) gestartet wird, der Lesezugriff für den Benutzer zulässt (so kann man erkennen, dass der Bildschirmschoner aktiv ist). Sobald der Bildschirmschoner jedoch beendet wird, ist der Winlogon Desktop aktiv und eine normale Anwendung kann garnichts mehr damit anfangen (GetLastError = 5 = Access Denied) Erst wenn der Benutzer sich mit seinem Passwort verifiziert, kann man den normalen Desktop (default) benutzen. |
AW: auf richtigen InputDesktop prüfen (für GetCursorPos)
Zitat:
Zitat:
Zitat:
Hier nochmal der fertige Code falls Jemand das gleiche Problem hat:
Delphi-Quellcode:
Vielen Dank für die Erleuchtung :thumb:
function CheckDesktopIsActive: boolean;
var hThreadDT : HDESK; hInputDT : HDESK; iLen : DWORD; pDesktopName : array[0..255] of char; sThreadDTName : string; sInputDTName : string; begin Result := false; hInputDT := 0; hThreadDT := 0; try //Handles ermitteln hThreadDT := GetThreadDesktop(GetCurrentThreadId); if hThreadDT = 0 then Exit; hInputDT := OpenInputDesktop(0, false, 0); if hInputDT = 0 then Exit; //Namen zu den Handles ermitteln GetUserObjectInformation(hThreadDT, UOI_NAME, @pDesktopName, 256, iLen); SetString(sThreadDTName, pDesktopName, Pred(iLen)); GetUserObjectInformation(hInputDT, UOI_NAME, @pDesktopName, 256, iLen); SetString(sInputDTName, pDesktopName, Pred(iLen)); //Namen vergleichen Result := sThreadDTName = sInputDTName; finally if hInputDT <> 0 then CloseDesktop(hInputDT); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 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