完全遮挡的意思就是屏幕上完全看不到该窗体
注意该窗体Visible为True
这里说的窗体值Window不限于Form,包括按钮、输入框等等等等bool Calc(IntPtr AHandle)
{
{ TODO : 判断句柄为AHandle的窗体是否被完全遮挡 }
}需要考虑各种复杂的情况--窗体包括不规则形状、还有被半透明窗体遮挡也算可见不知道有没有现成的API方法可用,提供线索或思路即可,有可调式代码更佳谢谢关注
注意该窗体Visible为True
这里说的窗体值Window不限于Form,包括按钮、输入框等等等等bool Calc(IntPtr AHandle)
{
{ TODO : 判断句柄为AHandle的窗体是否被完全遮挡 }
}需要考虑各种复杂的情况--窗体包括不规则形状、还有被半透明窗体遮挡也算可见不知道有没有现成的API方法可用,提供线索或思路即可,有可调式代码更佳谢谢关注
先通过hwnd获得该控件的矩形区域,
在取矩形区域是否有控件的hwnd2 然后比较,类似于spy++的实现
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);
--------
这样如何判断谁在上谁在下?
这个方法不是很通用,对于其他进程的窗体判断就很麻烦,贴出来扩展思路用private bool WindowPaint = false;
private void button1_Click(object sender, EventArgs e)
{
PaintEventHandler vPaintEventHandler = new PaintEventHandler(window_Paint);
button2.Paint += vPaintEventHandler;
WindowPaint = false;
button2.Invalidate();
Application.DoEvents();
button2.Paint -= vPaintEventHandler;
Text = WindowPaint.ToString();
}void window_Paint(object sender, PaintEventArgs e)
{
WindowPaint = true;
}
取Rect内任意一点
用上面的代码判断这点内的控件的hwnd,和Rect 比较hwnd和Rect
使我想到一个事,Windows是如何判断什么时候该执行此窗体的Paint的呢? 如果这个判断的过程我们假设可以拿到,也许问题就有望在这一步解决掉。这个判断的某一步我们可以通过API得到就好了,不过首先是到底是否存在这个判断过程。,
枚举所有的窗口
判断窗口是否可见,如果可见,计算窗口跟目标窗口的重叠区域
当所有窗口枚举完毕后,计算重叠区域是否完全覆盖了目标窗口这样不行的,如果目标窗体在最上面,后面有个大大的窗体完全包含了目标窗体的整个区域,同样是成立的,但此时目标窗体并没有被遮挡
Invalidate一下,如果没有产生OnPaint事件就是看不见的。