2012-10-18 191 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'調用? –