1

这是我的代码:

void tbHotkey_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.LeftShift || e.Key == Key.RightShift || e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl || e.Key == Key.LeftAlt || e.Key == Key.RightAlt || e.Key == Key.LWin || e.Key == Key.RWin)
    {
        return;
    }
    bool IsWinDown = e.KeyboardDevice.IsKeyDown(Key.LWin) | e.KeyboardDevice.IsKeyDown(Key.RWin);
    bool IsCtrlDown = e.KeyboardDevice.IsKeyDown(Key.LeftCtrl) | e.KeyboardDevice.IsKeyDown(Key.RightCtrl);
    bool IsAltDown = e.KeyboardDevice.IsKeyDown(Key.LeftAlt) | e.KeyboardDevice.IsKeyDown(Key.RightAlt);
    bool IsShiftDown = e.KeyboardDevice.IsKeyDown(Key.LeftShift) | e.KeyboardDevice.IsKeyDown(Key.RightShift);
    if (IsWinDown | IsCtrlDown | IsAltDown | IsShiftDown)
    {
        (sender as TextBox).Text =
          (IsWinDown ? "Windows + " : "") +
          (IsCtrlDown ? "Control + " : "") +
          (IsAltDown ? "Alt + " : "") +
          (IsShiftDown ? "Shift + " : "") +
          e.Key.ToString();
    }
}

它保存了用户键入的热键,KeyEventArgs.Key.ToString()但我需要保存它以便我可以SendKeys.Send()轻松地将它传递给方法中的“keys”参数。

谁能建议我该怎么做?

4

2 回答 2

1

您正在尝试将 WPF Key枚举与 Winforms SendKeys.Send()方法混合,我可能不推荐这种方法。最终使用 WPF 事件系统发送击键会更干净,更简单,直接使用 Key 枚举,根本不涉及 Winforms,请参阅这个问题

但是,如果您真的想这样做,则需要根据文档格式化字符串SendKeys.Send(),其中修饰键具有以下代码:

  • SHIFT = "+"
  • CTRL = "^"
  • ALT = "%"

所以你的代码可能是这样的:

            (sender as TextBox).Text = "(" +
              (IsCtrlDown ? "^" : "") +
              (IsAltDown ? "%" : "") +
              (IsShiftDown ? "+" : "") + ")" +
              e.Key.ToString().ToLower();

例如,如果您按 Ctrl+Alt+R,这将为您提供(^%)r一个有效输入的字符串SendKeys.Send()。请注意,这目前仅适用于字母键,如果要处理其他特殊键(如大写锁定),则必须修改代码以查看值并从文档中e.Key输出适当的字符串。SendKeys

windows 键很有趣,它实际上是 Ctrl 和 Esc 的组合,因此您可以发送^{ESC}toSendKeys来模拟它,但我不确定这是否适合您的需要或只是调出开始菜单。

另请注意,在 WPF 中您实际上需要使用SendKeys.SendWait(),请参阅此问题

于 2013-01-02T22:59:11.237 回答
0

我使用SendInputAPI 发送击键并使用KeyInterop.VirtualKeyFromKey函数将键从转换System.Windows.Input.Key为虚拟键代码。

于 2013-01-13T13:50:21.363 回答