Как мне записать ключ в WPF? - PullRequest
0 голосов
/ 24 ноября 2010

Как записать событие нажатия клавиши в WPF, даже если мое приложение не сфокусировано?

Ответы [ 3 ]

3 голосов
/ 24 ноября 2010

Для меня лучший способ это:

public MainWindow()
{
    InitializeComponent();

    CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
}

void CompositionTarget_Rendering(object sender, EventArgs e)
{
    if ((Keyboard.GetKeyStates(Key.W) & KeyStates.Down) > 0)
    {
        player1.walk();
    }
} 

Событие рендеринга запускается каждый раз.

1 голос
/ 04 мая 2018

Глобальный хук клавиатуры может замедлить отладку.

Я предпочитаю использовать этот подход:

  1. Создать класс KeyboardListener

    открытый класс KeyboardListener: IDisposable { приватный только для чтения Тема клавиатурыThread;

    //Here you can put those keys that you want to capture
    private readonly List<KeyState> numericKeys = new List<KeyState>
    {
        new KeyState(Key.D0),
        new KeyState(Key.D1),
        new KeyState(Key.D2),
        new KeyState(Key.D3),
        new KeyState(Key.D4),
        new KeyState(Key.D5),
        new KeyState(Key.D6),
        new KeyState(Key.D7),
        new KeyState(Key.D8),
        new KeyState(Key.D9),
        new KeyState(Key.NumPad0),
        new KeyState(Key.NumPad1),
        new KeyState(Key.NumPad2),
        new KeyState(Key.NumPad3),
        new KeyState(Key.NumPad4),
        new KeyState(Key.NumPad5),
        new KeyState(Key.NumPad6),
        new KeyState(Key.NumPad7),
        new KeyState(Key.NumPad8),
        new KeyState(Key.NumPad9),
        new KeyState(Key.Enter)
    };
    
    private bool isRunning = true;
    
    public KeyboardListener()
    {
        keyboardThread = new Thread(StartKeyboardListener) { IsBackground = true };
        keyboardThread.Start();
    }
    
    private void StartKeyboardListener()
    {
        while (isRunning)
        {
            Thread.Sleep(15);
            if (Application.Current != null)
            {
                Application.Current.Dispatcher.Invoke(() =>
                {
                    if (Application.Current.Windows.Count > 0)
                    {
                        foreach (var keyState in numericKeys)
                        {
                            if (Keyboard.IsKeyDown(keyState.Key) && !keyState.IsPressed) //
                            {
                                keyState.IsPressed = true;
                                KeyboardDownEvent?.Invoke(null, new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromDependencyObject(Application.Current.Windows[0]), 0, keyState.Key));
                            }
    
                            if (Keyboard.IsKeyUp(keyState.Key))
                            {
                                keyState.IsPressed = false;
                            }
                        }
                    }
                });
            }
        }
    }
    
    public event KeyEventHandler KeyboardDownEvent;
    
    /// <summary>
    /// Состояние клавиши
    /// </summary>
    private class KeyState
    {
        public KeyState(Key key)
        {
            this.Key = key;
        }
    
        public Key Key { get; }
        public bool IsPressed { get; set; }
    }
    
    public void Dispose()
    {
        isRunning = false;
        Task.Run(() =>
        {
            if (keyboardThread != null && !keyboardThread.Join(1000))
            {
                keyboardThread.Abort();
            }
        });
    }
    }
    
  2. Подписаться на KeyboardDownEvent с выделенным кодом (или там, где это необходимо).

    public partial class MainWindow : Window
    

    { приватный слушатель KeyboardListener;

    public MainWindow()
    {
        InitializeComponent();
    }
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        listener = new KeyboardListener();
        listener.KeyboardDownEvent += ListenerOnKeyPressed;
    }
    
    private void ListenerOnKeyPressed(object sender, KeyEventArgs e)
    {
        // TYPE YOUR CODE HERE
    }
    
    private void Window_OnUnloaded(object sender, RoutedEventArgs e)
    {
        listener.KeyboardDownEvent -= ListenerOnKeyPressed;
    }
    

    }

  3. 1024 * Готово *

0 голосов
/ 24 ноября 2010
...