2012-10-18 139 views
5

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

为了手动做到这一点,需要以下步骤:

  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); 
    

但它不工作。当我运行这个代码时,似乎没有任何事情发生。

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

+0

前段时间我做了一些关于['虚拟键盘'](http://stackoverflow.com/a/12565963/960757)(还有很多其他的)。但是对于你的问题,如果你的目标是'TStringGrid',我认为你不能做任何事情而不是关注它并模拟你的击键(如果我记得没错,'TStringGrid'不响应任何类型的消息能够设置单元格的文本)。 – TLama

+0

在这个特定的应用程序中,只能通过键盘将值输入到网格中。我已经使用AutoHotKey和MS UI Automation完成了这一工作,但现在需要在Delphi中重写此代码。 –

+0

我不能依赖被聚焦的网格,因为目标系统上有一个程序,它每200毫秒激活一次。 –

回答

9

每个按键都是一个按键,然后是一个按键。所以你需要两个电话keybd_event每按键。例如,按F3:

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

注意KEYEVENTF_KEYDOWN实际上不是由Windows头文件,或德尔福翻译定义。将其定义为0。它使得代码更清晰地写出来。

当然,你不会忘记你的密码与keybd_event的配对调用。但相反,你会将配对的呼叫包装到辅助函数中。

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

+0

谢谢。 “keybd_event”在没有关注的控件时工作吗? –

+0

@DmitriPisarenko并非如此。输入消息通过输入焦点进入控件。 –

+0

是否有可能用发送Windows消息到网格来代替'keybd_event'调用? –