模拟ctrl键向下事件和ctrl键向上事件后,Ctrl键保持按下状态

Kat*_*ivi 6 c# ctrl keyboard-events

我有一个小程序,使用该系统模拟ctr+ c&ctr+ v(复制和粘贴)事件keybd_event.问题是程序运行后,计算机继续ctrl按下键,然后 - 如果我键入a它选择整个文档,如果我滚动鼠标滚轮它会改变文本方面等.它不仅发生在Visual Studio编辑器中,但在程序以Word等运行时打开的任何其他程序.这是我的代码:

    //The system keyboard event.
    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

    public const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key down flag
    public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag
    public const int VK_LCONTROL = 0xA2; //Left Control key code
    public const int C = 0x43; // C key code
    public const int V = 0x56; // V key code

    static void Main(string[] args)
    {
        Thread.Sleep(1000);// So I have time to select something.

        //Simulate ctrl+c
        keybd_event(VK_LCONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(C, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(C, 0, KEYEVENTF_KEYUP, 0);
        keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);

        //Simulate ctrl+v
        keybd_event(VK_LCONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(V, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(V, 0, KEYEVENTF_KEYUP, 0);
        keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
    }
Run Code Online (Sandbox Code Playgroud)

有人知道我能做些什么来解决这个问题吗?

Kat*_*ivi 4

这是解决方案,这对我来说完全有效。注意发送到 keybd_event 的参数的变化。我使用了CodeProject的一篇文章,链接:http://www.codeproject.com/Articles/7305/Keyboard-Events-Simulation-using-keybd-event-funct。这是我修复后的代码:

\n\n
    //The system keyboard event.\n    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]\n    static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);\n    public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag\n    public const int VK_CONTROL = 0x11; //Control key code\n    public const int C = 0x43; // C key code\n    public const int V = 0x56; // V key code\n\n    static void Main(string[] args)\n    {\n        Thread.Sleep(1000);// So I have time to select something.\n\n        // Simulating Ctrl+C\n        keybd_event(VK_CONTROL, 0x9d, 0, 0); // Ctrl Press\n        keybd_event(C, 0x9e, 0, 0); // \xe2\x80\x98A\xe2\x80\x99 Press\n        keybd_event(C, 0x9e, KEYEVENTF_KEYUP, 0); // \xe2\x80\x98A\xe2\x80\x99 Release\n        keybd_event(VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, 0); // Ctrl Release\n\n        // Simulating Ctrl+V\n        keybd_event(VK_CONTROL, 0x9d, 0, 0); // Ctrl Press\n        keybd_event(V, 0x9e, 0, 0); // \xe2\x80\x98A\xe2\x80\x99 Press\n        keybd_event(V, 0x9e, KEYEVENTF_KEYUP, 0); // \xe2\x80\x98A\xe2\x80\x99 Release\n        keybd_event(VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, 0); // Ctrl Release\n   }\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望这会对某人有所帮助。感谢所有帮助过我的人!

\n