2014-12-27 108 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 
    } 

我希望這會幫助別人。感謝所有幫助我的人!