2010-12-02 139 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