Как я могу зарегистрировать глобальную горячую клавишу для высказывания CTRL+SHIFT + (БУКВА) с помощью WPF и.NET 3.5?

Вы можете просто использовать SqlDataSource. Вы перемещаете SqlDataSource из панели инструментов, где говорится Data, SqlDataSource. Затем вы сконфигурировали источник данных с помощью смарт-тега. Затем, используя смарт-тег в gridview, выберите SqlDataSource, который вы разместили на странице aspx. Это очень быстро и требует мало кодирования. http://msdn.microsoft.com/En-us/Library/z72eefad.aspx это покажет вам немного больше. Надеюсь, это поможет вам!

48
задан Peter Mortensen 19 August 2011 в 05:16
поделиться

6 ответов

Я не уверен в том, под чем Вы подразумеваете "глобальный" здесь, но здесь это идет (я предполагаю, что Вы подразумеваете, что команда на прикладном уровне, например, Сохраняет Весь , который может быть инициирован отовсюду Ctrl + Сдвиг + S .)

Вы находите глобальное UIElement по Вашему выбору, например, высокоуровневое окно, которое является родителем всех средств управления, где Вам нужна эта привязка. Из-за "пузырения" событий WPF, события в дочерних элементах будут пузыриться полностью до корня дерева управления.

Теперь, сначала Вам нужно

  1. для привязки Ключевой Комбинации с Командой с помощью InputBinding как это
  2. , Вы можете тогда сцепление команда к Вашему обработчику (например, код, который называют SaveAll) через CommandBinding.

Для Windows Ключ, Вы используете право Ключ перечисленный участник, Key.LWin или Key.RWin

    public WindowMain()
    {
       InitializeComponent();
       // Bind Key
       InputBinding ib = new InputBinding(
           MyAppCommands.SaveAll,
           new KeyGesture(Key.S, ModifierKeys.Shift | ModifierKeys.Control));
       this.InputBindings.Add(ib);
       // Bind handler
       CommandBinding cb = new CommandBinding( MyAppCommands.SaveAll);
       cb.Executed += new ExecutedRoutedEventHandler( HandlerThatSavesEverthing );
       this.CommandBindings.Add (cb );
    }

    private void HandlerThatSavesEverthing (object obSender, ExecutedRoutedEventArgs e)
    {
      // Do the Save All thing here.
    }
26
ответ дан chicks 7 November 2019 в 12:14
поделиться

Я не уверен в WPF, но это может помочь. Я использовал решение, описанное в RegisterHotKey (user32) (измененный к моим потребностям, конечно) для приложения Windows Forms C# для присвоения комбинации КЛАВИШИ CTRL в рамках Windows для перевода в рабочее состояние формы C#, и это работало красиво (даже на Windows Vista). Я надеюсь, что это помогает и удачи!

1
ответ дан Peter Mortensen 7 November 2019 в 12:14
поделиться

RegisterHotKey() предложенный John мог работать - единственная выгода - то, что это требует HWND (использующий PresentationSource.FromVisual() и бросающий результат к HwndSource).

Однако необходимо будет также ответить эти WM_HOTKEY сообщение - я не уверен, существует ли способ получить доступ к WndProc окна WPF или не (который может быть сделан для окон Windows Forms).

0
ответ дан Peter Mortensen 7 November 2019 в 12:14
поделиться

Коллега записал образец о том, как создать захват клавиатуры низкого уровня, который будет использоваться с WPF.

http://blogs.vertigo.com/personal/ralph/Blog/Lists/Posts/Post.aspx?ID=8

0
ответ дан Mike Dinescu 7 November 2019 в 12:14
поделиться

Если вы собираетесь смешивать Win32 и WPF, вот как я это сделал:

using System;
using System.Runtime.InteropServices;
using System.Windows.Interop;
using System.Windows.Media;
using System.Threading;
using System.Windows;
using System.Windows.Input;

namespace GlobalKeyboardHook
{
    public class KeyboardHandler : IDisposable
    {

        public const int WM_HOTKEY = 0x0312;
        public const int VIRTUALKEYCODE_FOR_CAPS_LOCK = 0x14;

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

        private readonly Window _mainWindow;
        WindowInteropHelper _host;

        public KeyboardHandler(Window mainWindow)
        {
            _mainWindow = mainWindow;
            _host = new WindowInteropHelper(_mainWindow);

            SetupHotKey(_host.Handle);
            ComponentDispatcher.ThreadPreprocessMessage += ComponentDispatcher_ThreadPreprocessMessage;
        }

        void ComponentDispatcher_ThreadPreprocessMessage(ref MSG msg, ref bool handled)
        {
            if (msg.message == WM_HOTKEY)
            {
                //Handle hot key kere
            }
        }

        private void SetupHotKey(IntPtr handle)
        {
            RegisterHotKey(handle, GetType().GetHashCode(), 0, VIRTUALKEYCODE_FOR_CAPS_LOCK);
        }

        public void Dispose()
        {
            UnregisterHotKey(_host.Handle, GetType().GetHashCode());
        }
    }
}

Вы можете получить код виртуальной клавиши для горячей клавиши, которую вы хотите зарегистрировать здесь: http://msdn.microsoft.com/en-us/library/ms927178.aspx

Может быть, есть способ получше, но это то, что у меня пока есть.

Твое здоровье!

17
ответ дан 7 November 2019 в 12:14
поделиться

Хотя RegisterHotKey иногда именно то, что вам нужно, в большинстве случаев вы, вероятно, не захотите использовать общесистемные горячие клавиши. В итоге я использовал следующий код:

using System.Windows;
using System.Windows.Interop;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        const int WM_KEYUP = 0x0101;

        const int VK_RETURN = 0x0D;
        const int VK_LEFT = 0x25;  

        public MainWindow()
        {
            this.InitializeComponent();

            ComponentDispatcher.ThreadPreprocessMessage += 
                ComponentDispatcher_ThreadPreprocessMessage;
        }

        void ComponentDispatcher_ThreadPreprocessMessage(
            ref MSG msg, ref bool handled)
        {
            if (msg.message == WM_KEYUP)
            {
                if ((int)msg.wParam == VK_RETURN)
                    MessageBox.Show("RETURN was pressed");

                if ((int)msg.wParam == VK_LEFT)
                    MessageBox.Show("LEFT was pressed");
            }
        }
    }
}
1
ответ дан 7 November 2019 в 12:14
поделиться