예제 #1
0
        public static IntPtr HotKeyHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            const int WM_HOTKEY = 0x0312;

            switch (msg)
            {
            case WM_HOTKEY:
                //switch (wParam.ToInt32())
                //{
                //case 0:
                //case 1:
                var k = new Hotkey(
                    (lParam.ToInt32() >> 16),
                    (lParam.ToInt32() & MOD_ALT) > 0,
                    (lParam.ToInt32() & MOD_SHIFT) > 0,
                    (lParam.ToInt32() & MOD_CONTROL) > 0
                    );
                var a = (lParam.ToInt32() & MOD_ALT) > 0;
                var b = (lParam.ToInt32() & MOD_SHIFT) > 0;
                var c = (lParam.ToInt32() & MOD_CONTROL) > 0;
                if (Hotkeys.ContainsKey(k))
                {
                    Hotkeys[k].Callback.Invoke();
                }
                handled = true;             // TODO: Find a way to not always capture the hotkey
                break;
                //}break;
            }
            return(IntPtr.Zero);
        }
예제 #2
0
 private void ProcessHotkey(int hotkeyId)
 {
     if (Hotkeys.ContainsKey(hotkeyId))
     {
         Hotkeys[hotkeyId].Action();
     }
 }
예제 #3
0
        /// <summary>
        /// Used to register a hotkey
        /// </summary>
        /// <param name="hotkey">A <c>Hotkey</c> object. See <see cref="Hotkey"/></param>
        /// <returns></returns>
        public bool AddHotkey(Hotkey hotkey)
        {
            if (Hotkeys.ContainsKey(hotkey.HotkeyId))
            {
                return(false);
            }
            var registered = WinApi.RegisterHotKey(WindowHandle, hotkey.HotkeyId, hotkey.Modifiers, hotkey.VirtualKey);

            if (registered)
            {
                Hotkeys.Add(hotkey.HotkeyId, hotkey);
            }
            return(registered);
        }
예제 #4
0
        /// <summary>
        /// Starts rendering cycle and waits for shutdown
        /// </summary>
        public static void Start()
        {
            var pf       = Environment.OSVersion.Platform;
            var isUnix   = pf == PlatformID.Unix || pf == PlatformID.MacOSX || (int)pf == 128; // unix/macosx/mono linux
            var provider =
                isUnix
                    ? (INativeConsoleProvider) new UnixNativeConsoleProvider()
                    : new WindowsNativeConsoleProvider();

            if (Provider != null)
            {
                throw new ArgumentException("Already started");
            }
            Provider = provider;
            provider.Clear(_background);
            provider.KeyPressed += (o, e) =>
            {
                if (CanChangeFocus && e.Info.Key == ConsoleKey.Tab && e.Info.Modifiers == 0)
                {
                    _prevent = true;
                    FocusNext();
                    _prevent = false;
                    Refresh();
                    return;
                }
                if (CanChangeFocus && e.Info.Key == ConsoleKey.Tab && e.Info.Modifiers == ConsoleModifiers.Shift) // Can not intercept CTRL in Linux
                {
                    _prevent = true;
                    FocusNextWindow();
                    _prevent = false;
                    Refresh();
                    return;
                }
                _prevent = true;
                if (
                    Hotkeys.ContainsKey(new ConsoleKeyInfo('\0', e.Info.Key,
                                                           e.Info.Modifiers.HasFlag(ConsoleModifiers.Shift),
                                                           e.Info.Modifiers.HasFlag(ConsoleModifiers.Alt), false)))
                {
                    Hotkeys[e.Info]();
                }
                else
                {
                    Focused?.OnKeyPressedInternal(e.Info);
                }
                _prevent = false;
                Refresh();
            };
            provider.SizeChanged += (o, e) =>
            {
                _prevent = true;
                foreach (var window in Windows)
                {
                    window.OnSizeChangedInternal();
                }
                _prevent = false;
                Refresh();
            };
            _prevent = true;
            FocusNextWindow();
            _prevent = false;
            Refresh();
        }