C# - 如何使用SendKeys.Send使用SHIFT键发送小写字母?

时间:2011-03-26 15:15:57

标签: c# .net sendkeys keyboard-hook

我正在为我的项目使用this键盘钩子。我无法使用SendKeys.Send()按下SHIFT修改键来发送小写字母。我的应用程序需要(例如)如果用户按 K 按钮“a”应该发送,如果他按 SHIFT + K “b”应该发送。代码是:

void gkh_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.K)
    {
        if (Control.ModifierKeys == Keys.Shift)
            SendKeys.Send("b");
        else
            SendKeys.Send("a");
    }
    e.Handled == true;   
}

但它发送“B”(大写字母)而不是“b”,即 SHIFT 键更改发送的按键“ b“改为大写。即使在将 Keys.Shift 添加到挂钩后也会发生这种情况。

我尝试了很多方法,包括使用 e.SupressKeyPress SendKeys(“b”.toLower()),并将上面的代码放在KeyUp事件中但是仍然存在。

请帮助我,我非常沮丧,我的应用程序开发在这一点上受到了打击。

1 个答案:

答案 0 :(得分:4)

Shift 键仍然关闭时,您正在发送键,这导致它们被大写。
您需要找到一种方法来取消按下 Shift 键和 K 按键。

你正在使用的全局钩子样本有点裸露;它应报告按下哪些修改键。不幸的是,看起来该功能尚未实现。

为什么首先需要使用键盘钩?您真的需要处理表单没有焦点时发生的关键事件吗?如果是这样,为什么世界上你会使用SendKey?您如何知道当前活动的应用程序将对您发送的按键进行处理?

这看起来像是在覆盖表单的ProcessCmdKey method时更好的处理。例如:

  protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
  {
     if (keyData == (Keys.K | Keys.Shift))
     {
        SendKeys.Send("b");
        return true;  // indicate that you handled the key
     }
     else if (keyData == Keys.K)
     {
        SendKeys.Send("a");
        return true;  // indicate that you handled the key
     }

     // call the base class to handle the key
     return base.ProcessCmdKey(ref msg, keyData);
  }

编辑:您的评论表明,您实际上需要处理在表单时发生的关键事件具有焦点。假设您需要处理的不仅仅是 K 键,您需要使用全局钩子来执行此操作。

正如我之前提到的,问题是当你使用SendInput发送 B 键时,用户仍然按住 Shift 键,这导致它注册为大写字母B而不是小写字母。因此,解决方案显而易见:您需要找到一种取消 Shift 键的方法,以便操作系统不会处理它。当然,如果您吃了关键事件,您还需要找出一种跟踪的方式,以便您的应用程序仍然可以知道它何时被按下并且可以采取相应的行动。

快速搜索显示a similar question已经被询问并回答了 Windows logo 键。

特别是,您需要编写处理由此全局钩子引发的KeyDown事件的代码(至少,此代码适用于我编写的全局钩子类;它应该与您的一起工作,也是,但我实际上没有测试过它):

// Private flag to hold the state of the Shift key even though we eat it
private bool _shiftPressed = false;

private void gkh_KeyDown(object sender, KeyEventArgs e)
{
   // See if the user has pressed the Shift key
   // (the global hook detects individual keys, so we need to check both)
   if ((e.KeyCode == Keys.LShiftKey) || (e.KeyCode == Keys.RShiftKey))
   {
      // Set the flag
      _shiftPressed = true;

      // Eat this key event
      // (to prevent it from being processed by the OS)
      e.Handled = true;
   }


   // See if the user has pressed the K key
   if (e.KeyCode == Keys.K)
   {
      // See if they pressed the Shift key by checking our flag
      if (_shiftPressed)
      {
         // Clear the flag
         _shiftPressed = false;

         // Send a lowercase letter B
         SendKeys.Send("b");
      }
      else
      {
         // Shift was not pressed, so send a lowercase letter A
         SendKeys.Send("a");
      }

      // Eat this key event
      e.Handled = true;
   }
}