2015-01-18 3 views
1

나는 3 개의 "return key"를 directx 응용 프로그램에 보내는 작은 응용 프로그램을 작성하고 있습니다. 하지만 난 directx 응용 프로그램에서만 첫 번째 "반환 키"작업 .. 메모장에서 테스트했기 때문에 오류가 발생했습니다. 나는 이유가 뭔지 몰라.C# directx 응용 프로그램에 키 스트로크 보내기

도와주세요. 고마워요! :)

 private int Itournament; 
     private int FLAG = 0x0008; 

     [DllImport("user32.dll")] 
     static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize); 

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

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

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

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

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Itournament = Convert.ToInt32(textBox1.Text); 
      panel1.Enabled = false; 
      button2.Enabled = true; 
      Droid(Itournament); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      Application.Restart(); 
     } 

     private void Droid(int Itournament_) 
     { 
      Thread.Sleep(5000); 
      Send_Key(0x1C); 
      Thread.Sleep(5000); 
      Send_Key(0x1C);    

      /*do 
      { 
       Send_Key(0x14); 
       Itournament_--; 
      } 
      while (Itournament_ != 0);*/ 
     } 

     private void Send_Key(short Keycode) 
     { 
      INPUT[] InputData = new INPUT[1]; 

      InputData[0].type = 1; 
      InputData[0].ki.wScan = Keycode; 
      InputData[0].ki.dwFlags = FLAG; 
      InputData[0].ki.time = 0; 
      InputData[0].ki.dwExtraInfo = IntPtr.Zero; 

      SendInput(1, InputData, Marshal.SizeOf(typeof(INPUT))); 
     } 

답변

0

FLAG가 ScanCode로 설정되어 있습니다. 다른 모든 것은 올바르게 보입니다. 이것은 내 열거입니다.

[Flags] 
public enum KeyFlag 
{  
    KeyDown = 0x0000, 
    ExtendedKey = 0x0001, 
    KeyUp = 0x0002, 
    UniCode = 0x0004, 
    ScanCode = 0x0008 
} 

시도는 FLAG의 값으로 스캔 코드와 함께 (0000)에서 KeyDown을 보낼 수 있습니다.

예 : KeyFlag.KeyDown | KeyFlag.ScanCode

KeyFlag.KeyUp을 사용하여 다른 SendInput을 보내야합니다. keypress를 시뮬레이트하고 down 키를 해제하려면 KeyFlag.ScanCode.

+0

이 솔루션을 시도했지만 문제가 무엇인지 알았습니다 ... 한 번 사용한 키를 보낼 수 없습니다 ... – drk88

+1

당신은 할 수 있어야하지만 다른 메시지를 보내야 KeyUp도 시뮬레이션 할 수 있습니다. 키 누름. –

관련 문제