First you need to connect the keys.
With this class you can register a global shortcut, I will skip the explanation, but you can read it here .
public class KeyboardHook { [DllImport("user32.dll")] private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); [DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); public enum Modifiers { None = 0x0000, Alt = 0x0001, Control = 0x0002, Shift = 0x0004, Win = 0x0008 } int modifier; int key; IntPtr hWnd; int id; public KeyboardHook(int modifiers, Keys key, Form f) { this.modifier = modifiers; this.key = (int)key; this.hWnd = f.Handle; id = this.GetHashCode(); } public override int GetHashCode() { return modifier ^ key ^ hWnd.ToInt32(); } public bool Register() { return RegisterHotKey(hWnd, id, modifier, key); } public bool Unregister() { return UnregisterHotKey(hWnd, id); } }
Then in your form you need to register a shortcut
public partial class Form1 : Form { public Form1() { InitializeComponent(); KeyboardHook hook = new KeyboardHook((int)KeyboardHook.Modifiers.None, Keys.A, this); hook.Register();
And here is the class for managing Keyboard click and release events.
public class KeyboardManager { public const int INPUT_KEYBOARD = 1; public const int KEYEVENTF_KEYUP = 0x0002; public struct KEYDBINPUT { public Int16 wVk; public Int16 wScan; public Int32 dwFlags; public Int32 time; public Int32 dwExtraInfo; public Int32 __filler1; public Int32 __filler2; } public struct INPUT { public Int32 type; public KEYDBINPUT ki; } [DllImport("user32")] public static extern int SendInput(int cInputs, ref INPUT pInputs, int cbSize); public static void HoldKey(Keys vk) { INPUT input = new INPUT(); input.type = INPUT_KEYBOARD; input.ki.dwFlags = 0; input.ki.wVk = (Int16)vk; SendInput(1, ref input, Marshal.SizeOf(input)); } public static void ReleaseKey(Keys vk) { INPUT input = new INPUT(); input.type = INPUT_KEYBOARD; input.ki.dwFlags = KEYEVENTF_KEYUP; input.ki.wVk = (Int16)vk; SendInput(1, ref input, Marshal.SizeOf(input)); } public static void PressKey(Keys vk) { HoldKey(vk); ReleaseKey(vk); } }
I tested it on this text box, which I write, when I pressed A , it sent Q
I'm not sure what the behavior on Warcraft III will be like, maybe they blocked it to prevent some kind of bot or something like that.