如何知道窗口控件是什么类型?(全部家当)(55分)

  • 主题发起人 主题发起人 ryu
  • 开始时间 开始时间
R

ryu

Unregistered / Unconfirmed
GUEST, unregistred user!
在CreateWindow中有个lpClassName参数,它说明窗口类别,<br>窗口的基本类别就那么几种,但可以通过RegisterClass注册,<br>所以我用GetClassName取得类名以后,还是不清楚它到底是<br>什么类型?
 
你所指的类型是什么意思?<br>是窗口类名,还是窗口的一些特性:如是否是MDI,是否是对话框,边框类型等.<br>或其它什么内容。
 
我的意思是:<br>我知道一个窗口句柄,但我怎么知道它是什么类型呢?<br>是BUTTON、EDIT、COMBOBOX、LISTBOX还是其他什么类型呢?<br>用什么函数可以判断呢?
 
GetClassName可以知道该窗口的类型!<br>在Delphi中是诸如TButton,TEdit,TComboBox之类的东东...
 
使用GetClassName没有什么问题呀,如刘五公子所说,返回的是TEdit、TButton<br>之类的类名。不知道你想要的是什么。<br>var<br>&nbsp; className: PChar;<br>&nbsp; i: Integer;<br>begin<br>&nbsp; className := AllocMem(100);<br>&nbsp; className[0] := '0';<br>&nbsp; for i := 0 to Form1.ComponentCount - 1 do<br>&nbsp; begin<br>&nbsp; &nbsp; &nbsp;if (Form1.Components Is TWinControl ) then<br>&nbsp; &nbsp; &nbsp; &nbsp;if GetClassName(TWinControl(Form1.Components).Handle, <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; className, 100) &lt;&gt; 0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowMessage(className);<br>&nbsp; &nbsp; &nbsp;className[0] := '0';<br>&nbsp; end;<br>&nbsp; FreeMem(className);<br>end;
 
ClassName足矣!<br>返回一个字符串象:'TEdit'
 
ClassName 与真实是什么毫无关系. 我完全可以取个class名字<br>叫 Microsoft
 
理论上是这么回事,但有些东东叫做"约定成俗".<br>比如说,广泛使用的TCP/IP也可以称为这一类的.<br>M$系统约定了这些名字的特殊用途,在系统启动<br>就已确定,故不会有问题的.
 
Blade的方法可行,我在别处用过类似的过程,算法一样!
 
五公子,Blade:<br>&nbsp; &nbsp; 你们的做法我也知道,但我所获得的窗口句柄不一定是Delphi程序的<br>窗口句柄呀?!所以同是一个Edit子窗口,用GetClassName或得的可以是<br>Edit(api),TEdit(Delphi),CEdit(C++Builder)...或者还有其他乱七八糟<br>的东东,我怎么去分清楚它是否Edit子窗口呀??----正如holly所言!
 
这我也不太清楚,不知是否有高手能解答呢?
 
总不能用查找GetClassName返回值是否含有Edit来判断它是否Edit子窗口吧?!:-(<br>还请高手指教!<br>
 
试试用GetClassLong.<br>DWORD GetClassLong(<br>&nbsp; &nbsp; HWND &nbsp;hWnd, // handle of window<br>&nbsp; &nbsp; int &nbsp;nIndex // offset of value to retrieve <br>&nbsp; &nbsp;); <br><br>当nIndex为GCW_ATOM时,返回注册类的唯一标识。
 
amo:<br>&nbsp; &nbsp; 我不太清楚取得注册类的唯一标识后,该去做什么?能详细讲解一下吗?<br><br>还请各位高手指点!
 
很长时间没人回答这个问题,可能大家都把它遗忘了,现在再提出来求教高手吧!
 
getclasslong 取到标识不就能判断两个窗口是否同类了? (你题目的要求不就是这个?)
 
Another_eYes:<br>&nbsp; &nbsp; 你的意思是用GetClassLong(hwnd,gcw_atom)取得返回值来比较吗?<br>如果是这样,你还没了解我的意思!我的意思是看上去同样是EditBox,但实际上<br>无论你用GetClassName 或GetClassLong,取得的结果都是乱七八糟的,你无法根据<br>结果判断它是否是EditBox !!
 
当然不是标准的editbox了, 一般程序都subclass标准class生成自己的class的, 不会一样.<br>是否可以通过getwindowlong(handle, control特有style值)判断是否属于某一类?<br>比如取ES_AUTOHSCROLL or ES_AUTOVSCROLL or ......, 如果其中有一个位不为0即可<br>认为是属于edit类的?
 
用这种办法总是不爽!是否有某种标志它可以录入的风格呢??
 
后退
顶部