Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ctrl key kept down after simulating a ctrl key down event and ctrl key up event

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?

like image 379
Katzivi Avatar asked Dec 27 '14 20:12

Katzivi


1 Answers

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!

like image 171
Katzivi Avatar answered Oct 30 '22 16:10

Katzivi