【问题标题】:KeyEventArgs to VirtualKeyCodeKeyEventArgs 到 VirtualKeyCode
【发布时间】:2012-07-25 09:39:42
【问题描述】:

我正在尝试使用WindowsInputSimulator library 来帮助我模拟按键。

该软件将由一个客户端和一个服务器组成。当在客户端输入一个键时,它的 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。

编辑:另外,当我使用多个修饰符时,我怎么知道?我应该如何将它们串在一起?

想法?谢谢!

【问题讨论】:

    标签: c# .net keyboard sendinput


    【解决方案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);
                }
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 2019-07-06
      • 2020-12-07
      • 2014-02-21
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多