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

如何在C#中修改鼠标DoubleClickSpeed并使修改即时生效

C#修改鼠标双击速度即时生效的解决方案

原理说明

修改注册表仅更新了配置的持久化存储值,Windows默认不会实时监听该注册表项的变更,只有收到系统级的设置变更通知时才会重新读取配置并生效。手动点击鼠标属性对话框的确定按钮,本质就是系统内部调用了设置变更通知的相关API。

实现方案

这里提供两种可行的实现方式,都无需用户手动操作系统设置界面:

方案1:直接调用Win32 API设置(推荐)

不需要手动修改注册表,直接调用SystemParametersInfo系统API即可一步完成设置,API会自动同步更新注册表,同时触发全局设置变更通知,实现即时生效。
完整代码示例:

using System;
using System.Runtime.InteropServices;

class MouseSettings
{
    // 导入Win32 SystemParametersInfo API
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni);

    // 相关常量定义
    private const uint SPI_SETDOUBLECLICKTIME = 0x001F;
    private const uint SPIF_UPDATEINIFILE = 0x01; // 将设置写入注册表
    private const uint SPIF_SENDCHANGE = 0x02; // 广播设置变更通知

    public static bool SetDoubleClickSpeed(int speedMs)
    {
        // 合法取值范围是100-900毫秒
        if (speedMs < 100 || speedMs > 900)
            throw new ArgumentOutOfRangeException(nameof(speedMs), "双击速度取值范围为100-900毫秒");
        
        return SystemParametersInfo(SPI_SETDOUBLECLICKTIME, (uint)speedMs, IntPtr.Zero, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
    }

    // 调用示例
    public static void Main()
    {
        bool setResult = SetDoubleClickSpeed(900);
        if (setResult)
        {
            // 设置成功,即时生效
        }
    }
}

方案2:修改注册表后触发系统刷新

如果你已经完成了注册表修改,仅需要触发系统重新加载配置,可广播WM_SETTINGCHANGE消息通知系统刷新鼠标相关设置:
代码示例:

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

class MouseSettings
{
    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam, uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);

    // 相关常量定义
    private const uint HWND_BROADCAST = 0xFFFF;
    private const uint WM_SETTINGCHANGE = 0x001A;
    private const uint SMTO_ABORTIFHUNG = 0x0002;

    public static void RefreshMouseSettings()
    {
        // 先修改注册表(你原来的逻辑)
        const string keyName = @"HKEY_CURRENT_USER\Control Panel\Mouse";
        Registry.SetValue(keyName, "DoubleClickSpeed", 900, RegistryValueKind.String);

        // 广播设置变更通知
        UIntPtr result;
        SendMessageTimeout(
            (IntPtr)HWND_BROADCAST, 
            WM_SETTINGCHANGE, 
            UIntPtr.Zero, 
            "Mouse", 
            SMTO_ABORTIFHUNG, 
            1000, 
            out result
        );
    }
}

注意事项

  • 双击速度的合法取值范围为100-900毫秒,超出范围的取值会被系统自动修正为边界值。
  • 方案1不需要额外操作注册表,系统会自动处理同步,兼容性更强,优先推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:39:05