无聊AI写的一个托盘闪烁提示功能.
本帖最后由 顶级小白 于 2026-4-9 05:44 编辑<火山程序 类型 = "通常" 版本 = 1 />
包 火山.程序
类 启动类 <公开 基础类 = 窗口程序类>
{
变量 主窗口对象 <类型 = 我的主窗口>
方法 启动方法 <公开 类型 = 整数>
{
主窗口对象.创建主窗口 ()
调试输出 (进程工具类.取进程PID ("Weixin.exe"))
返回 (1)
}
}
# ===
类 我的主窗口 <基础类 = 窗口 注释 = "样例主窗口" @视窗.布局 = "client_size = \"500, 350\"" 标题 = "托盘图标演示">
{
变量 正常图标句柄 <类型 = 变整数>
变量 闪烁图标句柄 <类型 = 变整数>
变量 提示文本 <类型 = 文本型 值 = "我的应用">
变量 闪烁按钮 <类型 = 按钮 @视窗.布局 = "id = 101\r\npos = \"20, 20, 150, 60\"" 标题 = "开始闪烁" 标记 = "1">
变量 停止闪烁按钮 <类型 = 按钮 @视窗.布局 = "id = 102\r\npos = \"160, 20, 150, 60\"" 标题 = "停止闪烁" 标记 = "2">
变量 信息消息按钮 <类型 = 按钮 @视窗.布局 = "id = 103\r\npos = \"300, 20, 150, 60\"" 标题 = "信息消息" 标记 = "3">
变量 警告消息按钮 <类型 = 按钮 @视窗.布局 = "id = 104\r\npos = \"20, 70, 150, 60\"" 标题 = "警告消息" 标记 = "4">
变量 错误消息按钮 <类型 = 按钮 @视窗.布局 = "id = 105\r\npos = \"160, 70, 150, 60\"" 标题 = "错误消息" 标记 = "5">
变量 无图标消息按钮 <类型 = 按钮 @视窗.布局 = "id = 106\r\npos = \"300, 70, 150, 60\"" 标题 = "无图标消息" 标记 = "6">
变量 修改图标按钮 <类型 = 按钮 @视窗.布局 = "id = 107\r\npos = \"20, 120, 150, 60\"" 标题 = "切换为警告图标" 标记 = "7">
变量 还原图标按钮 <类型 = 按钮 @视窗.布局 = "id = 108\r\npos = \"160, 120, 150, 60\"" 标题 = "还原应用图标" 标记 = "8">
变量 修改提示按钮 <类型 = 按钮 @视窗.布局 = "id = 109\r\npos = \"300, 120, 150, 60\"" 标题 = "修改提示文本" 标记 = "9">
变量 删除图标按钮 <类型 = 按钮 @视窗.布局 = "id = 110\r\npos = \"20, 170, 150, 60\"" 标题 = "删除托盘图标" 标记 = "10">
变量 添加图标按钮 <类型 = 按钮 @视窗.布局 = "id = 111\r\npos = \"160, 170, 150, 60\"" 标题 = "添加托盘图标" 标记 = "11">
方法 我的主窗口_创建完毕 <接收事件 类型 = 整数>
参数 来源对象 <类型 = 我的主窗口>
参数 标记值 <类型 = 整数>
{
正常图标句柄 = 托盘工具类.取系统图标句柄 (32512)
闪烁图标句柄 = 托盘工具类.取系统图标句柄 (32515)
托盘工具类.添加图标 (取窗口句柄 (), 1, 正常图标句柄, 提示文本)
返回 (0)
}
方法 按钮_被单击 <接收事件 类型 = 整数>
参数 来源对象 <类型 = 按钮>
参数 标记值 <类型 = 整数>
{
如果 (来源对象 == 闪烁按钮)
{
托盘工具类.开始闪烁 (取窗口句柄 (), 1, 正常图标句柄, 闪烁图标句柄, 500)
}
否则 (来源对象 == 停止闪烁按钮)
{
托盘工具类.停止闪烁 (取窗口句柄 (), 1, 正常图标句柄)
}
否则 (来源对象 == 信息消息按钮)
{
托盘工具类.弹出消息 (取窗口句柄 (), 1, "提示", "这是一条信息消息", 1, 3000)
}
否则 (来源对象 == 警告消息按钮)
{
托盘工具类.弹出消息 (取窗口句柄 (), 1, "警告", "这是一条警告消息", 2, 3000)
}
否则 (来源对象 == 错误消息按钮)
{
托盘工具类.弹出消息 (取窗口句柄 (), 1, "错误", "这是一条错误消息", 3, 3000)
}
否则 (来源对象 == 无图标消息按钮)
{
托盘工具类.弹出消息 (取窗口句柄 (), 1, "通知", "这是一条无图标消息", 0, 3000)
}
否则 (来源对象 == 修改图标按钮)
{
变量 警告句柄 <类型 = 变整数>
警告句柄 = 托盘工具类.取系统图标句柄 (32515)
托盘工具类.修改图标 (取窗口句柄 (), 1, 警告句柄, "已切换为警告图标")
}
否则 (来源对象 == 还原图标按钮)
{
托盘工具类.修改图标 (取窗口句柄 (), 1, 正常图标句柄, 提示文本)
}
否则 (来源对象 == 修改提示按钮)
{
托盘工具类.修改提示 (取窗口句柄 (), 1, "提示文本已修改 - " + 到文本 (取现行时间 ()))
}
否则 (来源对象 == 删除图标按钮)
{
托盘工具类.停止闪烁 (取窗口句柄 (), 1, 正常图标句柄)
托盘工具类.删除图标 (取窗口句柄 (), 1)
}
否则 (来源对象 == 添加图标按钮)
{
托盘工具类.添加图标 (取窗口句柄 (), 1, 正常图标句柄, 提示文本)
}
返回 (0)
}
方法 我的主窗口_可否被关闭 <接收事件 类型 = 整数>
参数 来源对象 <类型 = 我的主窗口>
参数 标记值 <类型 = 整数>
{
托盘工具类.停止闪烁 (取窗口句柄 (), 1, 正常图标句柄)
托盘工具类.删除图标 (取窗口句柄 (), 1)
返回 (0)
}
}
# ===
类 托盘工具类 <公开 @视窗.外部头文件 = "vol_flash.h" @视窗.外部源文件 = "vol_flash.cpp">
{
方法 取系统图标句柄 <公开 静态 类型 = 变整数
注释 = "通过系统图标ID获取图标句柄 常用值: 32512=应用图标 32515=警告图标 32513=错误图标 32514=问号图标 32516=信息图标 盾牌=32518"
@禁止流程检查 = 真>
参数 图标ID <类型 = 整数>
{
@ HICON hIcon = LoadIcon(NULL, MAKEINTRESOURCE(@<图标ID>));
@ return (INT_PTR)hIcon;
}
方法 添加图标 <公开 静态 类型 = 逻辑型 注释 = "添加托盘图标,成功返回真" @禁止流程检查 = 真>
参数 窗口句柄 <类型 = 变整数>
参数 图标ID <类型 = 整数 注释 = "自定义的托盘图标标识,用于区分多个图标">
参数 图标句柄 <类型 = 变整数>
参数 提示文本 <类型 = 文本型>
{
@ return VolTrayAdd((HWND)@<窗口句柄>, (UINT)@<图标ID>, (HICON)@<图标句柄>, @<提示文本>.GetText()) != FALSE;
}
方法 修改图标 <公开 静态 类型 = 逻辑型 注释 = "修改托盘图标及提示文本,传入0值表示不修改对应项" @禁止流程检查 = 真>
参数 窗口句柄 <类型 = 变整数>
参数 图标ID <类型 = 整数>
参数 图标句柄 <类型 = 变整数>
参数 提示文本 <类型 = 文本型>
{
@ return VolTrayModify((HWND)@<窗口句柄>, (UINT)@<图标ID>, (HICON)@<图标句柄>, @<提示文本>.GetText()) != FALSE;
}
方法 修改提示 <公开 静态 类型 = 逻辑型 注释 = "仅修改托盘图标的提示文本" @禁止流程检查 = 真>
参数 窗口句柄 <类型 = 变整数>
参数 图标ID <类型 = 整数>
参数 提示文本 <类型 = 文本型>
{
@ return VolTrayModify((HWND)@<窗口句柄>, (UINT)@<图标ID>, NULL, @<提示文本>.GetText()) != FALSE;
}
方法 删除图标 <公开 静态 类型 = 逻辑型 注释 = "删除托盘图标" @禁止流程检查 = 真>
参数 窗口句柄 <类型 = 变整数>
参数 图标ID <类型 = 整数>
{
@ return VolTrayDelete((HWND)@<窗口句柄>, (UINT)@<图标ID>) != FALSE;
}
方法 弹出消息 <公开 静态 类型 = 逻辑型 注释 = "弹出托盘气泡消息 消息图标类型: 0=无图标 1=信息(蓝色) 2=警告(黄色) 3=错误(红色)" @禁止流程检查 = 真>
参数 窗口句柄 <类型 = 变整数>
参数 图标ID <类型 = 整数>
参数 标题 <类型 = 文本型>
参数 内容 <类型 = 文本型>
参数 消息图标 <类型 = 整数 注释 = "0=无 1=信息 2=警告 3=错误">
参数 显示时长 <类型 = 整数 注释 = "气泡显示时长(毫秒),最小10000ms(Win10+由系统控制)">
{
@ DWORD dwIcon = NIIF_NONE;
@ if (@<消息图标> == 1) dwIcon = NIIF_INFO;
@ else if (@<消息图标> == 2) dwIcon = NIIF_WARNING;
@ else if (@<消息图标> == 3) dwIcon = NIIF_ERROR;
@ return VolTrayBalloon((HWND)@<窗口句柄>, (UINT)@<图标ID>, @<标题>.GetText(), @<内容>.GetText(), dwIcon, (UINT)@<显示时长>) != FALSE;
}
方法 开始闪烁 <公开 静态 注释 = "开始托盘图标闪烁,类似QQ消息提醒效果" @禁止流程检查 = 真>
参数 窗口句柄 <类型 = 变整数>
参数 图标ID <类型 = 整数>
参数 正常图标句柄 <类型 = 变整数>
参数 闪烁图标句柄 <类型 = 变整数>
参数 间隔 <类型 = 整数 注释 = "闪烁间隔(毫秒),推荐300-800">
{
@ VolFlashSetIcons((HICON)@<正常图标句柄>, (HICON)@<闪烁图标句柄>);
@ SetTimer((HWND)@<窗口句柄>, 54321, (UINT)@<间隔>, VolFlashTimerProc);
}
方法 停止闪烁 <公开 静态 注释 = "停止托盘图标闪烁,恢复正常图标" @禁止流程检查 = 真>
参数 窗口句柄 <类型 = 变整数>
参数 图标ID <类型 = 整数>
参数 正常图标句柄 <类型 = 变整数>
{
@ KillTimer((HWND)@<窗口句柄>, 54321);
@ VolTrayModify((HWND)@<窗口句柄>, (UINT)@<图标ID>, (HICON)@<正常图标句柄>, NULL);
}
}
# ===
类 进程工具类 <公开 @视窗.外部头文件 = "<TlHelp32.h>">
{
方法 取进程PID <公开 静态 类型 = 整数 注释 = "通过进程名获取对应的进程ID,未找到返回0" @禁止流程检查 = 真>
参数 进程名 <类型 = 文本型 注释 = "提供所要查找的进程名称,如:notepad.exe">
{
@ DWORD dwPID = 0;
@ HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
@ if (hSnapshot != INVALID_HANDLE_VALUE)
@ {
@ PROCESSENTRY32W pe32 = {0};
@ pe32.dwSize = sizeof(PROCESSENTRY32W);
@ if (Process32FirstW(hSnapshot, &pe32))
@ {
@ do
@ {
@ if (_wcsicmp(pe32.szExeFile, @<进程名>.GetText()) == 0)
@ {
@ dwPID = pe32.th32ProcessID;
@ break;
@ }
@ } while (Process32NextW(hSnapshot, &pe32));
@ }
@ CloseHandle(hSnapshot);
@ }
@ return dwPID;
}
}
厉害厉害厉害 优秀。。。
要是能再加个本地图标资源功能,就更好了!!!
页:
[1]