顶级小白 发表于 2026-4-9 05:41:39

无聊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;
    }
}




山梦 发表于 2026-4-9 11:46:09

厉害厉害厉害

storey 发表于 2026-4-9 12:36:36

优秀。。。
要是能再加个本地图标资源功能,就更好了!!!
页: [1]
查看完整版本: 无聊AI写的一个托盘闪烁提示功能.