首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么判断一个窗体是否被其他窗体完全遮挡,老规矩-路过有分

2011-12-26 
如何判断一个窗体是否被其他窗体完全遮挡,老规矩--路过有分完全遮挡的意思就是屏幕上完全看不到该窗体注意

如何判断一个窗体是否被其他窗体完全遮挡,老规矩--路过有分
完全遮挡的意思就是屏幕上完全看不到该窗体
注意该窗体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包含了.
------解决方案--------------------


列举桌面上的所有可见的窗体,然后用每个窗体的Region组成一个GraphicsPath,然后用给定的窗体的Region来比较看一下是否完全被这个GraphicsPath包含了.
--------
这样如何判断谁在上谁在下?
[解决办法]
路过
[解决办法]
路过
[解决办法]
你的目的是判断本程序还是所有程序呢- -#
[解决办法]
GetWindowRect 取目标hwnd的Rect
取Rect内任意一点
用上面的代码判断这点内的控件的hwnd,和Rect 比较hwnd和Rect
[解决办法]
up
[解决办法]
不懂
仰視,接分
[解决办法]
学习。。
[解决办法]
路过,分全给我吧
[解决办法]
路过接分
[解决办法]
mark~~以后用到再看~~
[解决办法]
路过
[解决办法]
up
[解决办法]
路过 !!
[解决办法]
路过
[解决办法]
绝对的路过,只是路过
[解决办法]
只能说,太难,路过吧=_=
[解决办法]
路过,看看高手。。
[解决办法]
路过算了
[解决办法]
顺路
[解决办法]
路过
[解决办法]
hitTest消息
[解决办法]
WindowFromPoint函数,

把窗口的所有的点都作一边,只要取得窗口句柄和目标窗口的一样,就说明没被挡住,否则就是被挡住鸟。

虽然慢了一点,也是一种方法。
[解决办法]
来学习并接分的
[解决办法]

[解决办法]
强制刷新,然后判断该窗体是否执行了Paint

你试过对本程序内部,如果完全遮挡则不执行Paint么?也许是执行了Paint但是在一个if语句以后就return呢?


使我想到一个事,Windows是如何判断什么时候该执行此窗体的Paint的呢? 如果这个判断的过程我们假设可以拿到,也许问题就有望在这一步解决掉。这个判断的某一步我们可以通过API得到就好了,不过首先是到底是否存在这个判断过程。,


[解决办法]
枚举所有的窗口
判断窗口是否可见,如果可见,计算窗口跟目标窗口的重叠区域

当所有窗口枚举完毕后,计算重叠区域是否完全覆盖了目标窗口
[解决办法]
up
[解决办法]
crossrowman(godi) ( ) 信誉:100 Blog 加为好友 2007-05-10 00:04:06 得分: 0
枚举所有的窗口
判断窗口是否可见,如果可见,计算窗口跟目标窗口的重叠区域
当所有窗口枚举完毕后,计算重叠区域是否完全覆盖了目标窗口


这样不行的,如果目标窗体在最上面,后面有个大大的窗体完全包含了目标窗体的整个区域,同样是成立的,但此时目标窗体并没有被遮挡





[解决办法]
窗体的起点+长,宽 用数学区域来搞不知道可不可以。

起点在比较窗体的右下角,终点在比较窗体的左上角。
[解决办法]
关注

热点排行