AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) auf richtigen InputDesktop prüfen (für GetCursorPos)
Thema durchsuchen
Ansicht
Themen-Optionen

auf richtigen InputDesktop prüfen (für GetCursorPos)

Ein Thema von VizeTE · begonnen am 1. Nov 2010 · letzter Beitrag vom 3. Nov 2010
 
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#6

AW: auf richtigen InputDesktop prüfen (für GetCursorPos)

  Alt 3. Nov 2010, 15:12
...Handles zeigen auf Objekte im Kernelstrukturen (Klassen) von Windows. Damit man sie nicht einfach ändern kann, bekommt man eben eine Nummer (ein Handle), die die Struktur eindeutig in deinem Prozess zuordbar macht. D.h. du kannst beliebige Handles anfordern, die auf dieselbe Struktur im Kernel zeigen...
OK, wieder etwas dazu gelernt. Die Problematik mit Pointern ist mir durchaus bewusst. Ich bin aber davon ausgegangen das es pro Kernelstruktur nur ein Handle gibt und ich somit immer das selbe Handle bekomme wenn ich die selbe Struktur abfrage.
Du musst schon den Namen des Desktops deiner Anwendung herausfinden und dann vergleichen
Habe es mit GetUserObjectInformation gelöst. Ist ja ein überschaubarer Aufwand und scheint prima zu funktionieren.
...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).
Der Punkt der mich überrascht hat war das ich auf den Screensaver Lesezugriff habe aber dennoch nicht die Position der Mouse abrufen kann. Das macht zwar inhaltlich nicht viel Sinn aber ich dachte wenn OpenInputDesktop funktioniert sollte auch GetMousePos funktionieren. GetMousePos verursacht dann aber eine Exception. Aber mit der obigen Lösung (Vergleich des Desktopnamen) lässt sich das ja prima abfangen.

Hier nochmal der fertige Code falls Jemand das gleiche Problem hat:
Delphi-Quellcode:
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;
Vielen Dank für die Erleuchtung
  Mit Zitat antworten Zitat
 


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 16:38 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