Я нашел способ сделать это в C #.Возможны четыре состояния Win + L последовательность нажатий клавиш (Нет, Win , Win + L , L ).Всякий раз, когда достигается состояние Win + L , установите флаг («winLSet» ниже).Всякий раз, когда все клавиши были отпущены, мы проверяем этот флаг и моделируем нажатие, если оно установлено.
Последняя часть головоломки состоит в том, чтобы имитировать KeyKp WinKey до Ctrl - L (без KeyDown).Я пробовал подобные подходы в AutoHotkey, и он никогда не работал, но, похоже, он отлично работает здесь.
Код ниже.Пожалуйста, смотрите пояснительные примечания внизу, если вы планируете использовать этот код.
public partial class MainWindow : Window
{
LowLevelKeyboardHook hook;
bool winKeyDown;
bool lKeyDown;
bool winLSet;
public MainWindow()
{
InitializeComponent();
hook = new LowLevelKeyboardHook();
hook.KeyDown += OnKeyDown;
hook.KeyUp += OnKeyUp;
}
void OnKeyDown(object sender, LowLevelKeyEventArgs e)
{
e.EventHandled = true;
switch (e.Key)
{
case Key.L:
lKeyDown = true;
UpdateWinLState();
e.EventHandled = winKeyDown;
break;
case Key.LWin:
winKeyDown = true;
UpdateWinLState();
InputSimulator.SimulateKeyDown(VirtualKeyCode.LCONTROL);
break;
case Key.LeftCtrl:
InputSimulator.SimulateKeyDown(VirtualKeyCode.LWIN);
break;
default:
e.EventHandled = false;
break;
}
}
void OnKeyUp(object sender, LowLevelKeyEventArgs e)
{
e.EventHandled = true;
switch (e.Key)
{
case Key.L:
lKeyDown = false;
UpdateWinLState();
e.EventHandled = winKeyDown;
break;
case Key.LWin:
winKeyDown = false;
UpdateWinLState();
InputSimulator.SimulateKeyUp(VirtualKeyCode.LCONTROL);
break;
case Key.LeftCtrl:
InputSimulator.SimulateKeyUp(VirtualKeyCode.LWIN);
break;
default:
e.EventHandled = false;
break;
}
}
void UpdateWinLState()
{
if (winKeyDown && lKeyDown)
{
winLSet = true;
}
else if (!winKeyDown && !lKeyDown && winLSet)
{
winLSet = false;
InputSimulator.SimulateKeyUp(VirtualKeyCode.LWIN);
InputSimulator.SimulateModifiedKeyStroke(
VirtualKeyCode.LCONTROL,
(VirtualKeyCode)'L');
}
}
}
Для потомков: обратите внимание, что этот код использует InputSimulator и LowLevelKeyboardHook, которые не из .NETФреймворк.LowLevelKeyboardHook - класс, который я написал некоторое время назад, который представляет глобальные события KeyDown и KeyUp как события C #.Есть похожие примеры здесь , здесь , и кучу можно найти здесь .
Также обратите внимание, что я использую System.Windows.Input.Key, а не System.Windows.Forms.Keys, что может запутать некоторых людей.System.Windows.Input.Key - это новое перечисление ключей в .NET 3.0 и выше, а System.Windows.Forms.Keys - это старое перечисление из Windows Forms.