.net - Set global hotkeys using C# -
i need capture key press when program not in focus. (ie. ctrl+alt+j) , trigger event in program.
thus far have found dll appears correct path"
[dllimport("user32.dll")]private static extern int registerhotkey(intptr hwnd, int id,int fsmodifiers, int vk); [dllimport("user32.dll")] private static extern int unregisterhotkey(intptr hwnd, int id);
please note code will not trigger events in console application projects. have use winforms project events fire.
this correct code:
public sealed class keyboardhook : idisposable { // registers hot key windows. [dllimport("user32.dll")] private static extern bool registerhotkey(intptr hwnd, int id, uint fsmodifiers, uint vk); // unregisters hot key windows. [dllimport("user32.dll")] private static extern bool unregisterhotkey(intptr hwnd, int id); /// <summary> /// represents window used internally messages. /// </summary> private class window : nativewindow, idisposable { private static int wm_hotkey = 0x0312; public window() { // create handle window. this.createhandle(new createparams()); } /// <summary> /// overridden notifications. /// </summary> /// <param name="m"></param> protected override void wndproc(ref message m) { base.wndproc(ref m); // check if got hot key pressed. if (m.msg == wm_hotkey) { // keys. keys key = (keys)(((int)m.lparam >> 16) & 0xffff); modifierkeys modifier = (modifierkeys)((int)m.lparam & 0xffff); // invoke event notify parent. if (keypressed != null) keypressed(this, new keypressedeventargs(modifier, key)); } } public event eventhandler<keypressedeventargs> keypressed; #region idisposable members public void dispose() { this.destroyhandle(); } #endregion } private window _window = new window(); private int _currentid; public keyboardhook() { // register event of inner native window. _window.keypressed += delegate(object sender, keypressedeventargs args) { if (keypressed != null) keypressed(this, args); }; } /// <summary> /// registers hot key in system. /// </summary> /// <param name="modifier">the modifiers associated hot key.</param> /// <param name="key">the key associated hot key.</param> public void registerhotkey(modifierkeys modifier, keys key) { // increment counter. _currentid = _currentid + 1; // register hot key. if (!registerhotkey(_window.handle, _currentid, (uint)modifier, (uint)key)) throw new invalidoperationexception("couldn’t register hot key."); } /// <summary> /// hot key has been pressed. /// </summary> public event eventhandler<keypressedeventargs> keypressed; #region idisposable members public void dispose() { // unregister registered hot keys. (int = _currentid; > 0; i--) { unregisterhotkey(_window.handle, i); } // dispose inner native window. _window.dispose(); } #endregion } /// <summary> /// event args event fired after hot key has been pressed. /// </summary> public class keypressedeventargs : eventargs { private modifierkeys _modifier; private keys _key; internal keypressedeventargs(modifierkeys modifier, keys key) { _modifier = modifier; _key = key; } public modifierkeys modifier { { return _modifier; } } public keys key { { return _key; } } } /// <summary> /// enumeration of possible modifiers. /// </summary> [flags] public enum modifierkeys : uint { alt = 1, control = 2, shift = 4, win = 8 }
to use (i had edit modifier keys cast them (modifier)1 (modifier)2 etc
public partial class form1 : form { keyboardhook hook = new keyboardhook(); public form1() { initializecomponent(); // register event fired after key press. hook.keypressed += new eventhandler<keypressedeventargs>(hook_keypressed); // register control + alt + f12 combination hot key. hook.registerhotkey(modifierkeys.control | modifierkeys.alt, keys.f12); } void hook_keypressed(object sender, keypressedeventargs e) { // show keys pressed in label. label1.text = e.modifier.tostring() + " + " + e.key.tostring(); } }
Comments
Post a Comment