保存键描边以传递给SendKeys.Send()中的“keys”参数

时间:2013-01-02 22:29:50

标签: c# .net wpf vb.net

这是我的代码:

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”参数。

有人可以建议我该怎么做?

2 个答案:

答案 0 :(得分:1)

您正在尝试将WPF Key枚举与Winforms SendKeys.Send()方法混合使用,我可能不建议这样做。最后使用WPF事件系统发送击键更简洁,更简单,直接使用Key枚举,根本不涉及Winforms,请参阅this question

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

  • SHIFT =“+”
  • CTRL =“^”
  • ALT =“%”

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

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

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

Windows键很有趣,它实际上是Ctrl和Esc的组合,因此您可以将SendKeys发送到^{ESC}来模拟,但我不确定是否会满足您的需求或只需启动开始菜单。

另请注意,在WPF中,您实际上需要使用SendKeys,请参阅this question

答案 1 :(得分:0)

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