保存按键以传递给“键”;参数SendKeys.Send()
本文关键字:参数 SendKeys Send 保存 | 更新日期: 2023-09-27 17:50:40
这是我的代码:
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"参数。
谁能建议我怎么做?
您正在尝试将WPF密钥enum与Winforms SendKeys.Send()方法混合,我可能不推荐。最后,使用WPF事件系统发送击键会更简洁,直接使用Key enum,根本不涉及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}
发送到SendKeys
来模拟,但我不确定这是否能满足你的需要,或者只是调出开始菜单。
还请注意,在WPF中,您实际上需要使用SendKeys.SendWait()
,参见此问题。
我使用SendInput
API发送击键,并使用KeyInterop.VirtualKeyFromKey
函数将密钥从System.Windows.Input.Key
转换为虚拟密钥代码。