【问题标题】:Delphi - Activating the Hint from another control of ApplicationDelphi - 从另一个应用程序控件激活提示
【发布时间】:2014-12-03 08:22:41
【问题描述】:

我正在尝试从 delphi 创建的不同应用程序的控件中激活提示,我使用钩子来识别焦点控件,然后使用 WM_MOUSEMOVE,我认为它将激活该控件的提示,句柄将是控件本身,lParam 是控件的左侧和顶部。控件激活 OnMouseMove 事件,但提示从未显示。但是当我使用 SetCursorPos 时,提示显示,但我需要在没有光标移动该控件的情况下显示提示。你能帮我解决这个问题吗?提前谢谢你...顺便说一句,我使用的是 Delphi XE4

【问题讨论】:

  • 这对我来说毫无意义,而且我们不知道您实际上想要做什么,以及您如何尝试这样做。你已经提出了一系列这样的神秘问题,每个问题都在询问一个未说出口的问题的解决方案。我准备打赌您选择的解决方案是错误的。有什么问题?
  • 嗨,大卫,问题是如何在没有光标移动到该控件上的情况下强制显示来自另一个应用程序的控件的提示。使用 SendMessage,在控件上发送 WM_MOUSEMOVE,lParam 为控件的 Left 和 Top。
  • 这并不是最终的原因。从更广泛的角度来看,您的计划实际上试图实现什么?
  • @DavidHeffernan,这与我的另一个问题link 有关
  • 我还是不明白你为什么要这么做。没关系。

标签: delphi


【解决方案1】:

真正被问到的问题之一是如何显示驻留在另一个应用程序上的控件的提示(恐怕没有钩子该应用程序无法完成),标题是“Delphi - 激活来自另一个应用程序控件的提示”。

首先是第一:这可以在不知道其他应用程序使用什么语言的情况下完成,但是把它放在这里非常复杂(而且我不是这种编码方式的专家,我也讨厌这样工作的应用程序方式)。

第二:主要思想是挂钩其他应用程序,在谷歌上搜索该应用程序的一些代码,可以向您显示鼠标经过的对象的矩形孔正方形,该应用程序在执行此操作时被图标化(i不记得它的名字了)。

这样的应用程序会做什么:当您在屏幕上移动鼠标时,它会在鼠标所在的控件上方覆盖一个矩形,然后如果您按下键打印屏幕,则该小区域是唯一进入剪贴板的区域;在我看到的此类应用程序中,有一个额外的功能,如果您按下键盘上的光标,它们可以移动此类控件,也可以隐藏/启用/禁用此类控件...更多,它还可以使不可见的控件可见等...我看到它在我的电脑上运行,嘿,为了好玩,它很漂亮,调试或在某些应用程序上获得额外的东西也很棒(让一些菜单可见并启用,然后可以使用这些功能)。

请,请,请理解我反对盗版,也反对使用此类应用程序来运行代码...某些应用程序需要付费才能启用某些菜单,但它们有代码,无需将 EXE 更改为拥有/使用该菜单;仅使用此类应用程序就可以使有限的应用程序不受限制(只需启用或显示隐藏菜单,瞧)。

注意:要取消隐藏菜单,鼠标点不需要在应用程序上方,可以在任何地方并且不会移动。

我想说的想法是:任何应用程序都可以移动,更改正在运行的任何其他应用程序(至少在 Windows 上)上的任何控件,所以也许可以有一种方法来显示这样的提示。

过去我曾使用此类应用程序(对不起,我不记得名称)来调试我自己的应用程序,因此在某些错误隐藏的情况下我不需要重新编译,也可以使用按钮、标签、文本、连击、备忘录等。

现在我的小问题是:我只需要确切的标题,但我无法让它工作。

必须是:

  1. 鼠标位置必须无关(它也必须能够在应用程序之外)
  2. 就在使用键盘(空格或 Enter)按下具有焦点的按钮时,或者在我的应用程序某处的某些代码之后,我想在短时间内显示特定 TEdit 的提示。

我没有得到提示显示;除非鼠标点在这样的 TEdit 上,但我希望/需要鼠标指针不在它上面,也不会跳转到 TEdit。

要显示该提示的想法:在执行一些更改某些内容的代码后,显示相关的额外信息。

例子:

  • 使用打开对话框加载文件的按钮,文件名放在只读 TEdit 上(因此它允许用户复制文本,但不能更改它);我希望我在 .Hint 上添加的额外信息立即显示。

该提示用于不重载具有大量字段(TLabels)的窗口以显示此类文件数据。

简单的想法:这样的提示显示所选文件的时间戳和大小。

PD:相关性不大(因为我正在尝试使用普通的纯文本提示),但提示也可以存储完整的 HTML 页面,并且使用 3rd 方工具显示为 HTMLhint,因此它们可以显示很多信息基于网络格式的文件(也包括其内容等);正如我所说,我首先尝试使用标准纯文本提示。

【讨论】:

    【解决方案2】:

    为了以编程方式显示提示,您需要调用您指定位置参数的 TApplications ActivateHint 方法。 http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.Forms.TApplication.ActivateHint

    根据位置参数,应用程序自动找到哪个控件在该位置并显示其提示。

    注意:以像素为单位的位置参数屏幕坐标,而不是您的控件坐标。所以你必须使用 ClientToScreen 方法来适当地改变你的坐标。

    您可以在此处查看如何使用它的简单示例:https://stackoverflow.com/a/15031208/3636228

    现在,如果您需要从另一个应用程序执行此操作,那么您必须向这两个应用程序添加一些通信机制,以便其中一个可以发送适当的消息来告诉另一个在特定位置显示提示。但这确实要求您能够更改这两个应用程序。

    编辑:这适用于 VCL 应用程序,但我不确定它是否适用于 FireMonkey 应用程序。

    【讨论】:

    • 我认为您实际上需要将鼠标光标放在目标控件上才能使用TApplication.ActivateHint,即使在您自己的应用程序中也是如此。
    • 不根据文档。检查我指定的文档链接。
    • 它有什么不同?关于激活另一个应用程序的提示的问题非常清楚。
    • 正如@Sertac 所说,这回答了一个不同的问题,-1
    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 2012-03-30
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多