在模拟 Ctrl 键向下事件和 Ctrl 键向上事件后按住 Ctrl 键

本文关键字:Ctrl 事件 模拟 | 更新日期: 2023-09-27 18:35:30

我有一个小程序,它使用系统keybd_event模拟ctr+cctr+v(复制和粘贴)事件。问题是,在程序运行后,计算机继续运行,就好像按下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);
    }

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

在模拟 Ctrl 键向下事件和 Ctrl 键向上事件后按住 Ctrl 键

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

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

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