delphi - 使用WinAPI在Delphi中模拟键盘输入

标签 delphi winapi delphi-2009

我需要以编程方式将一个字符输入 Delphi 网格的单元格(在其他应用程序中)。

要手动执行此操作,需要执行以下步骤:

  1. 按 F3 按钮。
  2. 按向右箭头键 3 次。
  3. 按空格键。
  4. 在键盘上输入字母“E”。
  5. 按向右箭头键。

     // Press F3 button         
     keybd_event(VK_F3, 0, 0, 0);         
     // Press right arrow key 3 times
     keybd_event(VK_RIGHT, 0, 0, 0);
     keybd_event(VK_RIGHT, 0, 0, 0);
     keybd_event(VK_RIGHT, 0, 0, 0);
    
     // Press the space button
     keybd_event(VK_SPACE, 0, 0, 0);
    
     // Type letter E
     keybd_event(Ord('E'), 0, 0, 0);
    
     // Move to the right
     keybd_event(VK_RIGHT, 0, 0, 0);
    

但是这不起作用。当我运行这段代码时,似乎什么也没有发生。

我应该如何修改此代码才能真正模拟用户输入?

最佳答案

每次按键都是按下一个键,然后按下一个键。因此,每次按键时您需要调用两次 keybd_event 。例如,按 F3:

keybd_event(VK_F3, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(VK_F3, 0, KEYEVENTF_KEYUP, 0);

请注意,KEYEVENTF_KEYDOWN 实际上并不是由 Windows 头文件或 Delphi 翻译定义的。将其定义为0。不过,它使明确写出的代码更加清晰。

当然,您不会通过对 keybd_event 的成对调用来乱扔代码。但相反,您可以将成对的调用包装到辅助函数中。

在某些情况下,您可能需要指定第二个参数,即扫描代码。但这通常是没有必要的。

关于delphi - 使用WinAPI在Delphi中模拟键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12950920/

相关文章:

delphi - 货币值(value)/恒定值比较的奇怪结果

delphi - 该月的第一个[星期一]、该月的第二个[星期四]等 Delphi

delphi - SetWindowsHookEx for WH_KEYBOARD(全局)不使用Dll?

delphi - 从流中读取对象时忽略未知属性

c++ - 尝试将字符索引传递给 DrawText

c++ - 释放 LPDIRECT3D9 和 LPDIRECT3DDEVICE9 后的内存状态

Delphi 2009 处理 with

delphi - 从 FastMM 获取更长的堆栈跟踪?

delphi - 在delphi7中使用 "record"类型时访问冲突

c++ - 确定应用程序的启动方式 - 由用户启动或自动启动