在构建 Windows 桌面启动器(如 Flow.Launcher)时,如何快速、准确地扫描系统中安装的所有应用是第一步。本文介绍一套结合 物理路径扫描Shell 命名空间扫描 的混合方案。

1. 传统应用:开始菜单物理路径

Windows 的传统应用(Win32)主要通过“开始菜单”的快捷方式(.lnk)进行展示。

扫描路径

  • 用户级%AppData%\Microsoft\Windows\Start Menu\Programs
  • 系统级%ProgramData%\Microsoft\Windows\Start Menu\Programs

实现思路

遍历上述目录及其子目录,筛选 .lnk.exe 文件。

  • 使用 walkdir 递归遍历。
  • 提取文件名作为显示名称。
  • 利用 Shell 接口解析 .lnk 以获取图标和备注。

2. UWP 应用:AppsFolder 虚拟目录

现代应用(UWP)和部分系统项不一定存在物理 .lnk 文件,它们统一注册在 shell:AppsFolder 这个虚拟容器中。

核心概念

  • AUMID (AppUserModelID):UWP 应用的唯一标识符(例如 Microsoft.WindowsStore_8wekyb3d8bbwe!App)。
  • IShellItem:Windows 对所有 Shell 对象的抽象接口。

实现逻辑

  1. 获取 AppsFolder 实例:使用 SHGetKnownFolderItem(&FOLDERID_AppsFolder, ...)
  2. 枚举项:通过 BindToHandler 获取 IEnumShellItems
  3. 识别 UWP:通过 PKEY_AppUserModel_ID 获取 AUMID。如果 AUMID 包含 !,通常认为这是一个可启动的 UWP 应用。
  4. 解析启动目标:构建 shell:AppsFolder\<CanonicalName>

3. 技术挑战与优化

  • 去重逻辑:部分应用既在虚拟容器中,又在物理菜单中。通常以应用名称或执行路径作为 Key 进行 HashSet 去重。
  • 性能优化:扫描过程应放在异步线程中,避免阻塞 UI。
  • 拼音支持:为了更好的搜索体验,需将中文应用名转换为拼音和简拼。

4. 总结

一个完整的 Windows 应用扫描器必须是“双引擎”的:

  1. 物理扫描 捕捉大部分桌面软件。
  2. 虚拟扫描 补全 UWP 应用和系统工具。

private Object unwrapObject(Object scriptObj) {
if (scriptObj instanceof ScriptObjectMirror) {
ScriptObjectMirror scriptObjectMirror = (ScriptObjectMirror) scriptObj;
if (scriptObjectMirror.isArray()) {
List<Object> list = new ArrayList<>();
for (Map.Entry<String, Object> entry : scriptObjectMirror.entrySet()) {
list.add(convertIntoJavaObject(entry.getValue()));
}
return list;
} else {
Map<String, Object> map = new HashMap<>();
for (Map.Entry<String, Object> entry : scriptObjectMirror.entrySet()) {
map.put(entry.getKey(), convertIntoJavaObject(entry.getValue()));
}
return map;
}
} else {
return scriptObj;
}
}

环境

  • mysql 8.0

  • Django 3.2

(No changes detected)及解决

问题情景

# 迁移数据库
python manage.py makemigrations
python manage.py migrate

报错

RuntimeWarning: Got an error checking a consistent migration history performed
for database connection 'default': (2059, <NULL>)
warnings.warn
(No changes detected)

原因分析

MySQL 8.x加密方式:caching_sha2_password
MySQL 5.x加密方式为:mysql_native_password
所以要改成mysql_native_password

