用WinAPI在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

我需要通过编程将一个字符输入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_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示例(带有源代码),它模拟击键和鼠标单击,然后按顺序播放。