2016-08-04 11 views
2

Oracle에서 채워진 데이터에 사용 된 키보드 이벤트를 시뮬레이트하는 작은 프로그램을 만들었지 만, 밑줄 문자를 소개하기 위해 keybd_event를 사용할 때 출력이 잘못되었습니다. _이 마지막 문자가 아닌 경우, 프로그램이 다음 문자가 자동으로 문자를 추가 시뮬레이션 할 때 - Keybd_event가 잘못된 출력을 제공합니다.

누군가가 나를 도울 수 09_80

예 은 내가 VK_OEM_MINUS 출력과 VK_RSHIFT의 조합을 사용하여 밑줄을 위해 테이프 09_80 필요하다? 나는 InputSimulator으로도 시도하지만 미리 내 프로그램에서 코드 몇 줄 아래에 다음

, 윈도우 8이 제대로 안부

// 키보드 액션

[DllImport("user32.dll", SetLastError = true)] 
    public static extern void keybd_event(int bVk, int bScan, int dwFlags, int dwExtraInfo); 

    [DllImport("user32.dll")] 
    public static extern int MapVirtualKey(int uCode, int uMapType); 

    [DllImport("user32.dll", CharSet = CharSet.Unicode)] 
    public static extern short VkKeyScan(char ch); 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    public static extern string SendMessage(IntPtr hWnd, int msg, string wParam, IntPtr lParam); 

    public const int KEYEVENTF_EXTENDEDKEY = 0x0001; 


    public const int KEYEVENTF_KEYUP = 0x0002; 
을 감사를 실행했다 여기서

// CHAR에게

public static void SendChar(char c) 
    { 
     if (bw.CancellationPending) 
     { 
      return; 
     } 
     if(c=='_') 
     { 


      keysPress(VK_RSHIFT,VK_OEM_MINUS) 
     } 

     int vk = VkKeyScan(c); 
     int sc = MapVirtualKey(vk, 0); 
     PressKeyDn(vk, sc); 
     ReleaseKeyUp(vk, sc); 


    } 

    //SEND STRING 
    public static void SendString(string s) 
    { 

      foreach (char c in s) 
      { 
       SendChar(c); 
      } 

    } 

    //PRESS KEY DOWN 
    public static void PressKeyDn(int VK_Code, int SC_Code) 
    { 
     keybd_event(VK_Code, SC_Code, 0, 0); 
    } 

    //RELEASE KEY UP 
    public static void ReleaseKeyUp(int VK_Code, int SC_Code) 
    { 
     keybd_event(VK_Code, SC_Code, KEYEVENTF_KEYUP, 0); 
    } 

    //Press Special Key 
    public static void keyPress(int VK_key) 
    { 
     if (bw.CancellationPending) 
     { 
      return; 
     } 
     int sc = MapVirtualKey(VK_key, 0); 
     PressKeyDn(VK_key, sc); 
     ReleaseKeyUp(VK_key, sc); 

    } 

    //Press Special Key Combination 2 keys 
    public static void keysPress(int VK_Key1,int VK_Key2) 
    { 
     if (bw.CancellationPending) 
     { 
      return; 
     } 
     int sc1 = MapVirtualKey(VK_Key1, 0); 
     int sc2 = MapVirtualKey(VK_Key2, 0); 
     PressKeyDn(VK_Key1, sc1); 
     PressKeyDn(VK_Key2, sc2); 
     ReleaseKeyUp(VK_Key2, sc2); 
     ReleaseKeyUp(VK_Key1, sc1); 

    } 

    //Press Special Key Combination 3 keys 
    public static void keysPress(int VK_Key1, int VK_Key2,int VK_Key3) 
    { 
     if (bw.CancellationPending) 
     { 
      return; 
     } 
     int sc1 = MapVirtualKey(VK_Key1, 0); 
     int sc2 = MapVirtualKey(VK_Key2, 0); 
     int sc3 = MapVirtualKey(VK_Key3, 0); 
     PressKeyDn(VK_Key1, sc1); 
     PressKeyDn(VK_Key2, sc2); 
     PressKeyDn(VK_Key3, sc3); 
     ReleaseKeyUp(VK_Key3, sc3); 
     ReleaseKeyUp(VK_Key2, sc2); 
     ReleaseKeyUp(VK_Key1, sc1); 
    } 
+0

Sigh, 키 스트로크를 시뮬레이트하는 수많은 방법이 실패 할 수 있습니다 ... VK_RSHIFT가 올바르지 않습니다. 왼쪽 및 오른쪽 시프트 키가 동일한 가상 키를 생성합니다. 어느 쪽이 다운되었는지 확인해야 할 경우에만 VK_L/RSHIFT를 사용하십시오. 대신 VK_SHIFT를 사용해야합니다. 그게 문제를 일으키는 지, 어쩌면, 어쩌면. –

+0

불행히도 나는 VK_RSHIFT + VK_OEM_MINUS, VK_LSHIFT + VK_OEM_MINUS, VK_SHIFT + VK_OEM_MINUS를 시도했지만 결과는 항상 동일합니다. 언더 스코어가 마지막 문자 인 경우 결과는 ok입니다 (예를 들어 테이프 0을 원하면 결과가 0입니다). 문제는 테이프 0_을 원하고 또 다른 0 이후에 결과가 0_-0 인 경우 밑줄 뒤에 다른 문자를 테이프 할 때입니다. –

답변

0

OK 보내기, 몇 가지 테스트 후 나는 발견했다 문제와 나는 그것을 고쳤다. _ (밑줄)은 두 번째 줄의 명령문이 계속되는 것을 의미하므로 다음 문자는 -로 시작합니다. 이런 식으로 메서드에서 다음 문자를 제외하고이 문제를 해결했습니다.

public static void SendChar(char c) 
    { 
     bool und = false; 
     if (c == '_') 
     { 
      und = true; 
     } 
     int vk = BMDLCommands.VkKeyScan(c); 
     int sc = BMDLCommands.MapVirtualKey(vk, 0); 
     if(und) 
     { 
      keysPress(VK_SHIFT, VK_OEM_MINUS); 
      MethodInvoker met = delegate 
      { 
       keyPress(vk); 
      }; 
     } 
     else 
     { 
      BMDLCommands.PressKeyDn(vk, sc); 
      BMDLCommands.ReleaseKeyUp(vk, sc); 
     } 
    } 

출력이 완전히 맞습니다. 도움을 많이 주셔서 고마워요.