using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Browser; using System.Collections.Generic; using System.Linq; namespace YouAppNamespace { public partial class App : Application { public static HotKeyHandler GlobalHotKeyHandler { get; private set; } internal static Dictionary< Key,int> KeyCodeLookUp = new Dictionary(); static App() { //start thread here to process this from backend GlobalHotKeyHandler = new HotKeyHandler(); // KeyCodeLookUp.Add(Key.D1,49); //Digits for (int i = (int)Key.D0; i <= (int)Key.D9;i++ ) KeyCodeLookUp.Add((Key)i, i+28); //Chars for (int i = (int)Key.A; i <= (int)Key.Z; i++) KeyCodeLookUp.Add((Key)i, i + 35); //functional Key for (int i = (int)Key.F1; i <= (int)Key.F12; i++) KeyCodeLookUp.Add((Key)i, i + 65); KeyCodeLookUp.Add(Key.Escape, 1); //return; } } public class EventArgsKeyUp : EventArgs { object[] data ; public object[] Data {get{return data;}} public EventArgsKeyUp(object[] data) { this.data = data; } } public delegate void KeyUpHandler(object sender, EventArgsKeyUp e); public sealed class HotKeyHandler { private List shortcuts = new List(); public HotKeyHandler() { } private bool isRegistered = false; public void Register() { //return; if (this.isRegistered == false) { try { App.Current.RootVisual.KeyUp += new System.Windows.Input.KeyEventHandler(RootVisual_KeyUp); HtmlDocument document = HtmlPage.Document; EventHandler KeyDownHandler; KeyDownHandler = new EventHandler(OnBodyKeyUp); bool b = document.AttachEvent("onkeyup", KeyDownHandler); } catch (Exception ex) { } finally { this.isRegistered = true; } } } public void Unregister() { if (this.isRegistered) { try { App.Current.RootVisual.KeyUp -= RootVisual_KeyUp; HtmlDocument document = HtmlPage.Document; EventHandler KeyDownHandler; KeyDownHandler = new EventHandler(OnBodyKeyUp); document.DetachEvent("onkeyup", KeyDownHandler); } catch (Exception ex) { } finally { this.isRegistered = false; } } } private void RaiseOnKeyUp(ModifierKeys modKey,int keyCode,System.Windows.Input.KeyEventArgs ke,HtmlEventArgs he) { var handlers = (from h in this.shortcuts where h.ModKeys == modKey && (ke!= null? h.Key == ke.Key : h.KeyCode==he.KeyCode) select h); foreach (Shortcut s in handlers) { s.Handler(this,new EventArgsKeyUp(s.Data)); if(ke!=null)ke.Handled = true; if (he != null) he.StopPropagation(); } } internal Shortcut RegisterShortcut(ModifierKeys ModKeys, Key key, KeyUpHandler handler, params object[] data) { Shortcut shortcut = RegisterShortcut(ModKeys, key, handler); shortcut.Data = data; return shortcut; } internal Shortcut RegisterShortcut(ModifierKeys ModKeys, Key key, KeyUpHandler handler) { var shortAlready = from s in shortcuts where s.ModKeys == ModKeys && s.Key == key && s.Handler.Method.Equals(handler.Method) select s; if (shortAlready.Count() == 0) { Shortcut shortcut = new Shortcut { ModKeys = ModKeys, Key = key, Handler = handler }; shortcuts.Add(shortcut); return shortcut; } else { return shortAlready.FirstOrDefault(); } } private void OnBodyKeyUp(object sender, HtmlEventArgs e) { RaiseOnKeyUp(GetModKey(e), e.KeyCode,null,e); } private ModifierKeys GetModKey(HtmlEventArgs e) { ModifierKeys modKey = ModifierKeys.None; if (e.CtrlKey) modKey = modKey | ModifierKeys.Control; if (e.AltKey) modKey = modKey | ModifierKeys.Alt; if (e.ShiftKey) modKey = modKey | ModifierKeys.Shift; return modKey; } void RootVisual_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) { RaiseOnKeyUp(Keyboard.Modifiers,e.PlatformKeyCode,e,null); } internal class Shortcut { public KeyUpHandler Handler { get; set; } public ModifierKeys ModKeys { get; set; } Key key; public object[] Data; public Key Key { get { return key; } set {key=value; KeyCode = App.KeyCodeLookUp[value]; } } public int KeyCode { get; set; } } } }