2013-02-06 20 views
1

我有應用程序,將字符輸入發送到另一個應用程序。 一切都很好,但如果文本包含重複字符(例如「應用程序」),那麼只有一個字母'p'會到達目標窗口。SendInput隱藏重複的符號(似乎它不執行KEYUP事件)

發送「app」時,我收到「ap」。 搜索網絡後,我發現這是因爲缺少KEYUP事件。但我在下面的代碼中肯定有一個。怎麼了?

void SendText(string text) 
{ 
    int len = text.Length; 
    int inputsSize = len * 2; 

    INPUT[] inputs = new INPUT[inputsSize]; 

    for (int i = 0; i < len; i++) 
    { 
     INPUT inp = new INPUT(); 
     inp.type = 1; //INPUT_KEYBOARD; 
     inp.U.ki.dwFlags = KEYEVENTF.UNICODE; 
     inp.U.ki.time = 0; 
     inp.U.ki.wVk = 0; 
     inp.U.ki.wScan = (short)text[i]; 
     inp.U.ki.dwExtraInfo = GetMessageExtraInfo(); 

     inputs[i] = inp; 

     INPUT inpUp = inp; 

     inpUp.U.ki.dwFlags = KEYEVENTF.UNICODE | KEYEVENTF.KEYUP; 

     inputs[i + 1] = inpUp; 

    } 

    SendInput((uint)inputsSize, inputs, INPUT.Size); 
} 

回答

0

嗯..我已經找到了自己的決定。但我仍然不知道爲什麼第一個代碼不起作用。這是一個工作示例。 正如你所看到的 - 每個keyevent都是由單獨的SendInput而不是一個keyevent包發送的。按我的需要工作。

void SendText(string text) 
{ 
    int len = text.Length; 
    int inputsSize = len * 2; 

    //INPUT[] inputs = new INPUT[inputsSize]; 
    INPUT[] inputs = new INPUT[1]; 

    for (int i = 0; i < len; i++) 
    { 
     INPUT inp = new INPUT(); 
     inp.type = 1; //INPUT_KEYBOARD; 
     inp.U.ki.dwFlags = KEYEVENTF.UNICODE; 
     inp.U.ki.time = 0; 
     inp.U.ki.wVk = 0; 
     inp.U.ki.wScan = (short)text[i]; 
     inp.U.ki.dwExtraInfo = GetMessageExtraInfo(); 

     //inputs[i] = inp; 
     inputs[0] = inp; 
     SendInput(1, inputs, INPUT.Size); 

     inp = new INPUT(); 
     inp.type = 1; //INPUT_KEYBOARD; 
     inp.U.ki.dwFlags = KEYEVENTF.KEYUP | KEYEVENTF.UNICODE; 
     inp.U.ki.time = 0; 
     inp.U.ki.wVk = 0; 
     inp.U.ki.wScan = (short)text[i]; 
     inp.U.ki.dwExtraInfo = GetMessageExtraInfo(); 

     //inputs[i + 1] = inp; 
     inputs[0] = inp; 
     SendInput(1, inputs, INPUT.Size); 
    } 

    //SendInput((uint)inputsSize, inputs, INPUT.Size); 
}