用WinAPI在Delphi中模拟键盘输入
我需要通过编程将一个字符输入Delphi网格的单元格(在其他应用程序中) 要手动执行此操作,需要执行以下步骤:用WinAPI在Delphi中模拟键盘输入,delphi,winapi,delphi-2009,Delphi,Winapi,Delphi 2009,我需要通过编程将一个字符输入Delphi网格的单元格(在其他应用程序中) 要手动执行此操作,需要执行以下步骤: 按F3按钮 按向右箭头键3次 按空格键 在键盘上键入字母“E” 按向右箭头键 // 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_RIGH
// 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\u event
。例如,要按F3键:
keybd_event(VK_F3, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(VK_F3, 0, KEYEVENTF_KEYUP, 0);
请注意,KEYEVENTF\u KEYDOWN
实际上不是由Windows头文件或Delphi翻译定义的。将其定义为0
。但是,它使代码更清晰,并且可以显式地写出
当然,您不会在成对调用keybd\u event
时浪费代码。但是,您可以将成对的调用包装成一个helper函数
在某些情况下,可能需要指定第二个参数,即扫描代码。但这通常是不必要的。谢谢。当所述控件未聚焦时,
keybd\u事件
是否有效?@DmitriPisarenko NOT it NOT。输入消息通过输入焦点进入控件。是否可以将keybd_事件
调用替换为向网格发送windows消息?@Dmitrisarenko。将PostMessage
与WM\u KEYDOWN
和WM\u keydup
一起使用。关于WM\u keydup
消息的lParam
。据我所知,lParam
中有3个1位,这给了我一个0x8000C
的值。原因:这是正确的吗?我在一段时间前做了一些事情(还有很多其他的)。但对于您的问题,如果您的目标是TStringGrid
,我认为您除了聚焦它并模拟击键之外,别无选择(如果我没记错的话,TStringGrid
不会响应任何能够设置单元格文本的消息)。在此特定应用程序中,只能通过键盘将值输入该网格。我已经用AutoHotKey和MS UI Automation完成了这项工作,但现在需要在Delphi中重写这段代码。我不能依赖网格的聚焦,因为目标系统上有一个程序,它每200毫秒就会自动激活一次。你可以尝试使用WM\u KEYDOWN
,WM\u keydup
消息,但我不确定它是否总是在两个进程之间工作……下面是autoclic的un示例(带有源代码),它模拟击键和鼠标单击,然后按顺序播放。