已知对话框窗体句柄,怎样判断它是自定义对话框窗体还是属于系统对话框窗体??

gaoxiaowei 2012-03-15 03:37:25
如题已知窗体句柄,怎样判断它是自定义对话框窗体还是属于系统对话框??
...全文
164 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoxiaowei 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gfm688 的回复:]

CFileDialog 就是对 GetOpenFileName / GetSaveFileName 的封装,使用Comdlg32.dll
还有 目录选择对话框是SHBrowseForFolder,使用Shell32.dll
[/Quote]

ok了,其实我可以判断ModuleName不属于我的进程名字即可,非常感谢,接分吧 哈哈
zero_226 2012-03-15
  • 打赏
  • 举报
回复
可不可以读取窗口的属性,看看这些属性里有没有自定义的属性?
Lactoferrin 2012-03-15
  • 打赏
  • 举报
回复
看类名
gfm688 2012-03-15
  • 打赏
  • 举报
回复
CFileDialog 就是对 GetOpenFileName / GetSaveFileName 的封装,使用Comdlg32.dll
还有 目录选择对话框是SHBrowseForFolder,使用Shell32.dll
gaoxiaowei 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gfm688 的回复:]

就是判断窗口是哪个模块的了

如果是MessageBox, 则GetWindowModuleFileName第二个参数返回User32.dll的的路径
[/Quote]

这个对messagebox 可以做过滤,对CFileDialog没有过滤掉
gaoxiaowei 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gfm688 的回复:]

就是判断窗口是哪个模块的了

如果是MessageBox, 则GetWindowModuleFileName第二个参数返回User32.dll的的路径
[/Quote]

我明白了,我试试看。
gfm688 2012-03-15
  • 打赏
  • 举报
回复
就是判断窗口是哪个模块的了

如果是MessageBox, 则GetWindowModuleFileName第二个参数返回User32.dll的的路径
gfm688 2012-03-15
  • 打赏
  • 举报
回复
试试 GetWindowModuleFileName
gaoxiaowei 2012-03-15
  • 打赏
  • 举报
回复
高手支招啊
gaoxiaowei 2012-03-15
  • 打赏
  • 举报
回复
我把代码贴一下:


LRESULT CALLBACK CSkinXImpl::HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT cwps;

if( (nCode == HC_ACTION) && !::IsBadReadPtr( (LPVOID)lParam, sizeof(CWPSTRUCT)) )
{
CWPSTRUCT * pCwps = reinterpret_cast<CWPSTRUCT*>( lParam );
CopyMemory( &cwps, (LPVOID)lParam, sizeof(CWPSTRUCT) );
switch(cwps.message)
{
case WM_CREATE:
{
TCHAR szClass[MAX_PATH];
memset( szClass, 0, sizeof( szClass ) );
GetClassName(cwps.hwnd, szClass, MAX_PATH);
//这个时候想过滤掉系统对话框,不做换肤处理

// skin
CWidgetHookBase* pWidget = NULL;
pWidget = CWidgetFactory::Instance()->CreateWidget(szClass);
if (pWidget) pWidget->Install(cwps.hwnd);
break;
}
default:
break;
}
}

return CallNextHookEx((HHOOK)CSkinXImpl::m_hHook, nCode, wParam, lParam);
}
gaoxiaowei 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gfm688 的回复:]

不好的意思,我理解错楼主的意思了,刚刚想到系统对话框是指MessageBox那些
[/Quote]

没关系,感谢你的回答。
gfm688 2012-03-15
  • 打赏
  • 举报
回复
不好的意思,我理解错楼主的意思了,刚刚想到系统对话框是指MessageBox那些

gaoxiaowei 2012-03-15
  • 打赏
  • 举报
回复
sorry,补充一下:现在是在1个进程里面,判断对话框窗体 是自己设计的窗体,还是系统通用的窗体。
通用窗体如:CFileDialog 、Messagebox弹出的窗体
孤魂游梦 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gaoxiaowei 的回复:]

引用 2 楼 gfm688 的回复:

GetWindowThreadProcessId
OpenProcess
EnumProcessModules
GetModuleFileNameEx

判断窗体对应的进程


这个怎么判断??
[/Quote]

看进程拥有者
gaoxiaowei 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gfm688 的回复:]

GetWindowThreadProcessId
OpenProcess
EnumProcessModules
GetModuleFileNameEx

判断窗体对应的进程
[/Quote]

这个怎么判断??
gaoxiaowei 2012-03-15
  • 打赏
  • 举报
回复
我现在通过LONG nStyle=GetWindowLong(hWnd,GWL_STYLE);获取到了窗体的类型,但是现在还没找到区分的方法(Spy++对比了一些style),不知道还有什么办法来解决?
gfm688 2012-03-15
  • 打赏
  • 举报
回复
GetWindowThreadProcessId
OpenProcess
EnumProcessModules
GetModuleFileNameEx

判断窗体对应的进程
罗平 2012-03-15
  • 打赏
  • 举报
回复
应该不能区分吧?这个句柄是没有任何分别的。

15,471

社区成员

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

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