2012-01-12 3 views
1

C#의 SendInput API로 게임에 일부 키를 보내려고합니다. SendInput API로 일부 키를 보내고 싶습니다.

[DllImport("user32.dll")] 
    static extern int SendInput(int nInputs, INPUT[] pInputs, int cbSize);  

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

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

    [StructLayout(LayoutKind.Sequential)] 
    private struct HARDWAREINPUT 
    { 
     public uint uMsg; 
     public ushort wParamL; 
     public ushort wParamH; 
    } 

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

    public static void WalkFront() 
    { 
     INPUT[] inputs = new INPUT[1]; 

     Keys virtualKeycode = (Keys)0x15;    

     inputs[0].type = INPUT_KEYBOARD;    
     inputs[0].ki.wVk = (short)virtualKeycode; 
     inputs[0].ki.wScan = (short)MapVirtualKey((int)virtualKeycode, 0);    
     inputs[0].ki.dwFlags = KEYEVENTF_SCANCODE;    
     inputs[0].ki.time = 0; 
     inputs[0].ki.dwExtraInfo = GetMessageExtraInfo(); 

     SendInput(1, inputs, Marshal.SizeOf(inputs[0]));   
    } 

를 제대로 작동하지 않습니다 그러나 다음과 같이

내가 몇 가지 코드를 썼다 (내 환경은 윈도우 7 64 비트입니다).

분명히이 코드는 백 스페이스을 게임에 보낼 수 있습니다. 사실,이 코드는 Notepad.exe에서 문자를 삭제할 수 있습니다.

기이하게도이 코드는 백 스페이스 만 응용 프로그램에 보냅니다. 나는이 코드에서 keycode (나는 0x14, 0x13, 0x12 등을 시도했다.)를 변경했다. 그러나이 코드는 백 스페이스 만 보냅니다.

다른 키 (J, K, L ... 등)를 응용 프로그램에 보내고 싶지만 할 수 없습니다.

조언이 있으십니까? 감사합니다.

+0

'SendInput' 호출을하기 전에'inputs [0] .ki.wScan'의 값은 무엇입니까? 'MapVirtualKey' 함수가 성공 했습니까, 아니면 0을 리턴합니까? –

+1

가상 키와 스캔 코드가 혼합되어 있습니다. 가상 키 0x15는 일본어 키보드에서만 사용할 수 있습니다. 그러나 0x15는 백 스페이스 키의 스캔 코드입니다. .NET SendKeys 클래스 사용을 고려하십시오. –

+0

조언 해 주셔서 감사합니다. 그러나 .NET SendKeys 클래스를 사용하려고하면 키를 게임에 보낼 수 없습니다. 확률, 게임 DirectInput 그래서 SendInputs 같은 낮은 수준의 API를 사용해야한다고 생각합니다. – user1145477

답변

3

키 누르기 이벤트는 키 누르기와 그 이후의 키 - 업 이벤트로 구성됩니다. 즉, "백 스페이스 보내기"는 SendInput을 두 번 호출해야합니다. 한 번 키를 누른 상태에서 한 번, 키를 놓은 상태에서 한 번 누릅니다. 키를 놓은 채로 SendInput을 호출하지 못하면 이후 키 누름이 대부분의 앱에서 무시됩니다.

관련 문제