関数で KeyPressedEventArgs が使用されているのを見ると、非常に奇妙に見えます。ホット キーは、RegisterHotKey() API 関数を P/Invoking することで実装できます。ホットキーが押されると、ウィンドウにメッセージが送信されます。これは、起動時には見えず、ホット キーを押すと起動するフォームの例です。この場合、Ctrl+Alt+U:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
private const int MYKEYID = 0; // In case you want to register more than one...
public Form1() {
InitializeComponent();
this.FormClosing += (s, args) => UnregisterHotKey(this.Handle, MYKEYID);
}
protected override void SetVisibleCore(bool value) {
if (value && !this.IsHandleCreated) {
this.CreateHandle();
RegisterHotKey(this.Handle, MYKEYID, MOD_CONTROL + MOD_SHIFT, Keys.U);
value = false;
}
base.SetVisibleCore(value);
}
protected override void WndProc(ref Message m) {
if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == MYKEYID) {
this.Visible = true;
if (this.WindowState == FormWindowState.Minimized)
this.WindowState = FormWindowState.Normal;
SetForegroundWindow(this.Handle);
}
base.WndProc(ref m);
}
// P/Invoke declarations
private const int WM_HOTKEY = 0x312;
private const int MOD_ALT = 1;
private const int MOD_CONTROL = 2;
private const int MOD_SHIFT = 4;
[DllImport("user32.dll")]
private static extern int RegisterHotKey(IntPtr hWnd, int id, int modifier, Keys vk);
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
}
}
SetForegroundWindow() 関数は問題であり、おそらく質問で説明した問題の原因でもあることに注意してください。Windows では、ユーザーが別のウィンドウをアクティブに使用しているときに、アプリがユーザーの顔にウィンドウを押し込むことを許可していません。ウィンドウがフォーカスを奪う前に、少なくとも数秒間の非アクティブ状態が期限切れになる必要があります。与えられたコードを使用すると、簡単に確認できますが、フォームのタスクバー ボタンが点滅します。ShowInTaskbar プロパティを false に設定しないでください。このコードではその必要はありません。ホット キーが押されるまで、タスク バー ボタンは表示されません。