2016-08-04 15 views
2

Oracleの塗りつぶしデータに使用したキーボードイベントをシミュレートする小さなプログラムを作成しましたが、文字のアンダースコアを導入するためにkeybd_eventを使用すると出力が間違っています _プログラムは次の文字が自動的に文字を追加するシミュレートしたときに - Keybd_eventがアンダースコアで間違った出力を提供する

は、誰かが私を助けてもらえ 09_80

例 は私がVK_OEM_MINUS 出力とVK_RSHIFTの組み合わせを使用し、アンダースコアのためにテープ09_80 に必要なのですか? 私はInputSimulatorでもしようとしたが、それは私のプログラムからのコードのいくつかの行の下にここだけのWindows 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; 
ました

// SEND 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、いくつかのテストの後、私は問題と私はそれを修正した。 _(アンダースコア)は、2行目のステートメントの続きを意味します。このため、次の文字は - で始まります。 この方法で次のcharをメソッドから除外してこの問題を修正しました。

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); 
     } 
    } 

出力が完全に正しいです。 助けてくれてありがとう