после нажатия alt , ctrl не отлавливает WPF

137
05 декабря 2020, 06:20
 public void ZoomViewBody(object sender, MouseWheelEventArgs e)
        {
            if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
            {
                //код...
            }
        }
public void ZoomViewDistance(object sender, MouseWheelEventArgs e)
        {
            if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
            {
                //код...
            }
        }

После нажатия Аlt, Ctrl не отлавливает. Нужно ПРОСТО нажать Alt снова,чтобы CTRL снова начал отлавливать. В режиме Дебаг заходит без проблем в код ViewDistance и выполняет код.

Помогите решить вопрос :D Пожалуйста)

Answer 1

Ответ собранный из разных источников.
Искал по запросам: "wpf отключить поведение alt", "wpf после нажатия alt приложение замирает" и т.д.

Alt - клавиша модификатор. В MVVM используется так

<KeyBinding Modifiers="Alt"
            Key="D"
            Command="{Binding ...}" />

Такое поведение определяется операционной системой.
Если нажать и отпустить Alt, а потом нажать стрелку вниз, откроется меню.
Такое же поведение может быть у клавиши F10.
Нажатие Alt+кнопки на цифровой клавиатуре(Numpad) зарезервировано для ввода символов https://ru.wikipedia.org/wiki/Alt-код

Коды сообщений
https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-syskeydown

Коды клавиш
https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

Как решить проблему:

<Window x:Class=...
    Loaded="MainWindow_Loaded">
        
using System.Windows.Interop;
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    HwndSource.FromHwnd(new WindowInteropHelper(this).Handle)?.AddHook(WndProc);
}
private const int WM_SYSKEYDOWN = 0x0104;
private const int VK_MENU = 0x12;
private static IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == WM_SYSKEYDOWN && wParam.ToInt32() == VK_MENU)
        handled = true;
    return IntPtr.Zero;
}

Здесь решение для WindowsForms
https://stackoverflow.com/questions/15090994/disable-normal-behavior-of-alt-key

Здесь ответ по поводу мыши
https://stackoverflow.com/questions/37485091/wpf-intercept-global-mouse-movements-like-using-imessagefilter-in-windows-form

READ ALSO
Ошибка в работе с EditorUtility в Unity

Ошибка в работе с EditorUtility в Unity

Создал скрипт, который пользуется библиотекой UnityEditor и в нем используется класс EditorUtility, для вызова проводника, чтобы выдать путь к файлуВ...

95
C# передача делегата в качестве параметра метода

C# передача делегата в качестве параметра метода

Ошибка CS1061 "T" не содержит определения "CompareTo", и не удалось найти доступный метод расширения "CompareTo", принимающий тип "T" в качестве первого...

127
Чтение данных с NetworkStream C#

Чтение данных с NetworkStream C#

Пишу редактор кода на Windows Forms с возможностью следить за процессом написания с других компьютеровКогда клиент(писатель) пишет, каждое изменение...

134
Ошибка подключения базы Битрик (bitrix)

Ошибка подключения базы Битрик (bitrix)

Разворачиваю бекап сайта на локалке (опен сервер), в фале settingsphp и dbconn

119