编程开发与计算机科学

编译 libmagic.dll

libmagic 是由 file 命令提供的一个开源库,用于检测文件的类型,最新版本为 5.46,发布于 2024年 11 月。PyPI 上有一个名为 python-magic-bin 的包提供了编译好的 Windows 二进制版本,然而最后一次更新已是 8 年前。Scoop 的 main 仓库中也包含了一个由第三方编译的 file 命令,版本号为 5.45,但没有提供 libmagic 的动态链接库。此外,5.45 的 Magic 文件版本是 19,而 5.46 已经升级到 20,两者不兼容。看来是时候考虑自己编译一个 Windows 版本了。

……

如何判断一个窗口句柄是否为桌面顶层窗口

在微软官方文档中,并没有提供一个 API 用于判断一个窗口句柄是否为桌面的顶层窗口。通过类似 NULL == GetParent(hwnd) 或者 hwnd == GetAncestor(hWnd,GA_ROOT) 等简单代码都无法做出正确判断。经过测试,找到两种靠谱的解决方案。

……

Free Pascal 平台无关的原生数据类型

可能是历史原因,Free Pascal 编程环境中的数据类型数量浩瀚如繁星,其中又有很多类型是运行时定义的别名。为了去繁从简,本文整理了 Free Pascal 编译器支持的平台无关且和其他语言二进制兼容的原生数据类型。

……

Windows API 编程之调整菜单宽度

好多年没碰 Windows API 编程了,这次写 Traymond 才发现:堂堂 Windows 竟然没有一个 API 能够用来调整菜单的宽度。

通常,在程序中使用的静态菜单都是直接从资源中载入的,而这次需要动态增删菜单项目。这时我才发现一个问题:当用 InsertMenuItem() 函数插入一个菜单项时,Windows 会根据菜单项文本自动增加菜单宽度;但是当使用 DeleteMenu() 函数删除菜单项后,Windows 却无法根据剩余的菜单项文本自动缩小菜单宽度。搜遍全网,也只找到两种解决方法。

……

使用 Windows API 将图标转换成位图

在不依赖任何第三方库、仅使用 Windows API 的前提下,需要将窗口图标(HICON)转换成作为菜单图标的位图(HBITMAP)。

……

Svelte 前端开发笔记

近期用 Svelte 开发了一个小项目,记录在开发过程中遇到的一些问题。

……

Flask 项目中使用 Svelte

如果想在新项目中同时使用 Flask 后端和 Svelte 前端,可以通过 flask-svelte 进行创建。而对于已有项目,在不重构 Flask 项目目录结构的前提下,可以按照本文的方法集成 Svelte 前端。

假设现有的 Flask 项目目录结构如下:

/home/user/my-project/
├── app/
│   ├── __init__.py
│   ├── models.py
│   ├── views.py
│   ├── templates/
│   │   └── index.html
│   └── static/
│       └── style.css
├── tests/
│   └── test_app.py
├── venv/
├── setup.py
└── MANIFEST.in

my-project 下创建一个名为 frontend 的 Svelte 前端项目:

……

Rye!就决定是你了! Python 环境及包管理工具

自 2025 年 2 月发布 0.44 版后,Rye 项目再无更新。Rye 项目之后可能会不再更新,其功能将合并进 uv 项目中。

涉及 Python 环境及包管理的工具七七八八加起来不下于十几种,看得人眼花缭乱。以至于患有选择困难症的本人还在坚持使用最原始 pip + venv 来构建 Python 运行环境。为了与时俱进,经过多方比较,最后选择了 Rye 作为今后的主力生产工具了。

……

获取 Windows 系统默认字体和对应的字体文件

自 Windows Vista 和 Windows Server 2008 开始,操作系统界面默认的字体为 Segoe UI ,而 Windows XP 及之前的系统界面默认字体为 Tahoma 。不过 Segoe UI 字体的字形并不包含包括汉字在内的东亚文字。中文版 Windows 使用微软雅黑作为默认中文字体。

其他语言的默认字体见下表:

语言字体
简体中文Microsoft YaHei UI
繁体中文Microsoft JhengHei UI
日文Yu Gothic UI
韩文Malgun Gothic
希伯来文Gisha
泰文Leelawadee

不过相较于查表获取 Windows 系统的默认字体,使用 Windows API 来获取当前系统的默认字体会更加可靠。

……

修复 OpenFL 的 TextField 不显示输入法候选词列表的问题

在前文《试用跨平台 GUI 框架 HaxeUI》中提到了 OpenFLTextField 在启用输入法时无法显示候选词列表的问题。经过一番摸索,发现了问题出在了 SDL 库的身上。

OpenFL 的底层基于 Lime ,而 Lime 的桌面后端又是基于 SDL 。OpenFL 默认使用的 SDL 代码位于 openfl/libsdl 。问题定位于源文件 SDL_windowskeyboard.c 中的 IME_init() 函数中,只要将第 373 行的代码注释掉,就可以正常显示输入法候选词列表了:

……