SendInput 与 keybd_event

2023-12-02

MSDN 指出 keybd_event 已被 SendInput 取代。在重写过程中,我改用 SendInput...这很好except当尝试发送 Alt 键组合时。在 Win7 64 位系统上(尚未在其他地方尝试过),发送 Alt 键会导致击键在目标应用程序中出现之前出现很长的延迟。

有什么想法吗?还是我做错了什么?现在,我回到了 keybd_event——下面的第二个版本。

//Keyboard input from this version appears only after a ~4-5 second
//time lag...
procedure SendAltM;
var
  KeyInputs: array of TInput;
  KeyInputCount: Integer;
  //--------------------------------------------
  procedure KeybdInput(VKey: Byte; Flags: DWORD);
  begin
    Inc(KeyInputCount);
    SetLength(KeyInputs, KeyInputCount);
    KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD;
    with  KeyInputs[KeyInputCount - 1].ki do
    begin
      wVk := VKey;
      wScan := MapVirtualKey(wVk, 0);
      dwFlags := KEYEVENTF_EXTENDEDKEY;
      dwFlags := Flags or dwFlags;
      time := 0;
      dwExtraInfo := 0;
    end;
  end;
begin
  KeybdInput(VK_MENU, 0);                 // Alt
  KeybdInput(Ord('M'), 0);                 
  KeybdInput(Ord('M'), KEYEVENTF_KEYUP);   
  KeybdInput(VK_MENU, KEYEVENTF_KEYUP);   // Alt
  SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0]));
end;


//Keyboard input from this version appears immediately...
procedure SendAltM;
begin
  keybd_event( VK_MENU, MapVirtualkey( VK_MENU, 0 ), 0, 0);
  keybd_event( Ord('M'), MapVirtualKey( Ord('M'),0), 0, 0);
  keybd_event( Ord('M'), MapVirtualKey( Ord('M'),0), KEYEVENTF_KEYUP, 0);
  keybd_event( VK_MENU, MapVirtualkey( VK_MENU, 0 ), KEYEVENTF_KEYUP, 0);
end;

问题1

你没有初始化KeyInputCount。所以它的值是未定义的。调用前将其设置为零KeybdInput第一次。或者只是摆脱它并使用Length(KeyInputs)反而。

问题2

您的设置dwFlags是不正确的。不包括KEYEVENTF_EXTENDEDKEY。您没有将其包含在调用的代码中keybd_event,并且您不应该将其包含在内SendInput.

更正代码

这个版本有效。

procedure SendAltM;
var
  KeyInputs: array of TInput;
  //--------------------------------------------
  procedure KeybdInput(VKey: Byte; Flags: DWORD);
  begin
    SetLength(KeyInputs, Length(KeyInputs)+1);
    KeyInputs[high(KeyInputs)].Itype := INPUT_KEYBOARD;
    with  KeyInputs[high(KeyInputs)].ki do
    begin
      wVk := VKey;
      wScan := MapVirtualKey(wVk, 0);
      dwFlags := Flags;
    end;
  end;
