I did this in the top of my Form1:
globalKeyboardHook gkh;
In the Load event:
private void Form1_Load(object sender, EventArgs e)
{
gkh = new globalKeyboardHook();
gkh.HookedKeys.Add(Keys.M);
gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);
gkh.KeyUp += new KeyEventHandler(gkh_KeyUp);
}
Then in the bottom:
void gkh_KeyDown(object sender, KeyEventArgs e)
{
// e.KeyCode.ToString() is the KeyCode of the pressed key
e.Handled = true;
if ((e.KeyCode == System.Windows.Forms.Keys.LControlKey) || (e.KeyCode == System.Windows.Forms.Keys.RControlKey))
{
controlDown = true;
}
if (e.KeyCode == System.Windows.Forms.Keys.M && controlDown)
{
// Do CTRL-M action
if (mf == null)
{
//mf = new MagnifierMainForm();
mf = new MagnifierMainForm(false);
mf.StartPosition = FormStartPosition.Manual;
mf.Location = Control.MousePosition;
//mf.Show();
this.Select();
}
else if (mf.IsDisposed)
{
mf = new MagnifierMainForm(false);
mf.StartPosition = FormStartPosition.Manual;
mf.Location = Control.MousePosition;
//mf.Show();
}
else
{
mf.Close();
mf = null;
}
}
}
void gkh_KeyUp(object sender, KeyEventArgs e)
{
controlDown = false;
}
たとえば、アプリケーションを実行してプロンプトコマンドウィンドウをクリックすると、CTRL + Mをクリックするか、数秒後に何もクリックせずに例外が発生します。
CallbackOnCollectedDelegate タイプ 'ScreenVideoRecorder!Utilities.globalKeyboardHook+keyboardHookProc::Invoke' のガベージ コレクション デリゲートでコールバックが行われました。これにより、アプリケーションのクラッシュ、破損、データ損失が発生する可能性があります。デリゲートをアンマネージ コードに渡すときは、デリゲートが決して渡されないことが保証されるまで、マネージ アプリケーションによって有効にしておく必要があります。
CallbackOnCollectedDelegate が検出されました メッセージ: タイプ 'ScreenVideoRecorder!Utilities.globalKeyboardHook+keyboardHookProc::Invoke' のガベージ コレクション デリゲートでコールバックが行われました。これにより、アプリケーションのクラッシュ、破損、データ損失が発生する可能性があります。デリゲートをアンマネージ コードに渡す場合、デリゲートが呼び出されないことが保証されるまで、マネージ アプリケーションによって保持される必要があります。