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;