Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }