前言

很久之前,我用易语言做了一个简单的能在桌面是发弹幕的程序。

众所周知,易语言有着诸多不足(如代码是二进制文件),所以我用 Visual Basic 重做了它:https://github.com/wsrj/desk-danmaku-vb

使用方法

主界面

主界面非常简单,只有弹幕文字、字体和颜色,还有一个比较重要的:弹幕最大宽度。

为什么要设置这个值呢?看下面“原理”一节就能知道,弹幕文字是被放进一个“容器”(窗口)里的,这个值就是容器的宽度。如果容器宽度不足,文本会换行。

目前我还做不到根据字号和文本长度计算宽度,所以只能自己选择了。

填写以上全部内容后,单击“发送”按钮,一条“弹幕”就会出现在你的桌面上,是不是很简单?(〜 ̄△ ̄)〜

命令行参数

此程序的语法是:

1
弹幕神器.exe [/?|/C]
参数 说明
/? 显示帮助信息。-h, --help等价于/?
/C 启用控制台。控制台中会显示程序运行时的一些信息。-c,--console等价于/C

原理

弹幕

前面提到,弹幕实际上是被放进一个窗口中的。Win32 API 有两个函数:SetWindowLongSetLayeredWindowAttributes。微软官网有对应的文档:

https://learn.microsoft.com/zh-cn/windows/desktop/api/winuser/nf-winuser-setwindowlonga
https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setlayeredwindowattributes。

分层窗口(layered window)支持设置背景透明度。也就是说,使用SetWindowLong给窗口设置WS_EX_LAYERED(分层)样式,再用SetLayeredWindowAttributes设置背景完全透明,就可以得到一个透明的窗口。在窗口上放置一个撑满整个窗口的标签控件,把标签背景改为透明,就可以实现“弹幕”的效果了。