Silence 发布的文章

前言:
RouterOS 路由器单纯的使用脚本无法实现阿里云动态域名功能(无法给请求数据加签),需要借助其它代码写的转发代理。以前是在一个 Windows 版的工具里增加了相关功能代码,后来服务器要关掉,准备找个能部署到网站上的版本。网上找了一圈发现很多代码都是基于阿里云 SDK 的,需要在服务器上安装,而我用的那个网站空间只能上传文件不支持安装。于是自己写了一个基于阿里云 OpenAPI V3 版签名机制的 PHP 版本,只有一个 PHP 文件和一个 RouterOS 脚本,实测使用正常。顺带感慨:AI 辅助编程真的很方便。

RouterOSv7 For Aliyun DDNS
支持阿里云域名动态解析的 RouterOS V7 脚本及对应的转发代理。

说明:

  • 需要 RouterOS 脚本搭配一个转发代理程序使用。转发代理使用阿里云的 V3 版签名方案,只有一个 PHP 文件,不需要安装 SDK,可部署到各种 PHP 网站空间。
  • 只支持 RouterOS V7 以上版本。转发代理功能经过简化,只支持以 GET 方式进行域名查询和修改两个功能。
  • RouterOS 的开头部分为用户变量,需要自行修改,详见注释。
  • 域名的 DNS 服务器要指向阿里云。需要在阿里云上自行配置一个支持 DNS 解析权限的 AccessKey。
  • 为防止转发代理被滥用,使用了安全令牌(securityToken)和白名单,安全令牌需要 RouterOS 脚本和 PHP 代码中保持一致,白名单在 PHP 代码中添加。详见代码中的注释。
  • RouterOS 脚本中增加了一个通过钉钉机器人发送消息通知功能,若不需要可自行屏蔽。
  • RouterOS 脚本目前的设置是 IPV4,如要支持 IPV6,需要将 recordType 的值由 A 改为 AAAA,同时修改获取公网 IP 的方式:如从支持 IPV6 的路由器接口获取 IP,或者由 https://6.ipw.cn 之类的网站返回 IP。
  • 转发代理目前只有一个 PHP 版本,以后可能会增加其它语言版本。
  • PHP 端有日志功能,并可自行关闭,详见代码中用户配置部分。日志中不会记录用户的 AccessKeySecret。
  • RouterOS 脚本建议由 PPPOE 拨号 的 Profiles 配置中的 On Up 脚本中调用。最好是先用 delay 3s 命令延时几秒。
  • RouterDDNS.txt 为 RouterOS 脚本文件。
  • aliyun-ddns.php 为 PHP 转发代理。

下载:RouterOSv7-Aliyun-DDNS.zip

https://github.com/SilenceCCF/RouterOSv7-Aliyun-DDNS

TSFTool 是 IMETool 输入法设置工具的继承者,支持在 Windows 10-11/Windows Server 2019-2025 操作系统下,支持新的 TSF 输入法框架,并部分兼容旧的 IMM 输入法框架。

下载:TSFTool.rar

