You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#启用/禁用Windows三指与四指触摸手势

问题:Windows系统中无需重启即可启用/禁用三指与四指触摸手势的C#代码实现

对应的系统设置路径:设置>蓝牙和设备>触摸>三指与四指触摸手势

已知通过修改注册表可实现该功能:

  • 注册表路径:HKEY_CURRENT_USER\Control Panel\Desktop
  • 启用手势:"TouchGestureSetting"=dword:00000001
  • 禁用手势:"TouchGestureSetting"=dword:00000000

但修改注册表后需要重启机器,需求是无需重启即可生效。

现有代码如下:

RegistryKey regHKCUKey = Registry.CurrentUser.OpenSubKey(@"ControlPanel\Desktop",RegistryKeyPermissionCheck.ReadWriteSubTree);
 if (regHKCUKey != null)
 {
     var regKey = regHKCUKey.GetValue("TouchGestureSetting").ToString();
     if (regKey == "1")
     {
         regHKCUKey.SetValue("TouchGestureSetting ", "0",RegistryValueKind.DWord);
     }
     regHKCUKey.Flush();
     regHKCUKey.Dispose();
 }

解决方案:修改注册表后发送系统设置变更通知

修改注册表后,通过Windows API发送WM_SETTINGCHANGE广播消息,让系统立即加载新的设置值,无需重启。以下是修正后的完整代码:

using Microsoft.Win32;
using System;
using System.Runtime.InteropServices;

class TouchGestureManager
{
    // 导入Windows API用于发送系统设置变更通知
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessageTimeout(
        IntPtr hWnd,
        uint Msg,
        UIntPtr wParam,
        string lParam,
        uint fuFlags,
        uint uTimeout,
        out UIntPtr lpdwResult);

    private const uint WM_SETTINGCHANGE = 0x001A;
    private const IntPtr HWND_BROADCAST = (IntPtr)0xFFFF;
    private const uint SMTO_ABORTIFHUNG = 0x0002;

    /// <summary>
    /// 启用或禁用三指与四指触摸手势
    /// </summary>
    /// <param name="enable">true为启用,false为禁用</param>
    public static void ToggleTouchGestures(bool enable)
    {
        // 打开注册表项并设置对应值
        using (RegistryKey desktopKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true))
        {
            if (desktopKey == null)
            {
                throw new InvalidOperationException("无法打开目标注册表项");
            }

            // 修复原代码的键名空格问题,确保修改正确的注册表项
            desktopKey.SetValue("TouchGestureSetting", enable ? 1 : 0, RegistryValueKind.DWord);
            desktopKey.Flush();
        }

        // 广播系统设置变更消息,让系统立即生效
        UIntPtr result;
        SendMessageTimeout(
            HWND_BROADCAST,
            WM_SETTINGCHANGE,
            UIntPtr.Zero,
            "Environment",
            SMTO_ABORTIFHUNG,
            5000,
            out result);
    }

    // 使用示例
    static void Main()
    {
        // 禁用手势
        ToggleTouchGestures(false);
        // 启用手势
        // ToggleTouchGestures(true);
    }
}

关键修正与说明:

  • 修复了原代码中SetValue时的键名错误(原代码多了空格TouchGestureSetting ,导致创建无效的新注册表项)
  • 通过SendMessageTimeout发送WM_SETTINGCHANGE广播消息,通知系统更新用户设置,无需重启
  • 使用using语句自动管理注册表资源,避免手动释放时的潜在问题
  • 无需管理员权限即可运行,因为修改的是当前用户(HKCU)下的注册表项

内容的提问来源于stack exchange,提问作者Amit Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:56:25