2014-12-27 110 views
6

后,我有一个小程序,模拟CTR使用系统 + Ç & CTR + v(复制&粘贴)事件keybd_event。问题是,在程序运行后,计算机继续按下按键,然后 - 如果我键入a它会选择整个文档,如果我滚动鼠标滚轮,它将更改文本面,等它不仅发生在Visual Studio编辑器,但在任何其他程序,而程序运行如Word等已打开 这里是我的代码:Ctrl键保存下来模拟ctrl键按下事件和ctrl键向上事件

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

是否有人知道我还能有什么办法来解决这个问题?

+1

请勿使用KEYEVENTF_EXTENDEDKEY,请改为使用0。不要使用VK_LCONTROL,而应使用VK_CONTROL。 – 2014-12-27 20:41:32

回答

4

下面是解决方案,这完全适用于我。注意参数中的变化发送到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 
    } 

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