Как отключить весь сенсорный ввод на уровне приложения, окна или управления? - PullRequest
4 голосов
/ 25 февраля 2011

Используя c # для приложения wpf, если в панели управления в Windows 7 включено касание, пользователь по умолчанию может «писать» пальцем на InkCanvas. Я хочу отключить это и принудительно ввести только стилус.

Я хотел бы знать, как сделать это более чем одним способом, если это возможно: во-первых, отключив сенсорный ввод InkCanvas, во-вторых, отключив его для определенного окна, и в-третьих, отключив его для всего приложения. Четвертым бонусом будет знание того, как включить или выключить касание в масштабе всей системы.

Я попытался UnregisterTouchWindow, и я попытался установить Stylus.SetIsTouchFeedbackEnabled в false для InkCanvas, но ни один из них не сработал.

1 Ответ

3 голосов
/ 26 февраля 2011

Дальнейшее копание помогло мне собрать следующее как способ включения / выключения касания в масштабе всей системы.Если кто-нибудь знает, как это сделать любым из трех других способов, я все равно буду благодарен за эти ответы.

Основные шаги - проверить текущее состояние реестра, изменить его при необходимости (а затем обновить системураспознать изменения) и записать начальное состояние для восстановления при необходимости при выходе из программы.

Благодаря плакатам на этих двух ссылках для обучения.

public MainWindow(){

    InitializeComponent();

    RegistryKey regKey = Registry.CurrentUser;
    regKey = regKey.OpenSubKey(@"Software\Microsoft\Wisp\Touch", true);
    string currKey = regKey.GetValue("TouchGate").ToString();
    if (currKey == "1")
    {
        regKey.SetValue("TouchGate", 0x00000000);
        User32Utils.Notify_SettingChange();
        UserConfig.TGate = "1";
    }
    regKey.Close();
    ...
}


public static class UserConfig {
    public static string TGate { get; set; }
    ...
}


private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e){
    ...
    if (UserConfig.TGate == "1")
    {
        RegistryKey regKey = Registry.CurrentUser;
        regKey = regKey.OpenSubKey(@"Software\Microsoft\Wisp\Touch", true);
        regKey.SetValue("TouchGate", 0x00000001);
        User32Utils.Notify_SettingChange();
        regKey.Close();
    }
}



//------------------User32Utils.cs
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace (...)
{
    internal class User32Utils
    {
        #region USER32 Options
        static IntPtr HWND_BROADCAST = new IntPtr(0xffffL);
        static IntPtr WM_SETTINGCHANGE = new IntPtr(0x1a);
        #endregion

        #region STRUCT
        enum SendMessageTimeoutFlags : uint
        {
            SMTO_NORMAL = 0x0000,
            SMTO_BLOCK = 0x0001,
            SMTO_ABORTIFHUNG = 0x2,
            SMTO_NOTIMEOUTIFNOTHUNG = 0x0008
        }
        #endregion

        #region Interop

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern IntPtr SendMessageTimeout(IntPtr hWnd,
                                                uint Msg,
                                                UIntPtr wParam,
                                                UIntPtr lParam,
                                                SendMessageTimeoutFlags fuFlags,
                                                uint uTimeout,
                                                out UIntPtr lpdwResult);
        #endregion

        internal static void Notify_SettingChange()
        {
            UIntPtr result;
            SendMessageTimeout(HWND_BROADCAST, (uint)WM_SETTINGCHANGE,
                               UIntPtr.Zero, UIntPtr.Zero,
                                SendMessageTimeoutFlags.SMTO_NORMAL, 1000, out result);
        }
    }
}
...