2010-12-02 174 views
1

我想插入字符串值到第三方應用程序說,記事本。以下是我正在使用的代碼模擬鍵盤事件

[DllImport("user32.dll")] 
    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); 

public void sim_type(string txt) 
    { 

     const int KEYEVENTF_EXTENDEDKEY = 0x1; 
     const int KEYEVENTF_KEYUP = 0x2; 
     byte[] ASCIIValues = Encoding.ASCII.GetBytes(txt); 

     foreach (byte keyCode in ASCIIValues) 
     { 
      Console.WriteLine("Ascii Values = " + keyCode); 
      keybd_event(keyCode, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0); 
      keybd_event(keyCode, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0); 
     } 


    } 

我正在給示例文本消息例如「這是測試消息」。 我正在獲取正確的ascii值。 但是在相應的示例消息的目標文本框中,我正在獲取此輸出。

T89 9 1 13:38 02/12/2010513:38 02/12/2010 -5175

能有人幫助解決這個問題。我還投入控制檯打印的ASCII值

消息話題:這是一個測試消息

{
ASCII值= 84個

ASCII值= 104個
ASCII值= 105
Ascii值= 115
Ascii值= 32
Ascii值= 105
Ascii值I值= 115個
ASCII值= 32個
ASCII值= 97個
ASCII值= 32個
ASCII值= 116個
ASCII值= 101個
ASCII值= 115個
ASCII值= 116個
ASCII值= 32個
ASCII值= 109個
ASCII值= 101個
ASCII值= 115個
ASCII值= 115
個 ASCII值= 97個
ASCII值= 103個
ASCII值= 101
}

請有人幫助 謝謝, Nikil

+0

下面是如何使用[SendKeys](http://msdn.microsoft.com/zh-cn/library/ms171548.aspx)執行此操作的示例。 – detunized 2010-12-02 14:20:50

回答

0

keybd_event的第一個參數是一個虛擬鍵碼,而不是一個ASCII碼。一些VK與ASCII相同(這就是爲什麼你得到第一個T!),但這不是做到這一點的方法。

達到目標的一種方法是使用SendInput方法。對於此方法,您可以傳遞一個KEYBDINPUT,該KEYBDINPUT具有用於傳遞Unicode字符的字段(如果指定了KEYEVENTF_UNICODE標誌)。

+0

非常感謝。你幫助我確定我的錯誤。 SendKeys比我之前做的更容易。 – Nikil 2010-12-02 19:10:00

1

keybd_event已被替換爲SendInput。我建議看看Windows Input Simulator,它提供了一個很好的圍繞Send Input API的C#Wrapper。您還可以使用SendInput API(以及我相信他們正在爲下一版本的輸入模擬器工作)模擬鼠標移動。

我已經使用這個圖書館的自動化項目,它似乎工作得很好,但也有一些怪癖(IE鍵SHUT + SHIFT鍵不按預期選擇所有文本)。

+0

上面提到的問題實際上是由我自己在這裏提交補丁解決的http://inputsimulator.codeplex.com/workitem/13002我仍然強烈推薦這個庫,用於任何正在尋找一個很好的SendInput託管界面的人。 – aolszowka 2012-07-13 19:38:43