WindowFromaPoint取句柄的问题(200分)

  • 主题发起人 主题发起人 未来107
  • 开始时间 开始时间

未来107

Unregistered / Unconfirmed
GUEST, unregistred user!
用下面的方法无法取得无效的控件句柄比如 当button.enabled:=false时无法取到!!<br>用spy++就可以,这是为什么吗?<br><br>var h:hwnd;<br>&nbsp; &nbsp; p:Tpoint;<br>begin<br>&nbsp; &nbsp; windows.GetCursorPos(p); //获取鼠标位置<br>&nbsp; &nbsp; h:=WindowFromPoint(p); &nbsp; //获取鼠标位置控件的句柄<br>&nbsp; &nbsp;
 
我在大富翁上以及google上查了查,没找到答案!:)
 
WindowFromPoint没有办法取得被设为禁用的窗口控件的句柄<br>如果要取得被禁用的按钮的句柄,要先取得其父的句柄,例于窗体.<br>然后用EnumChildWindow函数枚举所有子窗体取得,这要用到回调函数,<br>比较麻烦,另一个方法是用FindWindowEx查找所有子窗口也能找到<br>
 
谢谢你的回答,我等了一段时间了!<br><br>&nbsp; csdn上的确是这么说的!不知道有没有直接的方法!<br><br>按照你的方法,应该解决一个问题,就是找到一个控件后,要取得这个控件的坐标,然后与<br>windows.GetCursorPos(p); 取得的p比较,如果在范围内则ok<br>EnumChildWindow()<br>getwindowrect()<br><br>但是,会不会影响效率,鼠标每移动一个点就要判断?<br><br>
 
不知道你是在什么事件得到的鼠标光标所在的地方,<br>如果考虑到效率,给你个建议,在某个控件(例TButton)的OnMouseDown事件中<br>设置一个标志,开始捕捉鼠标位置,只取句柄(OnMouseMove),<br>在OnMouseUp事件中再进行你想进行的比较
 
我是在OnMouseDown事件中触发timer震荡,然后不断判断,当OnMouseUp时停止!<br><br>我刚汇编了一下winsize的方法,他用的方法是取得所有者句柄,然后枚举句柄,他<br>的方法应该不错,我试试!:)
 
我试了试不行,各位朋友有什么好的方法?
 
WindowFromDc呢?
 
爱元元的哥哥<br>&nbsp; 我查了查说明,觉得可能不行!<br>&nbsp; 能详细讲讲实现过程吗?<br><br>我需要实现的是当鼠标指向被屏蔽的控件(enabled=false)时,取得他的句柄!
 
有人写了个东东,参考参考<br>http://expert.csdn.net/Expert/topic/1437/1437609.xml?temp=.3764154
 
上面这个不行,需要注意的是如果控件没有被屏蔽即enabled=trur 是可以利用<br>windowformpoint函数取得句柄的!<br><br>使我感到奇怪的是spy++与winsize都可以得到,why?
 
用ChildWindowFromPointEx,其中有一个参数可以控制是否包括禁用的控件
 
&gt;&gt;Traveller<br>&nbsp; 无论是ChildWindowFromPointEx还是realChildWindowFromPointEx都不好实现!
 
卡斯的,有搞了一个下午还是没有办法,兄弟们帮个忙把!
 
自己定义函数GetWindowFromPoint,把你的WindowFromPoint全替换成它就可以了:<br>function GetWindowFromPoint(const p: TPoint): HWND;<br>var<br>&nbsp; pp: TPoint;<br>&nbsp; h: HWND;<br>begin<br>&nbsp; pp := p;<br>&nbsp; Result := WindowFromPoint(pp);//用你的方法取到的句柄<br>&nbsp; Windows.ScreenToClient(Result, pp);//把p转换成相对于h的坐标<br>&nbsp; h := ChildWindowFromPoint(Result, pp);//判断一下这个地方有没有其他的窗口<br>&nbsp; if h &gt; 0 then Result := h;<br>end;<br>
 
上面程序有时会有问题,那就是Enable的窗口的子窗口取不到,又修改了一下:<br>function GetWindowFromPoint(const p: TPoint): HWND;<br>var<br>&nbsp; pp: TPoint;<br>&nbsp; h: HWND;<br>&nbsp; bEnd: Boolean;<br>begin<br>&nbsp; bEnd := False;<br>&nbsp; Result := WindowFromPoint(p);<br><br>&nbsp; while not bEnd do<br>&nbsp; begin &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; pp := p;<br>&nbsp; &nbsp; Windows.ScreenToClient(Result, pp);<br>&nbsp; &nbsp; h := ChildWindowFromPoint(Result, pp);<br>&nbsp; &nbsp; if (h &lt;= 0) or (h = Result) then bEnd := True else Result := h;<br>&nbsp; end;<br>end;<br><br>
 
&gt;&gt;独帅<br>&nbsp; 非常感谢!,我的qq: 68341889,很想与你交个朋友!
 
刚试了一试,发现还有问题,在磁盘的属性-硬件-属性-策略里面的一些控件无法取道,而<br>spy++则可以,独帅大侠还请你出马!
 
//刚试了一试,发现还有问题,在磁盘的属性-硬件-属性-策略里面的一些控件无法取道,而<br>//spy++则可以<br>这个问题我也发现了,原因不清楚,我也在考虑,有了结果再告诉你吧<br>交朋友可以,我不大用QQ,可以用邮件:9on9@sina.com<br>
 

Similar threads

后退
顶部