修改方式

  1. 由cmd进入命令行

  2. 登录到mysql: mysql -u username -p password

    参数说明:[-u]后面接的是登录数据库的账号,[-p]后面是密码

    如果无法登录,可能的原因是环境变量中PATH变量没有加入MySQL的目录,可以添加环境变量或在开始菜单中找到MySQL 8.0 Command Line Client进行登录(这种方式打开后直接输入密码即可)。

  3. 查看你的账号加密方式

    use mysql
    select user,plugin from user
    mysql> use mysql
    Database changed
    mysql> select user,plugin from user;
    +------------------+-----------------------+
    | user | plugin |
    +------------------+-----------------------+
    | cyk | caching_sha2_password |
    | mysql.infoschema | caching_sha2_password |
    | mysql.session | caching_sha2_password |
    | mysql.sys | caching_sha2_password |
    | root | caching_sha2_password |
    +------------------+-----------------------+
  4. 输入下面的指令进行修改

    mysql> alter user '用户名'@'localhost' identified with mysql_native_password by '你的密码';

    再次查看

    mysql> select user,plugin from user;
    +------------------+-----------------------+
    | user | plugin |
    +------------------+-----------------------+
    | cyk | caching_sha2_password |
    | mysql.infoschema | caching_sha2_password |
    | mysql.session | caching_sha2_password |
    | mysql.sys | caching_sha2_password |
    | root | mysql_native_password |
    +------------------+-----------------------+

(2026, ‘SSL connection error:unknown error number‘) 及解决

问题情景

# 迁移数据库
python manage.py makemigrations
python manage.py migrate

报错
Windows下django.db.utils.OperationalError: (2026, ‘SSL connection error: unknown error number‘)

原因分析

较高版本的mysql的ssl默认是开启的

解决方案

关闭ssl

  1. 登录mysql之后,输入该命令:

    mysql> SHOW VARIABLES LIKE '%ssl%';
  2. 修改配置文件my.ini(可能要通过属性修改权限,否则无法修改成功)

    # 路径:C:\ProgramData\MySQL\MySQL Server 8.0
    [mysqld]
    skip_ssl # 忽略ssl
  3. 重启mysql服务

  4. 重新执行命令

    mysql> SHOW VARIABLES LIKE '%ssl%';

安装 python-ldap 包时出现错误,如下:

"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\bin\HostX86\x64\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -DHAVE_SASL -DHAVE_TLS -DLDAPMODULE_VERSION=3.4.4 "-DLDAPMODULE_AUTHOR=python-ldap project" "-DLDAPMODULE_LICENSE=Python style" -IModules -IC:\Users\jiahe\scoop\apps\python38\current\include -IC:\Users\jiahe\scoop\apps\python38\current\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /TcModules/LDAPObject.c /Fobuild\temp.win-amd64-cpython-38\Release\Modules/LDAPObject.obj
LDAPObject.c
C:\Users\jiahe\AppData\Local\Temp\pip-install-xhre2otp\python-ldap_7783ac0f126e44ddb07bd17f8f8f826f\Modules\common.h(15): fatal error C1083: 无法打开包括文件: “lber.h”: No such file or directory
error: command 'C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.42.34433\\bin\\HostX86\\x64\\cl.exe' failed with exit code 2
[end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for python-ldap
Failed to build python-ldap
ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (python-ldap)

https://github.com/cgohlke/python-ldap-build/releases下载对应版本的whl文件,然后通过pip install安装即可解决。

另外,在解决过程中发现,很多历史帖子,都提到了这个网站https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap ,但是它已经不对外了,难过😔。

分享一下自己的观影实践

面向群体:非新手,有一定实践经验
电视设备:小米电视S75(开启ADB、未知软件安装)
观影目标:看直播(CCTV、地方台)、看动漫、电视剧、电源等杂七杂八的盗版资源 😅

我是通过adb命令直接安装apk,adb install apk文件路径

注意事项:

  • 尝试adb connect时,如果提示未授权 unauthorized 类似的关键词,先尝试adb kill-server,再adb start-server,然后尝试连接,这个时候电视上会出现提示授权的弹窗,确认授权即可。
  • 使用Kodi中的IPTV观影时,强烈建议开启路由器的IPV6。

不方便下载的,可以回复提出来。我能下载到的,就统一放到蓝奏云。

以下提到的软件包都放在这里: https://xiaojianzheng.lanzouw.com/b00wm56sgb 密码:jiahe

adb常用命令 https://www.cnblogs.com/lwj0126/p/17591654.htm

使用小米手机或者安卓机的朋友,可以安装小米电视助手进行APP安装。我没尝试过,不知道方不方便。可以参考这个视频: https://b23.tv/iOYIx8a

阅读全文 »