tsftool.png
版本历史:
0.9.3.2:优化异常处理,增加了日志功能(/log 参数启用日志,或者从其它功能菜单下打开),便于定位错误。
去除了一段测试后忘记删除的代码。无其它功能更新。
0.9.3.1:修订命令行参数 /remove_eng 失效问题,去除无用的 /? 参数。同时发现程序在最新版的 Windows11 下有时退出后仍在进程中,尚未找到原因。
0.9.3.0:解决命令行输入两个以上参数时,程序界面不自动退出的问题。将启用/禁用输入法的延时改为5秒。修正默认输入法设置为“美式键盘”时程序不能正确识别的问题。优化“每个窗口使用不同输入法”设置的生效速度。
0.9.2.9:增加命令行参数 /remove_eng,对应其它菜单下的删除顽固的英语美式键盘功能(不删除注册表项目)。
0.9.2.8:修订因输入法名称中含有空格和大写字母带来的命令行参数 bug,受影响的命令:
add_name/del_name/move_name/default_name/hotkey_name。
0.9.2.7:修改导出/导出配置文件格式,解决某些特殊情况下可能出现冲突的问题。
0.9.2.6:增加导出/导出配置功能(在其它功能菜单下)。去除 0.9.2.5 增加的禁用所有输入法功能。
0.9.2.5:增加禁用所有输入法功能(因为必须保留至少一个输入法,故全部禁用后保留了一个美式键盘)。
0.9.2.4:增加导出输入法列表功能。取消等待4秒的对话框。
0.9.2.3:修正两处 bug。
0.9.2.2:旧的 IMM 框架输入法在列表中显示为绿色。增加删除按钮,从注册表中删除无用输入法项目交由用户处理。
0.9.2.1:在启用/禁用输入法后强制延时4秒,避免系统操作太慢可能会导致程序报错。此版本可以清除小狼毫等输入法卸载后在注册表中的残留项目。
0.9.2.0:增加命令行参数支持;增加帮助窗口;一些细微的程序内部调整。
0.9.1.3:修补从 0.9.1.0 版本开始遗漏的写入键盘切换热键的部分代码(感谢 waiting 的提醒)。
0.9.1.2:旧版本的 Windows10 不支持表情符号面板功能,TSFTool 启动时会报错。此版本修订这一问题。
0.9.1.1:某种输入法禁用时,如果其已被设置为默认输入法,则将默认输入法改为语言列表。英文键盘布局在禁用/启用时,增加一个延时关闭的提示对话框,以免操作过快引起异常。增加删除顽固存在的英语美式键盘布局功能。
0.9.1.0:全部重写代码,使用不同的方式处理,支持旧的 IMM 框架输入法,修复一些 Bug。此版本需要管理员权限。增加 32 位版本,32位版本也可以正常支持 64 位的 Windows10。
0.9.0.0:初始版本,只支持 TSF框架输入法。

命令行参数:
/r /refresh 重载键盘布局。
/remove_eng 删除顽固的英语美式键盘(不删除注册表项目)。
/caps 使用 Caps Lock 键关闭大写。
/shift 使用 Shift 键关闭大写。
/alone:0 各个窗口使用相同的输入法。
/alone:1 各个窗口使用独立的输入法。
/bar:0 关闭桌面状态栏。
/bar:1 打开桌面状态栏。
/emoji:0 表情符号面板自动关闭。
/emoji:1 表情符号面板不自动关闭。
/layout:0/1/2/3 键盘布局切换热键:0:禁用;1:Ctrl+Alt;2:Alt+Shift;3:` 。
/lang:0/1/2/3 输入语言切换热键:0:禁用;1:Ctrl+Alt;2:Alt+Shift;3:` 。
/add_num:<输入法序号> 按序号添加到输入法列表。
/add_name:<输入法名称> 按名称添加到输入法列表。
/del_num:<输入法序号> 按序号从输入法列表中禁用。
/del_name:<输入法名称> 按名称从输入法列表中禁用。
/del_all 禁用列表中所有输入法。
/move_num:<输入法序号> <新序号> 将指定序号的输入法移动到新位置。
/move_name:<输入法名称> <新序号> 将指定名称的输入法移动到新位置。输入法名称中如有空格,需要用双引号括起来。
/langlist 使用语言列表替代默认输入法。
/default_num:<输入法序号> 将指定序号的输入法设置为默认输入法。
/default_name:<输入法名称> 将指定名称的输入法设置为默认输入法。
/export_enabled_list: <文件名> 导出当前使用的输入法列表。
/export_disabled_list: <文件名> 导出禁用的输入法列表。
/hotkey_num:<输入法序号> 按序号指定输入法热键,不填写热键表示删除热键。
/hotkey_name:<输入法名称> 按名称指定输入法热键,不填写热键表示删除热键。输入法名称中如有空格,需要用双引号括起来。
/switchkey:<a/b/c> 设置通用切换热键。a: 打开关闭输入法;b: 全角半角切换;c: 中英
文标点切换。

热键格式: 分两部分,以空格分隔,左侧为控制键,右侧为字符键,如:ctrl 5、shift home、ctrl+alt d 等。
左侧控制键列表如下(不分大小写):
Alt
Ctrl
Left_Ctrl
Right_Ctrl
Ctrl+Alt
Shift
Left_Shift
Right_Shift
Alt+Shift
Ctrl+Shift
Left_Ctrl+Shift
Right_Ctrl+Shift
Ctrl+Alt+Shift

