Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   WindowFromPoint (https://www.delphipraxis.net/214171-windowfrompoint.html)

Amateurprofi 27. Nov 2023 22:27

WindowFromPoint
 
Ich möchte einen bestimmten Bereich vom Screen zu kopieren und nutze zur Ermittlung des zu kopierenden Bereichs die unten stehende Funktion.
Vorab:
Es funktioniert, aber ich habe Fragen.
Wenn der Mauszeiger nicht auf ein Fenster zeigt, sondern auf einen leeren Bereich auf dem Desktop, ergibt
Delphi-Quellcode:
WindowFromPoint(MP)
nicht 0.

Mit der modifizierten Version (untere Funktion) kriege ich folgende Ergebnisse.

Code:
MP: 876, 498
Fenster an Mousepos
Win: 65822
Win-Text: "FolderView"
Win-Class: "SysListView32"
Win hat Parent
Parent: 65820
Parent-Text: ""
Parent-Class: "SHELLDLL_DefView"
Parent: 65818
Parent-Text: "Program Manager"
Parent-Class: "Progman"
ST: stControl
WinRect=DesktopRect, Screen kopieren
ST: stScreen
Mein Eindruck ist, dass
Delphi-Quellcode:
WindowFromPoint(MP)
niemals 0 ergibt.
Frage:
Warum ist das so?

Delphi-Quellcode:
type
   TSourceType=(stScreen,stWindow,stControl);
Delphi-Quellcode:
FUNCTION GetSourceRect(var ST:TSourceType):TRect;
var MP:TPoint; Win:HWND;
begin
   GetCursorPos(MP);
   Win:=WindowFromPoint(MP);
   if Win=0 then begin // // Kein Fenster an MousePos. Screen kopieren
      Result:=Screen.DesktopRect;
      ST:=stScreen;
   end else begin // Fenster oder Control kopieren
      if GetParent(Win)<>0 then begin // Ist Control (hat Parent)
         ST:=stControl;
      end else begin // Fenster kopieren
         ST:=stWindow;
      end;
      GetWindowRect(Win,Result);
      if Result=Screen.DesktopRect then ST:=stScreen;
   end;
end;
Delphi-Quellcode:
var List:String;
Delphi-Quellcode:
FUNCTION GetSourceRectList(var ST:TSourceType):TRect;
//------------------------------------------------------------------------------
PROCEDURE Add(const S:String);
begin
   if List<>'' then List:=List+#13;
   List:=List+S;
end;
//------------------------------------------------------------------------------
PROCEDURE AddWin(Win:HWND; const S:String);
var Buf:Array[0..256] of Char;
begin
   Add(S+': '+IntToStr(Win));
   GetWindowText(Win,Buf,255);
   Add(S+'-Text: "'+Buf+'"');
   GetClassName(Win,Buf,255);
   Add(S+'-Class: "'+Buf+'"');
end;
//------------------------------------------------------------------------------
PROCEDURE AddParents(Win:HWND);
var Temp:HWND;
begin
   AddWin(Win,'Parent');
   Temp:=Win;
   repeat
      Win:=Temp;
      Temp:=GetParent(Win);
      if Temp<>0 then AddWin(Temp,'Parent');
   until Temp=0;
end;
//------------------------------------------------------------------------------
var MP:TPoint; Win:HWND;
begin
   GetCursorPos(MP);
   Win:=WindowFromPoint(MP);
   Add('MP: '+IntToStr(MP.X)+', '+IntToStr(MP.Y));
   if Win=0 then begin // Kein Fenster an MousePos. Screen kopieren
      Add('Kein Fenster an Mousepos');
      Add('ST: stScreen');
      Result:=Screen.DesktopRect;
      ST:=stScreen;
   end else begin // Fenster oder Control kopieren
      Add('Fenster an Mousepos');
      AddWin(Win,'Win');
      if GetParent(Win)<>0 then begin // Ist Control (hat Parent)
         Add('Win hat Parent');
         AddParents(GetParent(Win));
         Add('ST: stControl');
         ST:=stControl;
      end else begin // Fenster kopieren
         Add('Win hat kein Parent');
         Add('ST: stWindow');
         ST:=stWindow;
      end;
      GetWindowRect(Win,Result);
      if Result=Screen.DesktopRect then begin
         Add('WinRect=DesktopRect, Screen kopieren');
         Add('ST: stScreen');
         ST:=stScreen;
      end;
   end;
end;

Harry Stahl 27. Nov 2023 23:20

AW: WindowFromPoint
 
Ich würde annehmen, dass Windowfrompoint Dir das DesktopWindow zurückliefert, wenn sonst kein anderes Fenster vorhanden ist (sollte also = GetDesktopwindow) sein.

himitsu 28. Nov 2023 00:05

AW: WindowFromPoint
 
Genau, in Windows ist (fast) alles ein Fenster (selbst ein kleines Edit).
Und der Desktop ist nunmal standardmäßig eine ListView der ersten Instanz einer Explorer.exe.

Ausnahme diese wurde beended, nicht gestartet (KioskModus), oder ist abgestürzt. :stupid:

Kas Ob. 28. Nov 2023 07:22

AW: WindowFromPoint
 
Hi,

If you want to make it fail, then you need a Windows without the Explorer, so either try to kill/disable it, or try on Windows Server Core (without GUI) https://learn.microsoft.com/en-us/wi...top-experience
I love (re)installing these after renting a dedicated server, just removing the GUI and Shell, but it seems Microsoft did removed this feature recently so you can't uninstall/install the GUI any more, shame !

Server 2008/2012 does support this feature unless they ruined it by some update, Server 2016/2019 not sure, the recent ones sure not have the ability to install/uninstall the GUI.

Amateurprofi 28. Nov 2023 11:00

AW: WindowFromPoint
 
Zitat:

Zitat von Harry Stahl (Beitrag 1530147)
Ich würde annehmen, dass Windowfrompoint Dir das DesktopWindow zurückliefert, wenn sonst kein anderes Fenster vorhanden ist (sollte also = GetDesktopwindow) sein.

Danke, Harry,
aber nein, es ist nicht das DeskTopWindow.
Hab mal das DeskTopWindow der Liste hinzugefügt, mit
Delphi-Quellcode:
AddWin(GetDesktopWindow,'Desktop');
Noch ein (für mich) Mysterium:
Das DeskTopWindow hat die Caption "Logitech Gaming Software".

Code:
MP: 1303, 525
Desktop: 65552
Desktop-Text: "Logitech Gaming Software"
Desktop-Class: "#32769"
Fenster an Mousepos
Win: 65822
Win-Text: "FolderView"
Win-Class: "SysListView32"
Win hat Parent
Parent: 65820
Parent-Text: ""
Parent-Class: "SHELLDLL_DefView"
Parent: 65818
Parent-Text: "Program Manager"
Parent-Class: "Progman"
ST: stControl
WinRect=DesktopRect, Screen kopieren
ST: stScreen

Amateurprofi 28. Nov 2023 11:02

AW: WindowFromPoint
 
Zitat:

Zitat von himitsu (Beitrag 1530148)
Genau, in Windows ist (fast) alles ein Fenster (selbst ein kleines Edit).
Und der Desktop ist nunmal standardmäßig eine ListView der ersten Instanz einer Explorer.exe.

Ausnahme diese wurde beended, nicht gestartet (KioskModus), oder ist abgestürzt. :stupid:

Danke himitsu,
aber nein, es ist nicht das DesktopWindow.

himitsu 28. Nov 2023 11:05

AW: WindowFromPoint
 
Zitat:

Logitech Gaming Software
Dann hat sich bei dir eben bösartig ein Hook deines Maustreibers dort reingehackt. :stupid:

Das da klingt aber verdächtig nach dem Desktop und der Explorer.exe
Zitat:

Win: 65822
Win-Text: "FolderView"
Win-Class: "SysListView32"
Win hat Parent
Parent: 65820
Parent-Text: ""
Parent-Class: "SHELLDLL_DefView"
Parent: 65818
Parent-Text: "Program Manager"
Parent-Class: "Progman"

Amateurprofi 28. Nov 2023 11:07

AW: WindowFromPoint
 
Zitat:

Zitat von Kas Ob. (Beitrag 1530150)
Hi,

If you want to make it fail, then you need a Windows without the Explorer, so either try to kill/disable it, or try on Windows Server Core (without GUI) https://learn.microsoft.com/en-us/wi...top-experience
I love (re)installing these after renting a dedicated server, just removing the GUI and Shell, but it seems Microsoft did removed this feature recently so you can't uninstall/install the GUI any more, shame !

Server 2008/2012 does support this feature unless they ruined it by some update, Server 2016/2019 not sure, the recent ones sure not have the ability to install/uninstall the GUI.

Thank youe Kas OB.
Seems i have to live with the situation (don't want to change the system).

Amateurprofi 28. Nov 2023 11:13

AW: WindowFromPoint
 
Zitat:

Zitat von himitsu (Beitrag 1530180)
Zitat:

Logitech Gaming Software
Dann hat sich bei dir eben bösartig ein Hook deines Maustreibers dort reingehackt. :stupid:

Das da klingt aber verdächtig nach dem Desktop und der Explorer.exe
Zitat:

Win: 65822
Win-Text: "FolderView"
Win-Class: "SysListView32"
Win hat Parent
Parent: 65820
Parent-Text: ""
Parent-Class: "SHELLDLL_DefView"
Parent: 65818
Parent-Text: "Program Manager"
Parent-Class: "Progman"

Danke himitsu,
"Dann hat sich bei dir eben bösartig ein Hook deines Maustreibers dort reingehackt."
Ja, so scheint es zu sein.


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