Ctrl key kept down after simulating a ctrl key down event and ctrl key up event
Asked Answered
Y

1

6

I have a small program that simulates ctr+c & ctr+v (copy & paste) events using the system keybd_event. The problem is that after the program runs the computer continues to act as if the ctrl key is pressed down and then - if I type a it selects the whole document, if I roll the mouse wheel it changes the text side, etc. It happens not only in Visual Studio editor, but in any other program that was opened while the program ran as Word etc. Here is my code:

    //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);
    }

Does someone know what could I do to solve this problem?

Yugoslav answered 27/12, 2014 at 20:15 Comment(1)
Don't use KEYEVENTF_EXTENDEDKEY, use 0 instead. Don't use VK_LCONTROL, use VK_CONTROL instead.Enteron
Y
4

Here is the solution, this worked for me completely. Notice the changes in the parameters send to the keybd_event. I used an article of CodeProject, link: http://www.codeproject.com/Articles/7305/Keyboard-Events-Simulation-using-keybd-event-funct . This is my repaired code:

    //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_KEYUP = 0x0002; //Key up flag
    public const int VK_CONTROL = 0x11; //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.

        // Simulating Ctrl+C
        keybd_event(VK_CONTROL, 0x9d, 0, 0); // Ctrl Press
        keybd_event(C, 0x9e, 0, 0); // ‘A’ Press
        keybd_event(C, 0x9e, KEYEVENTF_KEYUP, 0); // ‘A’ Release
        keybd_event(VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, 0); // Ctrl Release

        // Simulating Ctrl+V
        keybd_event(VK_CONTROL, 0x9d, 0, 0); // Ctrl Press
        keybd_event(V, 0x9e, 0, 0); // ‘A’ Press
        keybd_event(V, 0x9e, KEYEVENTF_KEYUP, 0); // ‘A’ Release
        keybd_event(VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, 0); // Ctrl Release
   }

I hope this will help someone. Thanks for all who helped me!

Yugoslav answered 29/12, 2014 at 18:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.