aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.UI/UserInput/KeyboardListener.cs
diff options
context:
space:
mode:
authorLukePulverenti <luke.pulverenti@gmail.com>2013-02-23 10:58:08 -0500
committerLukePulverenti <luke.pulverenti@gmail.com>2013-02-23 10:58:08 -0500
commit17c1fd576057bdd2d6aea517d733fe8af6e6b2ba (patch)
tree660f47e816a8599aabdb7ee47f3cde64c72c3f4d /MediaBrowser.UI/UserInput/KeyboardListener.cs
parent33ed929b526acbda696f00f5966917ebd6a9ded2 (diff)
moved ui to it's own repo
Diffstat (limited to 'MediaBrowser.UI/UserInput/KeyboardListener.cs')
-rw-r--r--MediaBrowser.UI/UserInput/KeyboardListener.cs210
1 files changed, 0 insertions, 210 deletions
diff --git a/MediaBrowser.UI/UserInput/KeyboardListener.cs b/MediaBrowser.UI/UserInput/KeyboardListener.cs
deleted file mode 100644
index 76ce8e15a..000000000
--- a/MediaBrowser.UI/UserInput/KeyboardListener.cs
+++ /dev/null
@@ -1,210 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.Runtime.InteropServices;
-using System.Windows.Forms;
-
-namespace MediaBrowser.UI.UserInput
-{
- /// <summary>
- /// Provides a basic low-level keyboard listener
- /// Inspired by http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx
- /// Use the KeyDown event to listen for keys.
- /// Make sure to detach from the event when not needed.
- /// </summary>
- public static class KeyboardListener
- {
- #region KeyDown EventHandler
- /// <summary>
- /// The _ key down
- /// </summary>
- static volatile EventHandler<KeyEventArgs> _KeyDown;
- /// <summary>
- /// Fires whenever CurrentItem changes
- /// </summary>
- public static event EventHandler<KeyEventArgs> KeyDown
- {
- add
- {
- if (_KeyDown == null)
- {
- StartListening();
- }
-
- _KeyDown += value;
- }
- remove
- {
- _KeyDown -= value;
-
- if (_KeyDown == null && _hookID != IntPtr.Zero)
- {
- StopListening();
- }
- }
- }
-
- /// <summary>
- /// Raises the <see cref="E:KeyDown" /> event.
- /// </summary>
- /// <param name="e">The <see cref="KeyEventArgs" /> instance containing the event data.</param>
- private static void OnKeyDown(KeyEventArgs e)
- {
- e.SuppressKeyPress = false;
-
- if (_KeyDown != null)
- {
- // For now, don't async this
- // This will give listeners a chance to modify SuppressKeyPress if they want
- try
- {
- _KeyDown(null, e);
- }
- catch (Exception ex)
- {
- }
- }
- }
- #endregion
-
- /// <summary>
- /// The W h_ KEYBOAR d_ LL
- /// </summary>
- private const int WH_KEYBOARD_LL = 13;
- /// <summary>
- /// The W m_ KEYDOWN
- /// </summary>
- private const int WM_KEYDOWN = 0x0100;
- /// <summary>
- /// The W m_ SYSKEYDOWN
- /// </summary>
- private const int WM_SYSKEYDOWN = 0x0104;
-
- /// <summary>
- /// The _hook ID
- /// </summary>
- private static IntPtr _hookID = IntPtr.Zero;
- /// <summary>
- /// The _proc
- /// </summary>
- private static LowLevelKeyboardProc _proc = HookCallback;
-
- /// <summary>
- /// Starts the listening.
- /// </summary>
- private static void StartListening()
- {
- _hookID = SetHook(_proc);
- }
-
- /// <summary>
- /// Stops the listening.
- /// </summary>
- private static void StopListening()
- {
- UnhookWindowsHookEx(_hookID);
- _hookID = IntPtr.Zero;
- }
-
- /// <summary>
- /// Sets the hook.
- /// </summary>
- /// <param name="proc">The proc.</param>
- /// <returns>IntPtr.</returns>
- private static IntPtr SetHook(LowLevelKeyboardProc proc)
- {
- using (var curProcess = Process.GetCurrentProcess())
- using (var curModule = curProcess.MainModule)
- {
- return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
- GetModuleHandle(curModule.ModuleName), 0);
- }
- }
-
- /// <summary>
- /// Hooks the callback.
- /// </summary>
- /// <param name="nCode">The n code.</param>
- /// <param name="wParam">The w param.</param>
- /// <param name="lParam">The l param.</param>
- /// <returns>IntPtr.</returns>
- private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
- {
- var suppressKeyPress = false;
-
- if (nCode >= 0)
- {
- if (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN)
- {
- var vkCode = Marshal.ReadInt32(lParam);
-
- var keyData = (Keys)vkCode;
-
- var e = new KeyEventArgs(keyData);
-
- OnKeyDown(e);
-
- suppressKeyPress = e.SuppressKeyPress;
- }
- }
-
- if (suppressKeyPress)
- {
- return IntPtr.Zero;
- }
-
- return CallNextHookEx(_hookID, nCode, wParam, lParam);
- }
-
- /// <summary>
- /// Delegate LowLevelKeyboardProc
- /// </summary>
- /// <param name="nCode">The n code.</param>
- /// <param name="wParam">The w param.</param>
- /// <param name="lParam">The l param.</param>
- /// <returns>IntPtr.</returns>
- private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
-
- #region Imports
- /// <summary>
- /// Sets the windows hook ex.
- /// </summary>
- /// <param name="idHook">The id hook.</param>
- /// <param name="lpfn">The LPFN.</param>
- /// <param name="hMod">The h mod.</param>
- /// <param name="dwThreadId">The dw thread id.</param>
- /// <returns>IntPtr.</returns>
- [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- private static extern IntPtr SetWindowsHookEx(int idHook,
- LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
-
- /// <summary>
- /// Unhooks the windows hook ex.
- /// </summary>
- /// <param name="hhk">The HHK.</param>
- /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
- [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool UnhookWindowsHookEx(IntPtr hhk);
-
- /// <summary>
- /// Calls the next hook ex.
- /// </summary>
- /// <param name="hhk">The HHK.</param>
- /// <param name="nCode">The n code.</param>
- /// <param name="wParam">The w param.</param>
- /// <param name="lParam">The l param.</param>
- /// <returns>IntPtr.</returns>
- [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
- IntPtr wParam, IntPtr lParam);
-
- /// <summary>
- /// Gets the module handle.
- /// </summary>
- /// <param name="lpModuleName">Name of the lp module.</param>
- /// <returns>IntPtr.</returns>
- [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- private static extern IntPtr GetModuleHandle(string lpModuleName);
- #endregion
- }
-}