如何在所有其他应用程序之上监视键盘,然后向它们发送其他键

2023-12-03

我正在基于运行 Win7 的旧计算机构建多媒体控制台。

我想用数字键盘控制玩家。 我无法使用常见的媒体控制设备,因为它们仅响应 Windows 媒体播放器。我会使用 KVM Player、Winamp 等。因此,每个人都有自己的一组键盘快捷键,用于播放、暂停、前进、音量等。

为此,我正在考虑构建一个 Delphi 应用程序来检测前台应用程序并从数据库获取该应用程序使用的快捷方式。

当我使用数字键盘(常规遥控器的大小)并按5对于播放,我的应用程序可以检测到它并将其发送到操作系统P如果我使用 Winamp 或Space如果我使用的是经典媒体播放器。

我应该使用什么函数来首先获取按下的键,然后发送不同的键?


部分解决方案可以使用键盘挂钩(WH_KEYBOARD_LL) 捕获特殊组合键或单个键,然后使用按键事件发送(替换)另一个击键的函数。

Try this sample code which intercepts the VK_UP key and send a S

var
 hhk: HHOOK;


function CBT_FUNC(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;


type
  PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
  TKBDLLHOOKSTRUCT = record
    vkCode: cardinal;
    scanCode: cardinal;
    flags: cardinal;
    time: cardinal;
    dwExtraInfo: Cardinal;
  end;
  PKeyboardLowLevelHookStruct = ^TKeyboardLowLevelHookStruct;
  TKeyboardLowLevelHookStruct = TKBDLLHOOKSTRUCT;

var
 LKBDLLHOOKSTRUCT: PKeyboardLowLevelHookStruct;
begin
   case nCode of
     HC_ACTION:
     begin
       LKBDLLHOOKSTRUCT := PKeyboardLowLevelHookStruct(lParam);
        if (LKBDLLHOOKSTRUCT^.vkCode = VK_UP)  then
        begin

          if (wParam=WM_KEYUP) or (wParam=WM_SYSKEYUP)then
           keybd_event( Ord('S'), 0, KEYEVENTF_KEYUP, 0)
          else
           keybd_event( Ord('S'), 0, 0, 0);

          Exit(1); //eat the key
        end;
     end;
   end;
  Result := CallNextHookEx(hhk, nCode, wParam, lParam);
end;

Procedure InitHook();
begin
  hhk := SetWindowsHookEx(WH_KEYBOARD_LL, @CBT_FUNC, 0, 0);
  if hhk=0 then RaiseLastOSError;
end;


Procedure KillHook();
begin
  if (hhk <> 0) then
    UnhookWindowsHookEx(hhk);
end;


initialization
  InitHook();

finalization
  KillHook();
end.

在使用这种钩子之前,请记住阅读文档,特别是remarks部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在所有其他应用程序之上监视键盘,然后向它们发送其他键 的相关文章

  • 防止多个实例 - 但还要处理命令行参数?

    我正在从我的应用程序处理与 Windows 相关的扩展文件 因此 当您在 Windows 中双击文件时 它将执行我的程序 然后我从那里处理该文件 如下所示 procedure TMainForm FormCreate Sender TObj
  • 如何在iOS的Delphi程序中使用IPv6协议

    我尝试在我的移动程序中使用 IPv6 协议 我的服务器位于 NAT 后面的 LAN 内 在服务器上我使用IP端口3000 我已经组织了从路由器端口 45500 到服务器端口 3000 的虚拟服务器 端口转发 在服务器上 我运行 ipconf
  • 将图像加载到 TImageList 并读取它们?

    我试图通过将 jpg 转换为 bmp 然后将其保存到 imagelist1 来将 jpg 加载到图像列表中 从上到下的代码片段 Selectdir 有效 fileexists 部分有效 这用于加载文件夹中的所有图像 所有图像都以 0 jpg
  • logback的“谨慎模式”是如何实现的?

    The 审慎模式 http logback qos ch manual appenders html prudentlogback 中的序列化所有 JVM 之间的 IO 操作 写入同一文件 可能运行在不同的主机上 在其他日志记录框架中 如果
  • 阻止 IDE 自动添加使用单位

    我正在将 Lazarus 项目转移到德尔福西雅图 Lazarus 项目依赖于 40 多个单元 包括控件 并具有多种应用程序 在所有项目的使用条款中 他们使用了以下内容 uses Classes SysUtils Forms Controls
  • 如何在表单上绘制半透明图像?

    我想在 Delphi 窗体上绘制半透明图像 但由于某种原因它不起作用 Here is the original PNG border is semi transparent 我将图像加载到TImage object Image1 Trans
  • Delphi 中表单分发与其生命周期相关的接口对象的安全方法?

    我有一个 Delphi 表单 它提供接口对象背后的功能 代码的其他部分也通过属于该表单的属性获取引用 我无法将接口功能委托给子对象 因为太多的功能是由表单上的控件 组件提供的 我无法使用 TAggregateObject 或 TContai
  • 在 Delphi 中淡入 alpha 混合 PNG 表单

    几年前 当 Vista 首次发布时 我曾提出过这个问题 但始终没有解决这个问题 并把它搁置起来 留待以后再考虑 我有一个启动屏幕 我花了很大力气让它看起来很棒 这是 32bpp alpha 混合的 PNG 我有一些代码 如果需要 我可以挖掘
  • FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

    是否可以将 TImage 放置在 iOS 的 FMX 表单上 并将图像 jpg 从 URL 加载到此 TImage 中以在 iOS 应用程序中显示 我尝试过但没有成功 任何正确方向的提示或指出都会受到赞赏 将 TButton TImageC
  • 使用 Delphi 读取 Excel 电子表格

    我需要使用 Delphi 2010 读取和写入 Excel 电子表格 没什么花哨的 只需读取和写入不同工作表上特定单元格和范围的值 需要在没有安装 Excel 的情况下工作并支持 Excel 2007 我看过的一些东西 我尝试过使用ADO
  • 使用 Delphi 10.2.1 Tokyo 的模态 Android 对话框

    我有以下用于在 Android 上显示模式消息的 Delphi 代码 该代码在 10 1 Berlin 上运行良好 但在 Delphi 10 2 1 Tokyo 上停止运行 此过程现在会挂起 Android 应用程序 procedure c
  • 在 Delphi 中将对象转换为 OleVariant

    有没有办法在 OleVariant 中传递包装并解开 TObject 后代 我正在尝试跨自动化对象传递 TObject 我知道这不是一个好主意 但我没有更好的选择 该对象将在来自同一自动化 dll 的对象之间传递 如果这有什么区别的话 像这
  • 面向 Delphi 开发人员的 Qt

    有人知道为 Delphi C Builder VCL 开发人员解释 Qt 的书籍或教程吗 对于具有该背景的开发人员来说 学习 Qt 的最佳方法是什么 我对如何使用 Qt 完成我知道如何在 Delphi 中完成的事情特别感兴趣 例如 Qt 相
  • Delphi 应用程序被 Google Chrome 视为“危险”

    我经常用Delphi 2009制作数学软件 并将其发布在我的网站上 然而 去年左右 Google Chrome 开始认为我的一小部分 但数量不断增加 EXE 是 有害的 并且 Google Chrome 拒绝下载它们 例如 今天我编写了一个
  • 我可以在 Delphi 中使用字符串“IsEmpty”方法吗

    内河码头文件 IsEmpty 方法 http docs embarcadero com products rad studio delphiAndcpp2009 HelpUpdate2 EN html delphivclwin32 Syst
  • 从不同的形式调用过程

    我正在使用 Lazarus 我有一个名为TForm1单元名称为 Unit 1 在这里我有一个名为mergeDATfile a shortint 这会产生一些东西 顺便说一句 我必须创建另一个名为TForm2里面有按钮 Button1 当它被
  • 什么是代码页 0?

    我正在使用Delphi函数 StringCodePage 我在 COM 函数 Acrobat Annotation getContents 请参阅我的其他帖子 返回的字符串上调用它 它返回 0 0是什么 安西 代码页 0 是 CP ACP
  • 是否可以在虚拟树视图中选择多个列?

    我需要添加功能来复制节点和列的矩形选择 但我找不到任何方法来实际选择虚拟树视图中的多个列 除了 toFullRowSelect 之外 我只是错过了什么吗 如果没有 是否有一个后代具有类似网格的多列选择支持 经过一些测试后 我得出了以下结论
  • Delphi XE5 FireDAC 错误:无法加载供应商库 [libmysql.dll 或 libmysqld.dll]

    我在 Windows 7 64 位上使用 Delphi XE5 只是尝试 FireDAC 组件 我正在使用一个 TFDConnection 组件连接到本地 MySQL 数据库 v5 6 15 我已经将 libmysql dll 32位 v5
  • 如何将 Delphi Chromium Embedded (TChromium) 组件的声音静音?

    我需要将某个声音静音TChromium组件来制作无声浏览器 主要问题是在 Windows XP 上 当我将浏览器的声音静音时 它会静音整个系统的声音 有没有办法让电脑静音TChromium成分 我已经成功使用以下代码 procedure C

随机推荐

  • 在 Swift 3 通知中心观察者中使用选择器

    NotificationCenter default addObserver self selector Selector uploaded name NSNotification Name rawValue uploaded object
  • 如何使用组合框过滤Datagridview而不更改数据源

    我正在使用 Windows 窗体编写一个程序 并且我已经构建了一些代码 如下所示 在文本框中写入站点 URL 然后单击 开始 按钮 匹配的数据将显示在 DataGridViews 中 我有 6 个 DataGridView 在第一个 Dat
  • 错误添加SceneBuilder快捷链接后如何将Scene Builder添加到Intellij

    所以我安装了Intellij第一次 我错误地链接了场景构建器快捷方式链接到FXML文件并不断收到此错误 IntelliJ failed to start scene builder 经过大量搜索后 我无法找到如何重置SceneBuilder
  • ggplot2 轴文本的奇怪理由

    我遇到了一个奇怪的轴文本对齐问题 如下图所示 您可能需要放大图像才能看到问题 正如您所看到的 x 轴文本绘制在刻度线的下方 y 轴文本绘制在刻度线的左侧 并且刻度线本身遍布各处 可能导致此行为的原因是 也许更重要的是 可以采取什么措施来避免
  • 浏览器会短暂显示没有样式的页面(视觉故障)

    我观察到 Internet Explorer 7 或 8 没关系 很少会显示我们的网页 www epsitec ch 短时间内不应用CSS 布局看起来完全被破坏了 所有内容都从上到下按顺序显示 当页面加载完成后 所有内容终于正确显示 我们的
  • Python 分割字符串并打乱中间的内容

    我在使用 python 程序时遇到问题 我需要该程序混淆单词的中间 同时保持外部两个字母完好无损 我相信我已经成功地将单词分成三个不同的部分 我只是不能弄清楚我应该如何打乱单词的中间部分 word input Enter a word fi
  • 使用 boost 函数进行 SolrNet 查询

    我正在尝试使用这个库 看起来非常好 但我很难理解如何向我的查询添加额外的参数 例如升压函数等 如何做到这一点 您可以使用 QueryOptions 的 ExtraParams 属性将任何参数添加到 Solr 查询字符串 例子 ISolrOp
  • 单击表单中的按钮会导致页面刷新

    我有一个 Angular 表单 其中有两个按钮标签 一键提交表单ng click 另一个按钮纯粹用于导航ng click 然而 当单击第二个按钮时 AngularJS 会导致页面刷新 从而触发 404 我在函数中放置了一个断点 它正在触发我
  • 如何在 stringi 包中使用反向引用?

    在 R 中我可以使用 1引用捕获组 但是 当使用 stringi 包时 这不会按预期工作 library stringi fileName lt hello you lst fileName lt stri replace first re
  • 从数据库中检索一百万条记录

    有一个数据库 它的表中大约包含 200 万条记录 我从我的java代码中运行了查询 就像这样 select from table 它将从结果集中的数据库中获取完整的数据 或不 如果是 那么它将如何工作 我想了解此检索的工作原理 请告诉我 我
  • 防止 const 成员函数更改成员数组

    显然 const 成员函数仍然允许更改类成员指向的数据 这是我的意思的一个例子 class MyClass public MyClass int getSomething const private int data data new in
  • 如何在带有子图的绘图中设置辅助x轴及其范围?

    有谁知道如何在绘图中设置辅助 x 轴及其范围 我试图在这里显示垂直直方图 但它目前仍然太小 垂直直方图 import pandas as pd import numpy as np import plotly graph objects a
  • 如何修复 PHONE GAP 中 Android 设备的粘性页脚?

    我在 Phone Gap 工作 我修复了页脚 这适用于少数设备 但不适用于少数设备 页脚的 HTML 代码 div style background image url img bottom bar png class footer div
  • 什么时候会在 C# 中使用委托? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 您在 C 中如何使用委托
  • 在 XSLT 中创建一个简单的模式弹出窗口

    我正在构建一个样式表 表中有一些成员 我想要的是 当我单击每个会员时 会打开一个弹出模式窗口 其中包含 XML 文件中的该会员数据 我可以使用会员 ID 作为参考 我尝试使用 fancybox http fancybox net 但问题是
  • 每组加权geom_密度的密度总和为1

    使用加权数据时 如何对密度图进行分组并使每组的密度总和为 1 The ggplot2帮助geom density 建议使用加权数据的技巧 除以权重之和 但是当分组时 这意味着各组的组合密度总计为 1 我希望每个组的密度总计为一个 我发现了两
  • 如何将列表嵌套到Redis中的结构中以减少顶层?

    我想在redis中维护一些元数据 meta key build key meta data user 12345 tag D12321341234123 res redis sip hmset meta key meta data 它按预期
  • 为什么我的 Cucumber 测试在使用 Selenium 运行时失败?

    我正在使用 Cucumber Capybara 组合测试 Rails 3 应用程序 我还尝试使用 Selenium 来测试一些 JavaScript 特定场景 但遇到了我不明白的奇怪困难 我对 Cucumber Capybara 的经验非常
  • SF Symbol 与scaleAspectFill 不能很好地配合使用

    我注意到 SF 符号并不能很好地与scaleAspectFill 例如 给定一个圆形方面 用细边框填充 UIImageView 将其图像设置为UIImage systemName person crop circle fill 看起来像下面
  • 如何在所有其他应用程序之上监视键盘,然后向它们发送其他键

    我正在基于运行 Win7 的旧计算机构建多媒体控制台 我想用数字键盘控制玩家 我无法使用常见的媒体控制设备 因为它们仅响应 Windows 媒体播放器 我会使用 KVM Player Winamp 等 因此 每个人都有自己的一组键盘快捷键