グローバルホットキーを登録して、 グローバルホットキーが押されたときにイベントを発生させるクラス。
using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
/// <summary>
/// グローバルホットキーを登録するクラス。
/// 使用後は必ずDisposeすること。
/// </summary>
public class HotKey :IDisposable {
HotKeyForm form;
/// <summary>
/// ホットキーが押されると発生する。
/// </summary>
public event EventHandler HotKeyPush;
/// <summary>
/// ホットキーを指定して初期化する。
/// 使用後は必ずDisposeすること。
/// </summary>
/// <param name="modKey">修飾キー</param>
/// <param name="key">キー</param>
public HotKey(MOD_KEY modKey, Keys key) {
form = new HotKeyForm(modKey, key, raiseHotKeyPush);
}
private void raiseHotKeyPush() {
if(HotKeyPush != null) {
HotKeyPush(this, EventArgs.Empty);
}
}
public void Dispose() {
form.Dispose();
}
private class HotKeyForm :Form {
[DllImport("user32.dll")]
extern static int RegisterHotKey(IntPtr HWnd, int ID, MOD_KEY MOD_KEY, Keys KEY);
[DllImport("user32.dll")]
extern static int UnregisterHotKey(IntPtr HWnd, int ID);
const int WM_HOTKEY = 0x0312;
int id;
ThreadStart proc;
public HotKeyForm(MOD_KEY modKey, Keys key, ThreadStart proc) {
this.proc = proc;
for(int i = 0x0000; i <= 0xbfff; i++) {
if(RegisterHotKey(this.Handle, i, modKey, key) != 0) {
id = i;
break;
}
}
}
protected override void WndProc(ref Message m) {
base.WndProc(ref m);
if(m.Msg == WM_HOTKEY) {
if((int)m.WParam == id) {
proc();
}
}
}
protected override void Dispose(bool disposing) {
UnregisterHotKey(this.Handle, id);
base.Dispose(disposing);
}
}
}
/// <summary>
/// HotKeyクラスの初期化時に指定する修飾キー
/// </summary>
public enum MOD_KEY :int {
ALT = 0x0001,
CONTROL = 0x0002,
SHIFT = 0x0004,
}
以下の様に使用する。
using System;
using System.Windows.Forms;
public partial class Form1 :Form {
HotKey hotKey;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
hotKey = new HotKey(MOD_KEY.ALT | MOD_KEY.CONTROL | MOD_KEY.SHIFT, Keys.F);
hotKey.HotKeyPush += new EventHandler(hotKey_HotKeyPush);
}
void hotKey_HotKeyPush(object sender, EventArgs e) {
MessageBox.Show("ホットキーが押されました。");
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
hotKey.Dispose();
}
}
One thought on “C#|グローバルホットキーを登録する”