右侧字符键列表如下:
0~9、a~z、-=,.;'[]\等常规字符
? 因 / 被定义为参数的前导符,用 ? 来代表 /
~ 数字1左侧那个 ` 字符
BACKSPACE
TAB
ENTER
HOME
END
PGUP
PGDN
INS
DEL
LEFT
RIGHT
UP
DOWN
F1~F12
NUM0~NUM9 小键盘的0~9
NUM+
NUM-
NUM*
NUM? 代表小键盘的 /
NUM.
LEFT_WINDOW 左徽标键
RIGHT_WINDOW 右徽标键
APPS 应用程序键

几点说明:
一、关于热键

  1. 切换热键修改后立即生效,但只对新打开窗口有效,原有窗口仍是旧的热键有效。
  2. 切换热键可以单独选择左/右控制键,但是重启后会变回左右双键同时有效,这是 Windows 的设置功能混乱造成的,重载键盘布局即可重新生效。可以点击设置工具右下角的“刷新”按钮,也可以由命令行执行 tsftool /r 或 tsftool /refresh 重载键盘布局。
  3. TSF 类型的输入法和旧的IMM类型输入法能使用的热键范围有所不同。TSF 输入法的控制键不分左右,虽然Windows10 的相关设置界面里显示 Alt 键只能用左 Alt,实际右 Alt 键也有效,故在命令行中指定 TSF 输入法热键时不再加 left 前缀,如:alt、ctrl+alt 等。另外,TSF输入法不能使用 Windows 键和 APPS 键。
  4. IMM输入法的控制键可单独区分左右,但只能使用 ctrl、shift、ctrl+shift这三组控制键组合,如:ctrl、left_ctrl、right_ctrl+shift 等等。打开/关闭输入法、全角/半角切换和中英文标点切换的热键定义范围和 IMM 输入法一致。Windows10 目前不再定义全局的全半角切换和中英文标点切换热键,但有时候也会有效,所以暂时保留了这两组切换热键设置。
  5. 因为 / 被定义为命令行参数的前导符,从命令行指定热键时使用其上档键 ? 来代替 /,小键盘的 / 用 num? 代替。
  6. 输入法热键的重码检查暂时只在当前当前语言下进行,其它语言自行注意即可。功能待以后改进。但是三组通用切换热键允许不同语言重码,互不影响。
  7. 在 Windows10 的热键设置中对“~”键的定义有误,无法生效,为保持兼容性本工具也保留了这个定义;另 Windows10 热键设置中定义的“抑音符”实际为小键盘的数字0。

二、关于键盘布局

  1. Windows10 从 1903 版本开始,已经无法正常将中文简体-美式键盘显示在输入法列表中了(实际是存在并启用的)。为了方便一些老用户,我在程序的输入法列表里硬加了一个“美式键盘”,以蓝色显示,可以正常使用。但是我发现,当切换到美式键盘后,是无法用打开/关闭输入法的切换热键“Ctrl+空格”切换到其它输入法的,只有改用切换键盘布局热键“Ctrl+Shift”或徽标键+空格键。我个人建议是禁用美式键盘,然后把最常用的输入法设置初始状态为“英文”,再用“Ctrl+空格”就可以正常切换了。
  2. 暂时只支持 0409 这一种英文键盘布局。
  3. 因为某些原因,在对美式键盘进行启用、禁用操作时,刷新需要 3~4 秒,注意操作不要太快。

三、其它

  1. 所有设置修改后立即生效,没有设计“确定”、“应用”这类功能。
  2. 本工具支持 Windows10 32/64 位版本和 Windows Server 2019,32 位版本程序在 64 位操作系统下运行正常。Windows7/8 等以前的操作系统的设置实际差异较大,不再支持。
  3. 如果安装了多种语言的输入法,可以从底部的已安装语言列表中切换进行设置。
  4. 输入法列表中显示为“粗体” 的条目表示此输入法已设置为默认输入法,可以从列表上点击右键,从弹出菜单里修改相关设置。
  5. 每种语言下应至少保留一种输入法或键盘。
  6. 如果要添加/删除某些输入法语言,请转到操作系统的设置/时间和语言/语言下进行设置。尝试过直接删除语言,发现容易造成输入法状态混乱,暂时取消了这个功能。
  7. 偶尔会出现工具里的输入法列表和实际的输入法列表不太一致的现象,来回调整几次刷新刷新就会正常。主要原因是因为 Windows 在语言选项中的输入法列表和任务栏上的输入法列表是两个不同的配置,有时候条目数量和顺序会不一致,通过输入法工具设置会纠正这个问题。
  8. 某些输入法(如小狼毫)在卸载不完全时,TSFTool 的输入法列表里可能会存在空行,以后的版本会想办法解决这个问题( 0.9.2.1 版本已解决)。
  9. 要下载 TSFTool,可以去我的个人网站:https://www.mympc.org

             Silence
             2025年7月30日
    

按照阿里云 OpenAPIV3 版本的签名机制,实现直接使用 HTTP 请求调用阿里云 OpenAPI 的 Delphi 单元,参考文档:https://help.aliyun.com/zh/sdk/product-overview/v3-request-structure-and-signature?spm=a2c4g.11186623.help-menu-262060.d_0_4_2.47934b19LiYUSI#3856b031d40ht

虽然现在 Delphi 没多少人用了,但仍是个很好用的工具。本单元在 Delphi 10.4.2 下开发,不依赖第三方库。用法比较简单,示例里都有。

目录说明:

  • /src/AliyunAPIClient.pas 本单元
  • /demo 示例

备注:使用示例时须将 AliyunAPIClient.pas 复制到同一文件夹或添加到搜索路径。
此代码已上传至 github

下载:DelphiForAliyunOpenAPIV3-main.zip

第一次安装Appsmith,按照官方文档给出的 docker-compose.yml 创建了一个文件:

version: "3"
services:
   appsmith:
     image: index.docker.io/appsmith/appsmith-ee
     container_name: appsmith
     ports:
         - "80:80"
         - "443:443"
     volumes:
         - ./stacks:/appsmith-stacks
     restart: unless-stopped

然后执行:
docker-compose up -d
安装一路顺利,完成后用浏览器正常打开了程序界面。填写安装向导,创建账户,然后就跳转到了登录界面。问题出现,用刚刚创建的账户密码无法登录,提示无效。但用随意输入的用户名和密码则会提示用户名密码不对之类的错误,说明系统已经验证通过了刚才的账户,是之后出了问题。
下面是我做的各种尝试:

  • 尝试找回密码,因尚未配置邮件服务器,系统无法发送找回邮件。找到 Appsmith 安装目录下的 stacks/logs/backend 日志目录,从日志文件中查询到了系统要发送的重置密码 URL,尝试使用此 URL 复位密码,提示成功。但仍然无法登录。
  • 尝试更换成社区版(appsmith-ce),无效。
  • 尝试从 docker-compose.yml 文件中加入如下内容,然后重新创建容器,无效。

      environment:
        APPSMITH_ENCRYPTION_PASSWORD: abcd
        APPSMITH_ENCRYPTION_SALT: abcd
  • 查看各个日志,没有发现什么有效线索。
  • 使用搜索引擎、询问各大 AI 都没有什么结果。
  • 最后去翻看官方文档,在本地开发设置相关内容下提到,使用其项目包里如下文件创建容器:/deploy/docker/docker-compose.yml

    # Use for running an Appsmith, during development.
    
    version: "3"
    
    services:
    appsmith:
      image: index.docker.io/appsmith/appsmith-ce:release
      container_name: appsmith
      ports:
        - "8080:80"
      environment:
        APPSMITH_ENCRYPTION_PASSWORD: abcd
        APPSMITH_ENCRYPTION_SALT: abcd
      volumes:
        - ./stacks:/appsmith-stacks

    尝试了一下,安装向导在创建完账户后是来到了数据库向导界面,然后就直接进入了程序开发界面。安装成功。
    究其原因,是最初的配置文件里没有为镜像指定标签,被默认打上了 latest 标签,从而下载了不同的版本。

Delphi 好像是没有支持 toml 格式解析的单元,从 github 上找到了来自悉尼的 Iwan Kelaiah 写的一个 TOML Parser for Free Pascal 单元。简单修改了一下,让其支持 delphi。
注意:对表数组的支持有 bug:[[table]]这种表数组格式在保存时,会被保存为 table=[...] 的错误格式,导致无法再次读取。另外,也不支持内联表数组读取(table=[{...},{...}])。
2025年5月,刚发现作者更新版本后已经可以支持表数组和内联表数组了。
原代码貌似只支持打开无签名的 utf-8 格式文件。为确保兼容性,修改为 ParseTOMLFile 函数可以打开常见编码格式的文件,如果没有签名则默认为 utf-8 格式。SerializeTOMLToFile 函数修改为支持签名和无签名两种 utf-8 格式(默认为有签名),兼容原始版本,即在函数的输入参数最后增加了一个默认值为 True 的 BOM 参数,来决定保存的文件有没有签名。

下载:TOML.rar

以下为翻译的一些用法:

config.toml 示例:

# 注释:config.toml

revision = "1.2.1af"

[project]
name = "My Amazing Project"
version = "1.0.0"

基本用法

  • 读取 TOML 文件
    program BasicParseTOML;
    uses
      TOML;    
    var
      Config: TTOMLTable;
      RevisionValue, ProjectValue, ProjectName: TTOMLValue;
      ProjectTable: TTOMLTable;    
    begin
      // 打开 TOML 文件
      Config := ParseTOMLFromFile('config.toml');
      try
        // 访问字符串类型数据
        if (Config.TryGetValue('revision', RevisionValue)) then
          WriteLn('''revision'' 的值为:', RevisionValue.AsString);   
        // 安全地访问数据
        if Config.TryGetValue('project', ProjectValue) and
          (ProjectValue is TTOMLTable) then
        begin
          ProjectTable := TTOMLTable(ProjectValue);
          if ProjectTable.TryGetValue('name', ProjectName) then
            WriteLn('Project Name: ', ProjectName.AsString)
          else
            WriteLn('Project name 未找到。');
        end
        else
          WriteLn('Project 配置未找到。');
      finally
        Config.Free;
      end;
    end.
  • 写入 TOML 文件
    program BasicSerializeTOML;
    uses
      TOML;
    var
      Config: TTOMLTable;
      Database: TTOMLTable;
    begin
      Config := TOMLTable;
      try
        Database := TOMLTable;
        // 添加数据
        Database.Add('host', TOMLString('localhost'));
        Database.Add('port', TOMLInteger(5432));
        // 修改数据
        Database.Items.AddOrSetValue('enable',TOMLBoolean(True));
        Config.Add('database', Database);    
        if SerializeTOMLToFile(Config, 'config.toml') then
          WriteLn('配置保存成功。')
        else
          WriteLn('保存配置出错。');
      finally
        Config.Free;
      end;
    end.

常见用法

  • 使用数组
    var
      Config: TTOMLTable;
      Tags: TTOMLArray;
    begin
      Config := TOMLTable;
      try
        Tags := TOMLArray;
        Tags.Add(TOMLString('pascal'));
        Tags.Add(TOMLString('toml'));
        Config.Add('tags', Tags);    
        WriteLn(SerializeTOML(Config));
      finally
        Config.Free;
      end;
    end.
  • 嵌套表
    var
      Config: TTOMLTable;
      Database: TTOMLTable;
    begin
      Config := TOMLTable;
      try
        Database := TOMLTable;
        Database.Add('host', TOMLString('localhost'));
        Database.Add('port', TOMLInteger(5432));
        Config.Add('database', Database);
        WriteLn(SerializeTOML(Config));
      finally
        Config.Free;
      end;
    end.
  • 序列化复杂结构
    program BasicSerializeTOML;
    uses
      TOML, SysUtils;
    var
      Config, ServerConfig: TTOMLTable;
      Ports: TTOMLArray;
      SerializedTOML: string;
    begin
      Config := TOMLTable;
      try
        // 创建嵌套表
        ServerConfig := TOMLTable;
        ServerConfig.Add('host', TOMLString('127.0.0.1'));
        ServerConfig.Add('enabled', TOMLBoolean(True));
        // 创建和填充数组
        Ports := TOMLArray;
        Ports.Add(TOMLInteger(80));
        Ports.Add(TOMLInteger(443));
        ServerConfig.Add('ports', Ports);    
        // 添加 server 配置到主配置
        Config.Add('server', ServerConfig);    
        // 添加一些基础元数据
        Config.Add('version', TOMLFloat(1.0));
        Config.Add('last_updated', TOMLDateTime(Now));    
        // 序列化为 TOML 格式
        SerializedTOML := SerializeTOML(Config);
        WriteLn('生成 TOML:');
        WriteLn(SerializedTOML);    
        // 保存文件
        if SerializeTOMLToFile(Config, 'config.toml') then
          WriteLn('保存成功。');    
      finally
        Config.Free;
      end;
    end.

上述代码将生成 TOML 文件,内容如下:

    version = 1.0
    last_updated = 2024-03-20T15:30:45Z
    [server]
    host = "127.0.0.1"
    enabled = true
    ports = [ 80, 443 ]

说明:所有数据都经过适当的类型检查和内存管理。该单元可确保:

  • 每个值都有正确的 TOML 类型
  • 数组保持类型一致性
  • 所有对象都已正确释放
  • 验证类型转换
  • 内存管理

注意:

  • 仅释放顶级 owner 表以避免内存管理问题。
  • 适当的内存管理对于防止应用程序中的内存泄漏至关重要。

创建/释放表:

    var
      Config: TTOMLTable;
      Database: TTOMLTable;
    begin
      Config := TOMLTable;
      Database := TOMLTable;
      //使用 Add 方法将嵌套表或值插入父表中。
      Config.Add('database', Database);
      // ... 添加其它嵌套表及数据...
      Config.Free; // 仅释放顶级所有者即可自动释放所有嵌套的表和值。
    end.

避免显式释放嵌套对象:
• 不要手动释放嵌套表或值,以防止出现内存管理问题。

API 参考

类型

  • TTOMLValue - 所有 TOML 值的基本类型
  • TTOMLTable - TOML 表
  • TTOMLArray - TOML 数组
  • TTOMLString - TOML 字符串类型
  • TTOMLInteger - TOML 整数类型
  • TTOMLFloat - TOML 浮点类型
  • TTOMLBoolean - TOML 布尔类型
  • TTOMLDateTime - TOML 日期时间类型

用于创建 TOML 值的辅助函数

创建 TOML 字符串值。

    TOMLString
      function TOMLString(const AValue: string): TTOMLString;

创建 TOML 整数值。

    TOMLInteger
      function TOMLInteger(const AValue: Int64): TTOMLInteger;

创建 TOML 浮点值。

    TOMLFloat
      function TOMLFloat(const AValue: Double): TTOMLFloat;

创建 TOML 布尔值。

    TOMLBoolean
        function TOMLBoolean(const AValue: Boolean): TTOMLBoolean;

创建 TOML 时间日期格式。

    TOMLDateTime
        function TOMLDateTime(const AValue: TDateTime): TTOMLDateTime;

创建 TOML 数组。

    TOMLArray
      function TOMLArray: TTOMLArray;

创建 TOML 表。

    TOMLTable
      function TOMLTable: TTOMLTable;

解析函数

  • ParseTOML
    将 TOML 格式的字符串解析为 TTOMLTable 对象。
  function ParseTOML(const ATOML: string): TTOMLTable;
  begin
    Result := TOML.Parser.ParseTOMLString(ATOML);
  end;

• ParseTOMLFromFile
将 TOML 文件解析为 TTOMLTable 对象。

      function ParseTOMLFromFile(const AFileName: string): TTOMLTable;
      var
        FileStream: TFileStream;
        StringStream: TStringStream;
      begin
        FileStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
        try
          StringStream := TStringStream.Create('');
          try
            StringStream.CopyFrom(FileStream, 0);
            Result := ParseTOMLString(StringStream.DataString);
          finally
            StringStream.Free;
          end;
        finally
          FileStream.Free;
        end;
      end;

序列化函数

  • SerializeTOML
    将 TTOMLValue 序列化为 TOML 格式的字符串。

      function SerializeTOML(const AValue: TTOMLValue): string;
      begin
        Result := TOML.Serializer.SerializeTOML(AValue);
      end;

• SerializeTOMLToFile

序列化 TTOMLValue 并将其保存为文件(BOM:是否为带签名的 UTF-8 编码格式,默认有签名)。

      function SerializeTOMLToFile(const AValue: TTOMLValue; const AFileName: string; BOM: Boolean = True): Boolean;
      begin
        Result := TOML.Serializer.SerializeTOMLToFile(AValue, AFileName; BOM: Boolean = True);
      end;

Windows 11 更新到 24H2 版本后,很多用户都出现了鼠标光标在一些应用上光标消失的问题,如 chrome 浏览器、QQ NT 登录窗口、WPS 等。现在流传比较广的一个解决方案是通过控制面板/鼠标属性/指针设置“文本选择”的光标为 beam_r.cur,经测试只能部分解决问题,在鼠标光标经过窗口里的某些地方时,光标仍然会短暂地消失(透明)。
另一个比较好用的方案是:打开设置/屏幕/颜色管理,将“自动管理应用的颜色”选项关掉,效果立杆见影。
color.png

Windows 11 锁屏界面上默认是设置了显示“天气等”小部件,一同显示的还有路况、体育和财经。如果你不想看体育或财经等内容,设置里并没有选项可以定制。
屏幕截图 2024-12-11 135930.png

其实这个定制功能还是有的,用 EDGE 浏览器打开如下地址 https://www.msn.com/zh-cn/feed/personalize/settings,从资讯源里的信息卡设置里关掉体育或财经即可。
屏幕截图 2024-12-11 141232.png

公司又半死不活地坚持了一年,技术岗裁员裁到只剩我自己。终于在六月份的最后一天收到了解除劳动合同协议书,虽然早就知道这是注定的结局,但事到临头,心底一片茫然,不知该何去何从。
年近半百、只懂点技术、不通人情世故的老 IT 人,难道真的没有活路了吗?
万千思绪,竟无人可诉。

                 键盘映射工具 KeybMap V2.2 64位版本

KeybMap.png
功能:通过修改注册表来进行键盘键的重新定义。
文件大小:4.54M
适用系统:Windows VISTA/7/8/10/11 64位版本
界面:简体中文/英文

说明:本键盘映射工具仅修改注册表,不驻留内存。通过本工具,你可以将键盘上一些不常用的键定义为其它功能或者将其禁用,如将 ScrollLock 定义为静音、Wake Up 定义为减小音量、Sleep 定义为增大音量等等。
注意:
1、Power、WWW Home、Mute 等部分多媒体键(非 104 标准键)的映射只对 PS/2 键盘有效。若使用 USB 键盘则无法将其映射为其它键,除非使用 USB -> PS/2 转换器。
2、Pause 和 Fn 键不允许映射,程序已将其排除在外。
3、本版本只支持 64 位操作系统,使用时需要管理员权限。
4、32位版本的 KeybMap 在 64 位系统上可以运行,但映射功能无效,故不再提供。
更新:
2.2 版本修订了导入配置后界面不显示导入数据的 bug。
2.1 版本完善了导入导出流程,去除了当前用户的键盘映射功能(Windows7 之后操作系统不支持。但多媒体键重新定义动作是支持当前用户的,且优先级高于所有用户)。有人说看着键定义列表里有加号而没有等号感觉别扭,本来是写代码时为了绕过一个可能会出现的问题而故意这么做的,现在我还是改回来吧。
2.0 版本使用 Delphi 重写了一遍,优化了大量代码,修正了一处键名错误,补充了在非中文系统中遗漏的几处翻译。增加了几个键定义,屏蔽了 Windows 已经废弃的 RegisteredApp 功能。
1.9 版本修订了网友提出的在按键捕捉时的 bug,另外优化了一些相关流程。
1.8 版本暂时只发布了 64 位版本,因改用 Lazarus 编译,文件大小增加很多。高级功能里将当前用户和全局用户的定义分开排列,修正了类型为 Shellexecute 时指定的程序包含路径时导出为注册表文件时的一个问题。
1.7.3 版修正自定义键值无法保存问题,修正列表中动作状态刷新问题。
1.7.2 版增加对映射键适用范围的选择(当前用户/所有用户选择);允许自行输入键值进行映射;改进导入功能的兼容性。
1.7.1 版修正导入功能的一些问题。
1.7 版增加捕捉键值功能,可以识别大部分键盘的非标准扩展键位(注意:如果 PS/2 键盘使用了 USB 转换器,一些非标准扩展键位将会失效)。去掉程序的重启功能,改由用户自行操作。增加了键值显示。修正一个子窗口显示字体过大问题。
1.6 版恢复导入导出配置功能。
1.5 版增加对一些多媒体键定义修改功能。暂时屏蔽导入导出功能。
1.4 版增强对 VISTA 的兼容性,支持 Windows 7。
1.3 版修订由 1.2 版引起的键无法正确禁用问题。
1.2 版增补遗漏的 Z 键。
1.1 版修正多余两个键名问题。

                  Silence

下载:keybmap.rar