Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.057 Beiträge
 
Delphi XE2 Professional
 
#1

WindowFromPoint

  Alt 27. Nov 2023, 23:27
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 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 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;
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat