0

キープレスのシミュレーションに役立つWindowsInputSimulatorライブラリを利用しようとしています。

ソフトウェアは、クライアントとサーバーで構成されます。クライアントでキーが入力されると、そのKeyEventArgsがサーバーに送信されます。次に、サーバーはそれを使用して次のことを行います。

public void SendKeyDown(Keys keyCode, Keys modifiers)
{
  uint nonVK = MapVirtualKey((uint)keyCode, 2);
  char mappedChar = Convert.ToChar(nonVK);
  if (modifiers.Equals(Keys.None))
  {
    VirtualKeyCode vkc;
    if (Enum.TryParse(VkKeyScan(mappedChar).ToString(), out vkc))
    {
      InputSimulator.SimulateKeyDown(vkc);
    }
  }
  else
  {
    //Find out which modifier we're working with.
    uint modVK = MapVirtualKey((uint)modifiers, 2);
    char modifierChar = Convert.ToChar(modVK);
    VirtualKeyCode vkc, modVkc;
    if (Enum.TryParse(VkKeyScan(mappedChar).ToString(), out vkc)
        && Enum.TryParse(VkKeyScan(modifierChar).ToString(), out modVkc))
    {
      InputSimulator.SimulateModifiedKeyStroke(modVkc, vkc);
    }
  }
}

これは単一のキーで機能します。ただし、修飾キーも使用しようとしているため、問題が発生しています。たとえば、SHIFT + Kを押すと、「k2」が生成されます。これにより、VirtualKeyCodesへの変換が不安定であるか、他の何かが不安定であると思われるようになります。

また、これらのコマンドを送信するときに、KeyDown / KeyUpイベントのみをキャッチする必要がありますか?または、KeyPressイベントも監視する必要がありますか?矢印キーと非文字キーでも作業できるはずなので、KeyPressを無視するだけでよいと思います。

編集:また、複数の修飾子を使用していることをどのように知ることができますか?それらをどのようにつなぎ合わせる必要がありますか?

考え?ありがとう!

4

1 に答える 1

1

以下で動作させることができました。これは、SINGLE修飾子と単一のCHARACTERで機能することに注意してください。特殊文字はまだこのコードでは機能しませんが、それは正しい方向への一歩であると考え、私の当面の質問に答えました。

    public void SendKey(int keyValue, Keys modifiers)
    {
        VirtualKeyCode key;
        if (modifiers.Equals(Keys.None))
        {
            if (Enum.TryParse(VkKeyScan(((char)keyValue)).ToString(), out key))
            {
                InputSimulator.SimulateKeyDown(key);
                InputSimulator.SimulateKeyUp(key);
            }   
        }
        else if (modifiers.Equals(Keys.Shift) && keyValue >= (int)Keys.A && keyValue <= (int)Keys.Z)
        {
            if (Enum.TryParse(VkKeyScan(((char) keyValue)).ToString(), out key))
            {
                InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.SHIFT, key);
            }
        }
        else if (modifiers.Equals(Keys.Control) && keyValue >= (int)Keys.A && keyValue <= (int)Keys.Z)
        {
            if (Enum.TryParse(VkKeyScan(((char)keyValue)).ToString(), out key))
            {
                InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, key);
            }
        }
        else if (modifiers.Equals(Keys.Alt) && keyValue >= (int)Keys.A && keyValue <= (int)Keys.Z)
        {
            if (Enum.TryParse(VkKeyScan(((char)keyValue)).ToString(), out key))
            {
                //Alt is named MENU for legacy purposes.
                InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.MENU, key);
            }
        }

    }
于 2012-07-26T19:22:21.160 に答える