日期:2014-05-19  浏览次数:21162 次

如何判断一个窗体是否被其他窗体完全遮挡,老规矩--路过有分
完全遮挡的意思就是屏幕上完全看不到该窗体
注意该窗体Visible为True
这里说的窗体值Window不限于Form,包括按钮、输入框等等等等

bool   Calc(IntPtr   AHandle)
{
        {   TODO   :   判断句柄为AHandle的窗体是否被完全遮挡   }
}

需要考虑各种复杂的情况--窗体包括不规则形状、还有被半透明窗体遮挡也算可见

不知道有没有现成的API方法可用,提供线索或思路即可,有可调式代码更佳

谢谢关注

------解决方案--------------------
路过
------解决方案--------------------
板凳先
------解决方案--------------------
有个思路 不过不知道用哪个api
先通过hwnd获得该控件的矩形区域,
在取矩形区域是否有控件的hwnd2 然后比较,类似于spy++的实现
------解决方案--------------------
up
------解决方案--------------------
窗体规则不规则到不用考虑,在windows中他们都是Rect只是部分部位可能不可见罢了
------解决方案--------------------

------解决方案--------------------
{获取光标的位置}
GetCursorPos(MousePoint);
Curwindow:=WindowFromPoint(MousePoint);
{获得光标所有者的线程ID}
GetWindowThreadProcessId(Curwindow, @dwThreadID);
{获取路径}
if dwThreadID <> 0 then
begin
hWindow:= OpenProcess(PROCESS_ALL_ACCESS,false,dwThreadID);
if hWindow <> 0 then
begin
if EnumProcessModules(hWindow,@hMod,sizeof(hMod),cbNeeded) then
begin
SetLength(FilePatch, MAX_PATH);
iLen := GetModuleFileNameEx(hWindow, hMod, PCHAR(FilePatch), MAX_PATH);
if iLen <> 0 then
begin
SetLength(FilePatch, StrLen(PCHAR(FilePatch)));
PatchEdit.Text:=FilePatch;
end;
end;
CloseHandle(hWindow);
end;
end;
{存储窗口坐标的结构体的地址}
GetWindowRect(Curwindow,hRect);
GetWindowRect(PrevWindow,OldhRect);
------解决方案--------------------
这个问题偶也很想知道,帮UP
------解决方案--------------------
听说路过有分的哦。
------解决方案--------------------
没仔细想过
------解决方案--------------------
关注...
学习
------解决方案--------------------
那我就路过一下下吧
------解决方案--------------------
关注...
学习

------解决方案--------------------
每个窗体都有一个Region,类似于点的集合.只需用一算法判斷一个窗体是否完全包含另一个窗体即可.
------解决方案--------------------
UP
------解决方案--------------------
学学....
------解决方案--------------------
这就要使用FindWindow首先获取所有的窗口,然后一个循环,对每个窗口的位置(也有一个API,大概是GetWindowInfo吧?存疑)和指定窗口的显示区域判断,再然后可判断两个窗口的Z轴位置(这个API我没用过,在C#中有这个概念,Z轴坐标是独立与XY的第三个坐标轴,相当于层面的意思)。
------解决方案--------------------
列举桌面上的所有可见的窗体,然后用每个窗体的Region组成一个GraphicsPath,然后用给定的窗体的Region来比较看一下是否完全被这个GraphicsPath包含了.
------解决方案--------------------