GetClassInfoEx的疑惑,SDK高手请进

virtualmfc 2002-03-26 02:11:17
我在学习Windows的窗口类时看到下面这样一段话:

/**************************************************************/
GetClassInfoEx 仅能在呼叫此函式的那个行程㆗取得㆒个已注册的窗口类别的
相关信息。举个例,如果你想利用GetClassInfoEx 取得 “NOTEPAD” 类别的
相关信息,会导致失败,因为呼叫GetClassInfoEx 函式的㆟(行程)并不是
NOTEPAD 。
/*************************************************************/

从GetClassInfoEx的原型 声明可以知道:
BOOL GetClassInfoEx(HINSTANCE hinst, LPCSTR lpszClassName, PWNDCLASSEX pwc);
只要给定程序的运行实例主可以知道指定类的情况了。
如果在“记事本”程序运行时,通过获取这个“记事本”程序的窗口句柄,得到其实例句柄,赋给hinst,再将“NOTEPAD”给lpszClassName
,那么不就可以得到pwc这个窗口类结构的情况了吗?

不知书上的这句话是什么意思?
...全文
269 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
virtualmfc 2002-03-28
  • 打赏
  • 举报
回复
其实我已明白大家的意思,只是既然从程序的健壮性考虑,应该禁止跨进程的操作,但为何GetClassInfoEx不行,而GetClassLong就可以呢?这不是自相矛盾吗?
一点想法,不明白????
messagebox 2002-03-27
  • 打赏
  • 举报
回复
GetClassInfoEx只能取得呼叫它的本进程已注册的视窗类别的信息
你用GetClassWord/GetClassLong吧
virtualmfc 2002-03-27
  • 打赏
  • 举报
回复
紧急求助!!!!!
virtualmfc 2002-03-26
  • 打赏
  • 举报
回复
下面是我写的代码,请大侠们分析一下:
HWND hwndFind;
HINSTANCE hinstFind;
WNDCLASSEX wcex;
hwndFind = WindowFromPoint(pt);
hinstFind = GetWindowInstance(hwndFind);
GetClassInfoEx(hinstFind,TEXT("NOTEPAD"),&wcex);
请问wcex结构中是否能得到记事本窗口类的详细资讯。
ju_feng 2002-03-26
  • 打赏
  • 举报
回复
在系统中只有各个程序的资源(诸如icon dialog之类)存放在global table中

(notepad程序存放在system local atom table
中吧)

但还要满足lpszclass的条件啊
virtualmfc 2002-03-26
  • 打赏
  • 举报
回复
没错呀!!!
我看MSDN上也讲得很明白,hInst只要是注册类的实例句柄就行,
我在调用GetClassInfoEx时使用的非本实例hinstance,而是通过
FindWindows 和 GetWindowInstance得到的hinstance。
难道有问题吗?
virtualmfc 2002-03-26
  • 打赏
  • 举报
回复
那请问,是不是注册窗口类时的原子值是存放在Process atom中,而不是System Global atom 中呢?
可是我知道的是,系统中有三个atom table.
一个是process local atom table
一个是system local atom table
还有一个就是system global atom table。
我们的窗口类其原子值究竟在哪个atom表中???
请赐教!
ju_feng 2002-03-26
  • 打赏
  • 举报
回复
具体可看看msdn
ju_feng 2002-03-26
  • 打赏
  • 举报
回复
不是没有注册,而是如果如果不是global atom,则只能取得小于0xC000的lpszclassname
virtualmfc 2002-03-26
  • 打赏
  • 举报
回复
照ju_feng这么说,记事本的窗口类就不是通过RegisterClassEx得来的,那我就不明白了,小小的记事本还要通过特殊的方法来注册窗口类吗?
virtualmfc 2002-03-26
  • 打赏
  • 举报
回复
我们可以使用来FindWindow找到窗口的句柄,之后可以使用WindowsX.h中的宏
GetWindowInstance得到窗口的实例,那么只要指定你想要看到的类lpszClassName就可以得到窗口类的属性了吗?
与跨进程根本没有关系。
可是看上面的话的意思,却是不能实现。
那么,是否进程之间全部独立,只有靠插入DLL才能实现。
疑惑多多??????
ju_feng 2002-03-26
  • 打赏
  • 举报
回复
GetClassInfoEx(HINSTANCE hinst, LPCSTR lpszClassName, PWNDCLASSEX

pwc)只能取得用 RegisterClassEx注册过的类的信息!而行程㆗没有注册,

所以取不到
ahr 2002-03-26
  • 打赏
  • 举报
回复
不知道第一句说什么,你用第二句解决问题就行了
virtualmfc 2002-03-26
  • 打赏
  • 举报
回复
那意思是不是说,就不能得到其他窗口类的信息了???
可是SPY++却可以做到这一点,为什么?
继续讨论。
virtualmfc 2002-03-26
  • 打赏
  • 举报
回复
那意思是不是说,就不能得到其他窗口类的信息了???
可是SPY++却可以做到这一点,为什么?
继续讨论。
virtualmfc 2002-03-26
  • 打赏
  • 举报
回复
高手能否讲得再详细一点呢?
大至分析一下其原理也行。
crazybit 2002-03-26
  • 打赏
  • 举报
回复
就是不能跨进程的意思,hInst == 0x00400000 (win9x下)
每个进程有自己的2G空间"notepad"类只在自己的进程空间中存在,不象"button"(是一个Global class),所以在你自己的进程空间中没有notepad类。
可以用插入Dll方法得到,(具体见Advanced windows)
prometheusphinx 2002-03-26
  • 打赏
  • 举报
回复
不要问为什么,试一下就知道了。
virtualmfc 2002-03-26
  • 打赏
  • 举报
回复
正确的贴子如下:
我在学习Windows的窗口类时看到下面这样一段话:

/**************************************************************/
GetClassInfoEx 仅能在呼叫此函式的那个行程中取得一个已注册的窗口类别的
相关信息。举个例,如果你想利用GetClassInfoEx 取得 “NOTEPAD” 类别的
相关信息,会导致失败,因为呼叫GetClassInfoEx 函式的人行程)并不是
NOTEPAD 。
/*************************************************************/

从GetClassInfoEx的原型 声明可以知道:
BOOL GetClassInfoEx(HINSTANCE hinst, LPCSTR lpszClassName, PWNDCLASSEX pwc);
只要给定程序的运行实例主可以知道指定类的情况了。
如果在“记事本”程序运行时,通过获取这个“记事本”程序的窗口句柄,得到其实例句柄,赋给hinst,再将“NOTEPAD”给lpszClassName
,那么不就可以得到pwc这个窗口类结构的情况了吗?

不知书上的这句话是什么意思?

1,657

社区成员

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

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