2017-01-16 14 views
0

私はキーボード入力をC#を使用して特定のプロセスにシミュレートしようとしています。 文字と数字の入力はうまくいきますが、「特殊文字」(ENTER、TABなど)キーを押すと何も起こりません。処理するキーボード入力のシミュレーションに問題があります

これらの特殊文字をシミュレートすることは、Skypeなどの他のプロセスでうまくいくことです。

この奇妙なやり取りの原因は何ですか?私は他の言語でも試してみることができます。なぜなら私のプロジェクトでこれまでに得られていないからです。

SendInput()PostMessage()を試してみましたが、両方が同じ結果を共有していますが、charsの入力は機能しますが、特殊キーは使用しません。

答えて

0

私はそれを解決することができました。私は誰かが私が持っていたのと同じ問題でこのポストにつまずく場合に備えて私のソリューションを投稿します。

解決策は実際にはかなり簡単です。仮想キーコードを送信する代わりにキーボードスキャンコードを送信すると、すべて正常に動作します。 ここに簡単な例があります。

using System.Runtime.InteropServices; 
... 
    public static void PressEnter() 
    { 
     INPUT input = new INPUT(); 
     input.type = (int)InputType.INPUT_KEYBOARD; 
     input.ki.wScan = 0x1C; 
     input.ki.dwFlags = (int)KEYEVENTF.SCANCODE; 
     input.ki.dwExtraInfo = GetMessageExtraInfo(); 

     var arrayToSend = new INPUT[] { input }; 

     SendInput(1, arrayToSend, Marshal.SizeOf(input)); //Send KeyDown 
     arrayToSend[0].ki.dwFlags = (int)KEYEVENTF.SCANCODE | (int)KEYEVENTF.KEYUP; 
     SendInput(1, arrayToSend, Marshal.SizeOf(input)); //Send KeyUp 
    } 

その他の必要な情報:

[StructLayout(LayoutKind.Explicit)] 
    public struct INPUT 
    { 
     [FieldOffset(4)] 
     public HARDWAREINPUT hi; 
     [FieldOffset(4)] 
     public KEYBDINPUT ki; 
     [FieldOffset(4)] 
     public MOUSEINPUT mi; 
     [FieldOffset(0)] 
     public int type; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct HARDWAREINPUT 
    { 
     public int uMsg; 
     public short wParamL; 
     public short wParamH; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct MOUSEINPUT 
    { 
     public int dx; 
     public int dy; 
     public int mouseData; 
     public int dwFlags; 
     public int time; 
     public IntPtr dwExtraInfo; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct KEYBDINPUT 
    { 
     public short wVk; 
     public short wScan; 
     public int dwFlags; 
     public int time; 
     public IntPtr dwExtraInfo; 
    } 

    [Flags] 
    public enum InputType 
    { 
     INPUT_MOUSE = 0, 
     INPUT_KEYBOARD = 1, 
     INPUT_HARDWARE = 2 
    } 

    [Flags] 
    public enum KEYEVENTF 
    { 
     KEYDOWN = 0, 
     EXTENDEDKEY = 0x0001, 
     KEYUP = 0x0002, 
     UNICODE = 0x0004, 
     SCANCODE = 0x0008, 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    public static extern IntPtr GetMessageExtraInfo(); 
    [DllImport("user32.dll", SetLastError = true)] 
    public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); 
関連する問題