如何判断一个Windows句柄是一个Window的句柄而不是Button之类的句柄(300分)

  • 主题发起人 主题发起人 轻舞肥羊
  • 开始时间 开始时间
getclassname没问题
 
对呀,难道按钮不是窗口?按钮是子窗口,MDIChild窗口也是子窗口,你到底想要什么窗口?
 
看看我的贴子 也许有点点帮助<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=2263135<br>
 
学习。<br>帮你顶顶。
 
自己写了一个,测试了一下可行,但不知道会有哪些特殊情况会认错<br>function IsWindowEx(<br>&nbsp; &nbsp; const AHWND : HWND<br>&nbsp; &nbsp; ):Boolean;<br>//判断是否是Window<br>var<br>&nbsp; hStyle &nbsp;: HWND;<br>begin<br>&nbsp; Result &nbsp;:= &nbsp;False;<br>&nbsp; if not IsWindow(AHWND) then Exit;<br>&nbsp; hStyle := &nbsp;GetWindowLong(AHWND,GWL_STYLE);<br>&nbsp; Result &nbsp;:=<br>&nbsp; &nbsp; &nbsp; hStyle and WS_SYSMENU = WS_SYSMENU)<br>&nbsp; &nbsp; &nbsp; or (hStyle and WS_POPUP = WS_POPUP);<br>end;
 
首先你得明确控件和窗口的本质,请问什么是控件,什么是窗口呢?如果你说控件是没有标题栏的子窗口,那么一个没有标题栏边框的form,并且没有WS_POPUP属性,放在另一个form中,那是什么呢?<br>如果用你上面的那个IsWindowEx()来判断那样的form返回的就是False;<br>其实控件是一种子窗口,主要看你怎么看了,如果你知道窗口是怎样注册窗口类,怎样调用::CreateWindowEx创建的话,它们就不需要区分,区分的只不过是表面现象而已<br>
 
Paladin_yf:<br>&nbsp; &nbsp; 我当然知道Button,Window等都是用CreateWindow或CreateWindowEx建立的,而且有很多相同的属性,就是因为它们有太多的相同点,才想有个方法来区分它们,而且这个问题也不是容易的事(至少我认为不容易),至于为什么要区分,我有我的用处.<br>&nbsp; &nbsp; 放在另一个Window中的Window,如停靠窗口,不能区分也没问题,区分得出来就更好了,条件是:我只知道一个句柄,可能是任何应用程序中的一个.
 
是啊,不知道你要干什么<br>我也不知问题应该到什么深度了,你可能把没有标题栏的窗口就当成你所需要的<br>而我的理解却不是这样了
 
肥羊上面的程序和我开始的思路差不多,不过显然如Paladin_yf所说,在某些情况下还是有问题的<br>后来又想到下面的这个方法(不考虑 放在另一个Window中的Window 的情况),以为会是比较准确的了<br>function IsWindowEx(const AHWND: HWND): Boolean;<br>var<br>&nbsp; wHWND: HWND;<br><br>&nbsp; function EnumWindowProc(hwnd: HWND; lParam: DWORD): BOOL; stdcall;<br>&nbsp; begin<br>&nbsp; &nbsp; Result := hwnd &lt;&gt; PDWORD(lParam)^;<br>&nbsp; &nbsp; if not Result then<br>&nbsp; &nbsp; &nbsp; PDWORD(lParam)^ := 0;<br>&nbsp; end;<br><br>begin<br>&nbsp; Result := False;<br>&nbsp; if IsWindow(AHWND) then<br>&nbsp; begin<br>&nbsp; &nbsp; wHWND := AHWND;<br>&nbsp; &nbsp; EnumWindows(@EnumWindowProc, DWORD(@wHWND));<br>&nbsp; &nbsp; Result := wHWND = 0;<br>&nbsp; end;<br>end;<br>但是我们 Windows.SetParent(Button.Handle, GetDesktopWindow);<br>也会将Button.Handle判断为True<br>有意为之的话,一样可以给Button.Handle加上WS_SYSMENU和WS_POPUP的风格<br>这样用这两种方法几乎是没有办法正确判断的
 
后退
顶部