私はC#でこれを行う方法を考え出しました。Win+Lキーを押す可能性のあるシーケンスには4つの状態が関係しています(なしWin、、Win+ L、L)。Win+状態に達するたびにL、フラグを設定します(以下の「winLSet」)。すべてのキーが離されるたびに、このフラグをチェックし、設定されている場合はプレスをシミュレートします。
Ctrlパズルの最後のピースは、 - L(KeyDownなし)の前にWinKeyのKeyUpをシミュレートすることです。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');
}
}
}
後世のために:このコードは、.NETFrameworkのものではないInputSimulatorとLowLevelKeyboardHookを使用していることに注意してください。LowLevelKeyboardHookは、グローバルなKeyDownイベントとKeyUpイベントをC#イベントとして公開する、私がしばらく前に書いたクラスです。ここ、ここに同様の例があり、ここにたくさんあります。
また、System.Windows.Forms.KeysではなくSystem.Windows.Input.Keyを使用していることに注意してください。これにより、一部の人が混乱する可能性があります。System.Windows.Input.Keyは、.NET 3.0以降の新しいキーの列挙であり、System.Windows.Forms.Keysは、Windowsフォームの古い列挙です。