我需要与"How to get cursor position on a control?"问题相反的信息。
给定当前的光标位置,如何找到光标当前所在的窗体(在应用程序中)和控件?我需要它的句柄,以便使用Windows.SetFocus(Handle)
。
作为参考,我使用的是 Delphi 2009。
我需要与"How to get cursor position on a control?"问题相反的信息。
给定当前的光标位置,如何找到光标当前所在的窗体(在应用程序中)和控件?我需要它的句柄,以便使用Windows.SetFocus(Handle)
。
作为参考,我使用的是 Delphi 2009。
4条答案
按热度按时间lyfkaqu11#
建议的解决方案( Delphi XE 6/Windows 8.1/x64)遇到了一些问题:
在我的例子中,这是一个问题,因为我需要在鼠标光标下找到任何可见的控件,所以我必须使用我自己的函数
FindControlAtPos
的实现:k7fdbhmy2#
我认为
FindVCLWindow
将满足您的需要。一旦您在光标下有了窗口控件,您就可以遍历父链来找到窗口所在的窗体。bvjveswy3#
如果要了解窗体内某个x,y坐标处的控件
用途
鉴于您似乎只对应用程序中的表单感兴趣,您可以只查询所有表单。
获得非空结果后,可以使用如下代码查询控件的Handle
伪码
这也允许您排除某些形式的考虑,如果你这样的愿望。如果你正在寻找简单,我会去大卫和使用
FindVCLWindow
。P.S.就我个人而言,我会使用
goto
而不是break,因为使用后藤可以立即清楚地看到break重新进入的位置,但在本例中,这不是一个大问题,因为在break和re-entry点之间没有语句。46qrfjad4#
我曾在一个大型项目中工作过,这个项目有很多框架和很多动态创建的控件。当软件运行时,很难弄清楚哪个控件是哪个控件,以及它是在哪里创建的。所以,我编写了这个tiny piece of code,它告诉你哪个控件在鼠标下。只有当程序在调试模式下编译时,我才显示Digger窗体。所以它对客户不可用,而仅对开发者可用。
代码非常非常简单。它全部恢复到一个名为ShowParentTree的递归函数。我们从Digg开始调用ShowParentTree,它在应用程序空闲时被调用:
Digg函数看起来像这样,它是由FindVCLWindow完成的:
一旦我们将控件置于鼠标下,ShowParentTree就会通过递归调用自身来挖掘该控件的父控件,以及父控件的父控件,依此类推:
一旦深入到表单,我们就离开递归调用。
_
警告:无法找到/调查禁用的控件,但FindDragTarget将解决该问题。