【问题标题】:Global hotkey capture in VB.netVB.net 中的全局热键捕获
【发布时间】:2010-06-01 21:01:22
【问题描述】:

我想让我的应用程序最小化,以便在按下热键时捕获在另一个应用程序窗口中选择的数据。我的应用程序绝对没有焦点。此外,当按下热键时,我想呈现一个淡入淡出的弹出窗口(Outlook 风格),这样我的应用程序就永远不会获得焦点。

至少我想捕获窗口名称、进程 ID 和 选定 数据。有焦点的应用程序不是我的应用程序?

我知道一种选择是嗅探剪贴板,但还有其他解决方案吗?

这是为了审核数据进入另一个我无法控制的系统的速率。它是一个大型机仿真客户端程序(attachmate aka java-hosted telnet,支持 3250)。

计划是

  1. 在 Application X 中完成数据输入。
  2. 在 App X 中选择屏幕的某个部分,这是数据输入的证明(交易 ID)。
  3. 按下 Magic Hotkey,然后将选择“发送”到我的应用程序。
  4. 从 System.environment 或 system.Threading 我可以找到 Windows 登录。
  5. 同样,我也可以捕捉时间。
  6. 所有数据都将记录到 SQL。
  7. 一旦完成,就会弹出 Outlook 样式显示数据条目已记录。

任何想法。

【问题讨论】:

  • 在 App X 中选择屏幕的某个部分可能提供数据输入的证据,当然不是证据。
  • 实际上我从主框架应用程序中获得了一个提要。交易ID是单调递增的数字,不能伪造。对于给定的数据输入日期,只能有一个唯一的(想想自动编号/身份)交易 ID,我可以针对提要进行验证。

标签: winforms winapi .net-3.5 interop applet


【解决方案1】:

挂钩键盘/鼠标和屏幕抓取几乎是您可以使用小程序执行的操作的限制。请记住,Java 被编译为字节码并在 JVM 中运行。由于 JVM 的性质、可移植性和安全问题,您实际上无法访问 applet 内部的任何内容。您可能从 .Net 中看到的只是一个没有子级的“SunAwtFrame”分类窗口。

焦点的事情是可行的,只需使用 SendMessage(和其他)API 在后台做你需要的事情,只要你不改变焦点,它就会保持原样(即运行代码不需要焦点)

就数据提取而言,它归结为您是否可以使用某些(可能是核心)图像处理从屏幕上提取该信息。 Applet 是一种无人区(至少来自 .Net),没有 JavaWindow.Textbox.GetAStringForMePlease()。

为了记录,有一个例外,如果你物理控制小程序。在这种情况下,您可以制作一种小程序外壳来连接小程序的内脏。

【讨论】:

    【解决方案2】:

    听起来您需要设置一个全局键盘挂钩来捕获热键,此代码项目文章展示了如何做到这一点(在 C# 中,但差别不大): http://www.codeproject.com/KB/cs/globalhook.aspx

    然后您可以使用FindWindow API 找到其他应用程序窗口,然后找到包含“事务ID”的控件并使用WM_GETTEXT 消息从中复制文本。

    【讨论】:

    • 我试图吸取数据的应用程序是一个 Java 小程序。既然有控制本身,任何想法。似乎有一个 SunAwtCanvas 类型的顶级窗口/句柄。在记事本或任何常规 Windows 应用程序中,我看到每个控件的实际句柄,但不是在小程序的情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2016-05-10
    • 2011-06-30
    • 2011-05-28
    • 2023-03-03
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多