/// <summary> /// Waits for key event. /// </summary> /// <param name="key">The key.</param> /// <param name="state">The state.</param> /// <param name="timeout">The timeout.</param> /// <returns></returns> public bool WaitForKeyEvent(VirtualKeyCode key, KeyState state = KeyState.Down, int timeout = -1) { if (key == VirtualKeyCode.INVALID) { return(false); } if (state == KeyState.None) { return(false); } object threadLock = new object(); KeyStateChangedCallback callback = (KeyState keystate, VirtualKeyCode keycode) => { if (keystate != state) { return; } if (keycode != key) { return; } if (Monitor.TryEnter(threadLock)) { // someone else has the lock Monitor.PulseAll(threadLock); Monitor.Exit(threadLock); } }; if (!RegisterEvent(key, callback)) { return(false); } bool result = false; Monitor.Enter(threadLock); if (timeout < 0) { Monitor.Wait(threadLock); result = true; } else { result = Monitor.Wait(threadLock, timeout); } Monitor.Exit(threadLock); RemoveEvent(key, callback); return(result); }
/// <summary> /// Removes the event. /// </summary> /// <param name="key">The key.</param> /// <param name="callback">The callback.</param> /// <returns></returns> public bool RemoveEvent(VirtualKeyCode key, KeyStateChangedCallback callback) { if (key == VirtualKeyCode.INVALID) { return(false); } if (callback == null) { return(false); } if (!singleKeyCallback.ContainsKey(key)) { return(false); } singleKeyCallback[key].Remove(callback); return(false); }
/// <summary> /// Registers the event. /// </summary> /// <param name="key">The key.</param> /// <param name="callback">The callback.</param> /// <returns></returns> public bool RegisterEvent(VirtualKeyCode key, KeyStateChangedCallback callback) { if (key == VirtualKeyCode.INVALID) { return(false); } if (callback == null) { return(false); } lock (lockObject) { if (!singleKeyCallback.ContainsKey(key)) { singleKeyCallback.Add(key, new List <KeyStateChangedCallback>()); } } singleKeyCallback[key].Add(callback); return(true); }