Прокрутка прокрутки показывает рабочий стол в полноэкранном приложении WinForms - PullRequest
0 голосов
/ 16 мая 2018

Рассмотрим полноэкранное приложение C # WinForms, используя подход, описанный в полноэкранном вопросе WinForms , работающем в Windows 10. Когда пользователь использует сенсорный жест «прокрутка» для прокрутки (например, в многострочном TextBox) и достигает любого из У экстремумов есть эффект, который тянет все окно в направлении прокрутки, показывая рабочий стол. Это не желательно для полноэкранного приложения. Как мне избавиться от эффекта?


Минимальный пример:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        FormBorderStyle = FormBorderStyle.None;
        WindowState = FormWindowState.Maximized;
        var tb = new TextBox() { Multiline = true, 
                                 ScrollBars = ScrollBars.Vertical, 
                                 Dock = DockStyle.Fill, 
                                 Text = string.Concat(Enumerable.Repeat("foo! ", 10000)) };
        Controls.Add(tb);
    }
}

1 Ответ

0 голосов
/ 16 мая 2018

В комментариях, аналогичных без ответа вопрос (кредит переходит к defaultlocale), упоминалось о возможной конфигурации реестра, которая могла бы предотвратить такое поведение. Тестирование подтвердило, что ответ будет, хотя и не оптимальным. Повторим еще раз: установка значения Bouncing для клавиши HKEY_CURRENT_USER\Software\Microsoft\Wisp\Touch на 0x0 устранит проблему. К счастью, это индивидуальная настройка, которая очень желательна (нет необходимости в правах администратора / учетной записи).
Модифицированный минимальный пример с «фиксированным» поведением прокрутки прокрутки:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        FormBorderStyle = FormBorderStyle.None;
        WindowState = FormWindowState.Maximized;
        var tb = new TextBox() { Multiline = true, ScrollBars = ScrollBars.Vertical, Dock = DockStyle.Fill, Text = string.Concat(Enumerable.Repeat("foo! ", 10000)) };
        Controls.Add(tb);
        DisableBouncing();
        FormClosed += (s, e) => RestoreBouncing();//for brevity just on Close
    }

    int? defaultSetting = null;
    private void DisableBouncing()
    {
        using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Wisp\Touch", true))
        {
            defaultSetting = key.GetValue(@"Bouncing", null) as int?;
            key.SetValue(@"Bouncing", 0x00000000, RegistryValueKind.DWord);
        }
    }

    private void RestoreBouncing()
    {
        using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Wisp\Touch", true))
        {
            key.SetValue(@"Bouncing", defaultSetting ?? 0, RegistryValueKind.DWord);
        }
    }
}
...