模拟键盘事件

时间:2010-12-02 14:09:36

标签: .net events keyboard virtual keypress

我正在尝试将字符串值插入第三方应用程序,例如记事本。以下是我正在使用的代码

[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值= 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

2 个答案:

答案 0 :(得分:1)

keybd_event已被SendInput取代。我建议看一下Windows Input Simulator,它在Send Input API周围提供了一个很好的C#Wrapper。您还可以使用SendInput API模拟鼠标移动(我相信他们正在为下一版本的输入模拟器工作)。

我已经将这个库用于自动化项目,它似乎工作得很好,但是有一些怪癖(IE键盘主页+ SHIFT + END没有按预期选择所有文本)。

答案 1 :(得分:0)

keybd_event的第一个参数是虚拟键码,而不是ASCII码。一些VK与ASCII相同(这就是为什么你得到第一个!),但这不是这样做的。

实现目标的一种方法是使用SendInput方法。对于此方法,您可以传递KEYBDINPUT,该字段具有用于传递Unicode字符的字段(如果指定KEYEVENTF_UNICODE标志)。