begin
  KeybdInput(VK_MENU, 0);                 // Alt
  KeybdInput(Ord('M'), 0);
  KeybdInput(Ord('M'), KEYEVENTF_KEYUP);
  KeybdInput(VK_MENU, KEYEVENTF_KEYUP);   // Alt
  SendInput(Length(KeyInputs), KeyInputs[0], SizeOf(KeyInputs[0]));
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SendInput 与 keybd_event 的相关文章

  • 使用 GdiPlus 卸载 DLL 时程序挂起

    我有一个加载 DLL 的应用程序 它使用德尔福 GDI 库 http sourceforge net projects delphigdiplus 该应用程序在卸载 DLL 时挂起 调用免费图书馆 https msdn microsoft
  • EIdOSSLUnderlyingCryptoError 和“使用 SSL 连接时出错。错误:14094410...”

    我在 OS X 上的 Delphi 10 1 Berlin 中遇到 Indy 组件问题 我正在使用TIdHTTP使用 HTTPS 连接到 Web 服务 问题是从 OS X 客户端连接到服务器 在 OS X 上运行时 我总是遇到同样的错误 P
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 如何读取注册表项的默认值

    我有一个 Delphi XE2 项目来使用注册表项进行某些操作 所以我定义了以下代码 procedure TMainForm BitBtn01Click Sender TObject var RegistryEntry TRegistry
  • 如何追踪“地址 00000000”的访问违规

    我知道如何创建 map 文件来在错误消息包含实际地址时跟踪访问冲突错误 但是如果错误消息说怎么办 Access violation at address 00000000 Read of address 00000000 我从哪里开始寻找这
  • 在 Delphi 2007 中将具有透明度的位图保存为 PNG

    我有一个包含透明度信息的 Delphi 位图 32 位 我需要将其转换并保存为 PNG 文件 同时保留透明度 我目前拥有的工具是graphics32 Library GR32 PNG 由Christian Budde 提供 和PNGImag
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • 如何从 Delphi 中的函数返回对象而不导致访问冲突?

    我有一个返回 TStringList 的 delphi 函数 但是当我返回一个值并尝试使用它时 我收到一个访问冲突错误 即 myStringList FuncStringList myStringList Items Count lt Th
  • 调试器异常错误和内存超调

    我尝试运行以下代码 但它显示有关内存地址的错误 并显示一条消息 循环后 n 可能未定义 请看一看 var n max integer n integer r R1 f h0 Array of Real const h 0 00889 nip
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • Delphi 流畅的界面

    使用上有什么优点和缺点流畅的界面 http en wikipedia org wiki Fluent interface在德尔福 流畅的界面应该会增加可读性 但我对此有点怀疑one包含很多链式方法的长 LOC 是否存在编译器问题 是否存在任
  • Delphi:写入后代类中私有祖先的字段

    我需要修复第三方组件 该组件的类具有私有变量 该变量由其后代主动使用 TThirdPartyComponentBase class private FSomeVar Integer public end TThirdPartyCompone
  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr
  • 将图像加载到 TImageList 并读取它们?

    我试图通过将 jpg 转换为 bmp 然后将其保存到 imagelist1 来将 jpg 加载到图像列表中 从上到下的代码片段 Selectdir 有效 fileexists 部分有效 这用于加载文件夹中的所有图像 所有图像都以 0 jpg
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • CharInSet 不适用于非英文字母?

    我已经将应用程序从 Delphi 2007 更新到 Delphi 2010 一切都很顺利 除了一条编译正常但不起作用的语句 If Edit1 Text 1 in S then ShowMessage Found else ShowMessa
  • 从其可执行文件的路径获取服务名称

    我有一个可执行文件的路径 它是一个正在运行的服务应用程序 例如 C Program Files x86 Someapp somesvc exe 我想停止并启动它 为此我想我需要获取服务的名称 如下所示 this https stackove

