キーがフォーカスされていなくても、どこかでキーが押された場合にプログラムをアクティブにしようとしています。(この例では F1 を使用して、ラベルのテキストを「Hello World」に設定するタスクを作成します)。
私は主要なリスナー、フックなどを調べましたが、何が起こっているのかを理解しようとして頭が痛くなりました。これを機能させる簡単な方法はありますか。
WIN APIのRegisterHotKey関数を使用できます。
[DllImport("user32")]
public static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
Form_Load イベントにホットキーを登録します。
private void Form_Load(object sender, EventArgs e)
{
RegisterHotKey(Handle, 42, 0, (int)Keys.F1);
}
キーの組み合わせをフックしたい場合は、ゼロの代わりに次の値のいずれかを渡す必要があることに注意してください (Alt、Ctrl、Shift、または Windows キーの場合)。
private const int MOD_ALT = 0x1;
private const int MOD_CONTROL = 0x2;
private const int MOD_SHIFT = 0x4;
private const int MOD_WIN = 0x8;
この時点でどこかで F1 キーを押すと、システムはウィンドウにWM_HOTKEY メッセージを送信します。WndProc 内で処理します。
private const int WM_HOTKEY = 0x312;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_HOTKEY)
{
if (!Visible)
Visible = true;
Activate();
Keys vk = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
int fsModifiers = ((int)m.LParam & 0xFFFF);
if (vk == Keys.F1 && sModifiers == 0)
label.Text = "Hello World";
}
}
ところで、フォームを閉じるときにホットキーを登録解除することを忘れないでください。
こちらの記事をご覧ください。必要なのはグローバルホットキーです。私が提供したリンクは、それを非常に使いやすい形式にカプセル化しています。
Win32 RegisterHotKey 関数を調べましたか? 別のアプリケーションがフォアグラウンドを持っているときにキーボード入力を取得したい場合は、これが最善の策かもしれません。マネージ ラッパーを pinvoke するか、見つける必要があります。