解决方法
几年前,我对表单遇到了同样的问题:我正在寻找一种方法来确定表单是否实际可见(甚至只是部分)给用户.
特别是当它应该是可见的并且显示为True但是窗口实际上完全落后于另一个窗口.
这是代码,它可以适用于WinControl ……
特别是当它应该是可见的并且显示为True但是窗口实际上完全落后于另一个窗口.
这是代码,它可以适用于WinControl ……
{----------------------------------------------------------} function IsMyFormCovered(const MyForm: TForm): Boolean; var MyRect: TRect; MyRgn,TempRgn: HRGN; RType: Integer; hw: HWND; begin MyRect := MyForm.BoundsRect; // screen coordinates MyRgn := CreateRectRgnIndirect(MyRect); // MyForm not overlapped region hw := GetTopWindow(0); // currently examined topwindow RType := SIMPLEREGION; // MyRgn type // From topmost window downto MyForm,build the not overlapped portion of MyForm while (hw<>0) and (hw <> MyForm.handle) and (RType <> NULLREGION) do begin // nothing to do if hidden window if IsWindowVisible(hw) then begin GetWindowRect(hw,MyRect); TempRgn := CreateRectRgnIndirect(MyRect);// currently examined window region RType := CombineRgn(MyRgn,MyRgn,TempRgn,RGN_DIFF); // diff intersect DeleteObject( TempRgn ); end; {if} if RType <> NULLREGION then // there's a remaining portion hw := GetNextWindow(hw,GW_HWNDNEXT); end; {while} DeleteObject(MyRgn); Result := RType = NULLREGION; end; function IsMyFormVisible(const MyForm : TForm): Boolean; begin Result:= MyForm.visible and isWindowVisible(MyForm.Handle) and not IsMyFormCovered(MyForm); end;