如何判断我的窗口是否为顶层?

assicen 2010-11-24 07:25:23
因为一些窗口比如QQ MSN有HWND_TOPMOST属性 是永久性的顶层窗口 即使GetFocusWindow返回的是自己的句柄 也有可能被其他的一些窗口覆盖

我想判断在我的窗口之上 有没有被其他窗口覆盖到我的区域 应该如何做呢?

并且 为了用户体验 我的程序不需要把自身设置为顶层(HWND_TOPMOST)窗口

求解
...全文
808 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
assicen 2010-11-25
  • 打赏
  • 举报
回复
EnumWindows是按Z序的顺序枚举窗口啊?我刚知道........
Eleven 2010-11-24
  • 打赏
  • 举报
回复
CRect rect;
vector<HWND> vec;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
HWND hMain = (HWND)lParam;

if(::IsWindowVisible(hwnd))
{
TCHAR szName[MAX_PATH] = {0};
::GetWindowText(hwnd, szName, MAX_PATH-1);
if(_tcslen(szName))
{
if(hwnd == hMain)
{
return FALSE;
}
else
{
AfxMessageBox(szName);
vec.push_back(hwnd);
}
}
}
return TRUE;
}

// 调用
::GetWindowRect(GetSafeHwnd(), &rect);
EnumWindows(EnumWindowsProc, (LPARAM)GetSafeHwnd());

CRect rc;
CRect inter;
for(vector<HWND>::const_iterator iter = vec.begin(); iter != vec.end(); ++iter)
{
HWND hWnd = *iter;
::GetWindowRect(hWnd, &rc);
if(inter.IntersectRect(rect, rc))
{
TCHAR szName[MAX_PATH] = {0};
::GetWindowText(hWnd, szName, MAX_PATH-1);
AfxMessageBox(szName);
}
}
Eleven 2010-11-24
  • 打赏
  • 举报
回复
EnumWindows得到所有的HWND(Z-order之前的所有HWND与你的窗口相比),然后判断该HWND的RECT与你的窗口RECT有交集
assicen 2010-11-24
  • 打赏
  • 举报
回复
我试了下 2楼的办法不行 如果全部hide或者min 桌面就秃了

我再试试10楼的办法..
兔子-顾问 2010-11-24
  • 打赏
  • 举报
回复
GetTopWindow获得z-order最上面的窗体,对比和自己窗体Region的交集,然后多次调用GetNextWindow直到找到自己窗体,这些窗体和自己的region对比。
bragi523 2010-11-24
  • 打赏
  • 举报
回复
处理WM_WINDOWPOSCHANGED试试
assicen 2010-11-24
  • 打赏
  • 举报
回复
回6 7楼 请仔细看问题
兔子-顾问 2010-11-24
  • 打赏
  • 举报
回复
单词拼错了。这样

if(GetForegroundWindow() == this.GetSafeHwnd())
{
//是最上面的,激活了的。
}
兔子-顾问 2010-11-24
  • 打赏
  • 举报
回复
if(GetForeGroundWnd() == this.GetSafeHwnd())
{
//是最上面的,激活了的。
}
assicen 2010-11-24
  • 打赏
  • 举报
回复
2楼的办法应该是可以的

3楼的朋友 你的方法我之前也想到过 但是没办法判断这个窗口到底是在前还是在后

看看还有没有其他的答案....
luawkk 2010-11-24
  • 打赏
  • 举报
回复
API FindWindow
傻X 2010-11-24
  • 打赏
  • 举报
回复
EnumWindows窗体存入CRect数组里,然后做比较,和你主程序窗体重叠的就干掉或者最小话
m_tornado 2010-11-24
  • 打赏
  • 举报
回复
BOOL EnumChildWindows( HWND hWndParent,
WNDENUMPROC lpEnumFunc,
LPARAM lParam
);

窗口句柄写DeskTop的,在回调函数里判断是不是自己的窗口,不是自己的就Min
assicen 2010-11-24
  • 打赏
  • 举报
回复
或者换个问法 就是 如何判断我的窗口是完全显示出来的?

并且如果我的窗口没有被完全显示的话 那么在我的窗口之上的窗口句柄如何获得?我需要把压在我窗口上的都MIN或者MOVE掉
haogeai123 2010-11-24
  • 打赏
  • 举报
回复
EnumWindow,判断在之前的窗口的区域是否和自己窗口的区域重叠(GetWindowRect),
Sou2012 2010-11-24
  • 打赏
  • 举报
回复
其实一个函数就可以判断了。。。呵呵。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