随机推荐

  • C# 代码覆盖率指标

    是否有免费的商用代码覆盖率工具 低至个人 LOC 级别 可用 我知道 VS2008 Team Edition 但不幸的是没有预算购买许可证 所以我正在寻找一种免费的 如啤酒 替代品 有任何想法吗 NCover是 NET 的开源代码覆盖工具
  • 为什么 N3421 不提供 noexcept 限定符?

    In N3421 使运算符函子变得更大 std 函数对象的新特化是 template lt gt struct plus
  • xsd:dateTime 到 Java OffsetDateTime

    为了妥善处理xs 日期时间使用 JAXB 我必须编写自己的转换器String gt java time OffsetDateTime 正如 XML 架构定义中提到的 dateTime 受到 ISO 8601 的启发 我使用OffsetDat
  • SocketIO:通过套接字ID断开客户端连接?

    我有一个带有 SocketIO 和多个连接的节点服务器 如何根据 ID 断开现有套接字 有房间 每个房间都有一个管理员和其他连接 我的目标是使管理套接字能够根据其 ID 使任何其他套接字断开连接 解决方法是向要被踢出的客户端发送一条消息以
  • valgrind:mmap(0x600000,8192)在UME中失败,错误12(无法分配内存)

    我正在关注这个练习 此页面包含安装 Valgrind 3 6 1 的说明 但我当前的 Linux 内核版本不支持此版本的 Valgrind 因此 我安装了 Valgrind 3 11 0 并在运行此命令后按照说明进行操作 valgrind
  • Grails Gorm 如何为每个具体类插入表,其中每个具体类都继承一个抽象类

    大家好 以下是情况 我有一个抽象类 AbstractProfile 和一个具体类 GoogleProfile abstract class AbstractProfile class GoogleProfile extends Abstra
  • C# 程序使用秒表来计时操作时冻结

    我有一个控制灯的 Windows 窗体程序 这种光有自己的类别 我可以做一些事情 比如打开和关闭它 改变颜色等 我可以毫无问题地做到这一点 然而 我想要做的是让灯持续特定的时间 即 100 毫秒或 300 毫秒 取决于使用情况 我尝试使用秒
  • 将 onlongclick 侦听器添加到警报对话框

    我在 android 中有一个 AlertDialog 其中包含来自 sqlite 的好友列表 当我单击列表中的好友姓名时 就会呼叫该好友 我想做的是将一个 longclicklistener 添加到列表中 这样系统就可以提示我删除列表中的
  • 有没有办法在 Postgres 中禁用函数重载

    我和我的用户不在 PL pgSQL 中使用函数重载 每个 模式 名称 元组总是有一个函数 因此 我们希望仅按名称删除函数 更改其签名而不必先删除它 等等 例如 考虑以下函数 CREATE OR REPLACE FUNCTION myfunc
  • 有没有办法在 python 中从头开始创建 .xlsm 文件?

    我在 mac 上使用 python 3 8 1 并尝试创建一个 xlsm文件从头开始 我看过 openpyxl 和 xlsxwriter 它们都能够创建 xlsx文件从头开始 两者都可以编辑现有的 xlsm文件 但我找不到任何有关实际创建的
  • SQLite INSERT ... ON CONFLICT ... WHERE ... DO UPDATE SET 的替代方案

    我正在 Linux 上运行一个使用 SQLite3 版本 3 7 17 的应用程序 这条语句出错了 INSERT INTO taxa taxon id rank parent id VALUES ON CONFLICT taxon id W
  • 从 python 脚本设置 bash 变量

    我在 bash 脚本中调用 python 脚本 我想知道是否有一种简单的方法可以在 python 脚本中设置 bash 变量 Example 我的 bash 脚本 bin bash someVar python3 some folder p
  • 使用 Ajax 和 beforeSend 显示图像

    我对 jquery 和 ajax 比较陌生 我对它们的可能性感到惊讶 我正在开发我的第一个 ajax jquery 带验证插件 网络表单 快完成了 但是有一点不明白 我想显示一个加载图标并使用 beforeSend 方法禁用发送按钮 但它不
  • 如何了解我的平板电脑支持哪些采样率?

    我有一个应用程序可以在许多设备 Xoom Xyboard 等 上完美运行 但在 Galaxy 10 1 上的这一行失败 mrec setAudioSamplingRate 44100 当我注释掉这一行时 一切都会顺利进行 我不确定它默认使用
  • R 中矩阵两列相乘之和

    我使用以下方法在 R 中生成一个矩阵 ncolumns 3 nrows 10 my mat lt matrix runif ncolumns nrows ncol ncolumns 该矩阵表示 3D 中点的坐标 R中如何计算以下值 sum
  • R中按组删除异常值

    在我的数据集中 我必须分别删除每个组的异常值 这是我的数据集 vpg structure list customer c 1L 1L 1L 1L 2L 2L 2L 2L 1L 1L 1L 1L 2L 2L 2L 2L code c 2L 2
  • iOS 15 - 前台通知不会播放通知声音

    在 iOS 15 中播放与通知相关的提示音而不显示横幅或列表的正确方法是什么 在前台处理通知时 无论是本地通知还是推送通知 如果出现以下情况 则不会播放通知声音 UNNotificationPresentationOptions只是soun
  • google automl 会自动进行图像增强吗?

    我正在使用 google 的 automl 使用自定义数据集 该数据集由我收集的图像组成 然而 手动标记图像需要一些时间 所以我想通过图像增强来扩大数据集 例如旋转和模糊 automl 会自动在屏幕后面执行增强吗 AutoML 执行几种类型
  • Pycharm:Python Qt 代码代码补全

    我是 Python 中 Qt 的初学者 我通过使用创建了简单的Qt设计师 我需要什么 用户单击按钮后 应用程序将文本从编辑复制到标签 我有文件example ui来自 Qt 设计师
  • SendInput 与 keybd_event

    MSDN 指出 keybd event 已被 SendInput 取代 在重写过程中 我改用 SendInput 这很好except当尝试发送 Alt 键组合时 在 Win7 64 位系统上 尚未在其他地方尝试过 发送 Alt 键会导致击键