无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 287|回复: 31
打印 上一主题 下一主题

[原创] 思维导图式启动管理软件MindLauncher 1.0 仅43K

[复制链接]
跳转到指定楼层
1#
发表于 昨天 15:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tt911 于 2026-3-3 15:57 编辑

Bin.rar (40.82 KB, 下载次数: 3)
使用VS2022编译+谷哥AI生成代码,全程我一句也不会写。

#At+Q 弹菜单
#Ctrl + Alt + Q 退出
#Ctrl + Alt +↑ 调节菜单高度
#Ctrl + Alt +↓ 调节菜单高度


  1. config.txt
  2. [今日核心任务]
  3.         !重要开发|C:\Windows\System32\notepad.exe
  4.         浏览器搜素|C:\Program Files\Google\Chrome\Application\chrome.exe
  5. [日常工具]
  6.         资源管理器|C:\Windows\explorer.exe
  7.         计算器|C:\Windows\System32\calc.exe
  8. [个人日程]
  9.         -已完成任务|C:\Windows\System32\cmd.exe
复制代码


  1. setting.ini
  2. [Hotkey]
  3. # 0x20 是空格, 0x51 是 Q, 0x70 是 F1
  4. WakeUpKey=0x20
  5. WakeUpMod=1  # 1=Alt, 2=Ctrl, 4=Shift, 8=Win

  6. [Appearance]
  7. FontSize=18
  8. MenuWidth=450
  9. ThemeColor=0x141414
复制代码
热键可随时定义,字体大小 可动态 或静态调整,程序列表配置也自己修改 (记得配合TAB 加空格)


要是想要好看点的可以下载带 导图线的
MindLauncher.rar (135.45 KB, 下载次数: 12) 代价体积大了一些。

2#
发表于 昨天 15:56 | 只看该作者
感谢辛苦提供分享!
回复

使用道具 举报

3#
发表于 昨天 15:59 | 只看该作者
感谢分享!
回复

使用道具 举报

4#
 楼主| 发表于 昨天 16:01 | 只看该作者
最后是源代码:

  1. #define _CRT_SECURE_NO_WARNINGS       // 禁用安全警告 (解决 C4996)
  2. #define _CRT_NON_CONFORMING_WCSTOK   // 允许使用旧版双参数 wcstok
  3. #include <windows.h>
  4. #include <shellapi.h>

  5. #pragma comment(lib, "User32.lib")
  6. #pragma comment(lib, "Shell32.lib")
  7. #pragma comment(lib, "Gdi32.lib")
  8. #pragma comment(lib, "Kernel32.lib")

  9. // 纯手写结构体,不依赖 STL
  10. struct AppNode {
  11.     wchar_t name[64];
  12.     wchar_t path[MAX_PATH];
  13.     int level;
  14.     HICON hIcon;
  15. };

  16. // 全局静态数组(简单处理,假设最多 50 个条目)
  17. AppNode g_nodes[50];
  18. int g_nodeCount = 0;
  19. HFONT hFontMain = NULL;
  20. bool g_visible = false;
  21. int g_menuHeight = 600;
  22. int g_menuWidth = 450;

  23. // 1. 原生文件解析:手动处理换行和缩进
  24. void LoadConfig() {
  25.     for (int i = 0; i < g_nodeCount; i++) if (g_nodes[i].hIcon) DestroyIcon(g_nodes[i].hIcon);
  26.     g_nodeCount = 0;

  27.     HANDLE hFile = CreateFile(L"config.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  28.     if (hFile == INVALID_HANDLE_VALUE) return;

  29.     DWORD fileSize = GetFileSize(hFile, NULL);
  30.     char* buffer = (char*)HeapAlloc(GetProcessHeap(), 0, fileSize + 1);
  31.     DWORD read;
  32.     ReadFile(hFile, buffer, fileSize, &read, NULL);
  33.     buffer[fileSize] = '\0';
  34.     CloseHandle(hFile);

  35.     // 简单的按行解析逻辑 (UTF-8 转 WideChar)
  36.     int nLen = MultiByteToWideChar(CP_UTF8, 0, buffer, fileSize, NULL, 0);
  37.     wchar_t* wBuf = (wchar_t*)HeapAlloc(GetProcessHeap(), 0, (nLen + 1) * sizeof(wchar_t));
  38.     MultiByteToWideChar(CP_UTF8, 0, buffer, fileSize, wBuf, nLen);
  39.     wBuf[nLen] = L'\0';

  40.     wchar_t* line = wcstok(wBuf, L"\r\n");
  41.     while (line && g_nodeCount < 50) {
  42.         int indent = 0;
  43.         while (line[indent] == L'\t') indent++;
  44.         g_nodes[g_nodeCount].level = indent;

  45.         wchar_t* content = line + indent;
  46.         wchar_t* split = wcschr(content, L'|');
  47.         if (split) {
  48.             *split = L'\0';
  49.             lstrcpyn(g_nodes[g_nodeCount].name, content, 64);
  50.             lstrcpyn(g_nodes[g_nodeCount].path, split + 1, MAX_PATH);

  51.             SHFILEINFO sfi = { 0 };
  52.             SHGetFileInfo(g_nodes[g_nodeCount].path, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_SMALLICON);
  53.             g_nodes[g_nodeCount].hIcon = sfi.hIcon;
  54.         }
  55.         else {
  56.             lstrcpyn(g_nodes[g_nodeCount].name, content, 64);
  57.             g_nodes[g_nodeCount].path[0] = L'\0';
  58.             g_nodes[g_nodeCount].hIcon = NULL;
  59.         }
  60.         g_nodeCount++;
  61.         line = wcstok(NULL, L"\r\n");
  62.     }
  63.     HeapFree(GetProcessHeap(), 0, buffer);
  64.     HeapFree(GetProcessHeap(), 0, wBuf);
  65. }

  66. // 2. 动态热键与 INI (纯 API 版)
  67. void UpdateHotkeys(HWND hWnd) {
  68.     for (int i = 1; i <= 4; i++) UnregisterHotKey(hWnd, i);
  69.     wchar_t path[MAX_PATH];
  70.     GetModuleFileName(NULL, path, MAX_PATH);
  71.     wchar_t* lastSlash = wcsrchr(path, L'\\');
  72.     if (lastSlash) lstrcpy(lastSlash + 1, L"settings.ini");

  73.     UINT vk = GetPrivateProfileInt(L"Hotkey", L"WakeUpKey", 0x20, path);
  74.     UINT mod = GetPrivateProfileInt(L"Hotkey", L"WakeUpMod", 1, path);
  75.     g_menuWidth = GetPrivateProfileInt(L"Appearance", L"MenuWidth", 450, path);
  76.     if (!g_visible) g_menuHeight = GetPrivateProfileInt(L"Appearance", L"MenuHeight", 600, path);

  77.     RegisterHotKey(hWnd, 1, mod, vk);
  78.     RegisterHotKey(hWnd, 2, MOD_ALT | MOD_CONTROL, 0x51);
  79.     RegisterHotKey(hWnd, 3, mod | MOD_WIN | MOD_CONTROL, VK_UP);
  80.     RegisterHotKey(hWnd, 4, mod | MOD_WIN | MOD_CONTROL, VK_DOWN);
  81. }

  82. LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
  83.     switch (msg) {
  84.     case WM_CREATE:
  85.         UpdateHotkeys(hWnd);
  86.         hFontMain = CreateFont(24, 0, 0, 0, FW_BOLD, 0, 0, 0, 1, 0, 0, 2, 0, L"Microsoft YaHei");
  87.         LoadConfig();
  88.         break;
  89.     case WM_HOTKEY:
  90.         if (wp == 1) {
  91.             if (!g_visible) {
  92.                 UpdateHotkeys(hWnd); LoadConfig();
  93.                 POINT pt; GetCursorPos(&pt);
  94.                 SetWindowPos(hWnd, HWND_TOPMOST, pt.x, pt.y, g_menuWidth, g_menuHeight, SWP_SHOWWINDOW);
  95.                 SetForegroundWindow(hWnd); g_visible = true;
  96.             }
  97.             else { ShowWindow(hWnd, SW_HIDE); g_visible = false; }
  98.         }
  99.         else if (wp == 2) DestroyWindow(hWnd);
  100.         else if (wp == 3) { g_menuHeight += 40; SetWindowPos(hWnd, 0, 0, 0, g_menuWidth, g_menuHeight, SWP_NOMOVE); InvalidateRect(hWnd, 0, 1); }
  101.         else if (wp == 4) { g_menuHeight -= 40; SetWindowPos(hWnd, 0, 0, 0, g_menuWidth, g_menuHeight, SWP_NOMOVE); InvalidateRect(hWnd, 0, 1); }
  102.         break;
  103.     case WM_PAINT: {
  104.         PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps);
  105.         RECT rc; GetClientRect(hWnd, &rc);
  106.         HBRUSH hBr = CreateSolidBrush(RGB(20, 20, 20)); FillRect(hdc, &rc, hBr); DeleteObject(hBr);
  107.         SelectObject(hdc, hFontMain); SetBkMode(hdc, TRANSPARENT);
  108.         int spacing = (g_nodeCount > 1) ? (g_menuHeight - 60) / (g_nodeCount - 1) : 55;
  109.         if (spacing > 60) spacing = 60;
  110.         for (int i = 0; i < g_nodeCount; i++) {
  111.             int x = 30 + (g_nodes[i].level * 40);
  112.             int y = 30 + i * spacing;
  113.             if (g_nodes[i].hIcon) DrawIconEx(hdc, x, y + 4, g_nodes[i].hIcon, 18, 18, 0, 0, 3);
  114.             SetTextColor(hdc, RGB(220, 220, 220));
  115.             TextOut(hdc, x + 25, y, g_nodes[i].name, lstrlen(g_nodes[i].name));
  116.         }
  117.         EndPaint(hWnd, &ps);
  118.     } break;
  119.     case WM_LBUTTONDOWN: {
  120.         int my = HIWORD(lp);
  121.         int spacing = (g_nodeCount > 1) ? (g_menuHeight - 60) / (g_nodeCount - 1) : 55;
  122.         if (spacing > 60) spacing = 60;
  123.         int idx = (my - 20) / spacing;
  124.         if (idx >= 0 && idx < g_nodeCount && g_nodes[idx].path[0]) {
  125.             ShellExecute(NULL, L"open", g_nodes[idx].path, NULL, NULL, SW_SHOWNORMAL);
  126.             ShowWindow(hWnd, SW_HIDE); g_visible = false;
  127.         }
  128.     } break;
  129.     case WM_ACTIVATE: if (LOWORD(wp) == WA_INACTIVE) { ShowWindow(hWnd, SW_HIDE); g_visible = false; } break;
  130.     case WM_DESTROY: PostQuitMessage(0); break;
  131.     default: return DefWindowProc(hWnd, msg, wp, lp);
  132.     }
  133.     return 0;
  134. }

  135. #pragma comment(linker,""/manifestdependency:type='win32' \
  136. name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
  137. processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")

  138. int APIENTRY wWinMain(HINSTANCE hi, HINSTANCE, LPWSTR, int) {
  139.     WNDCLASS wc = { 0 }; wc.lpfnWndProc = WndProc; wc.hInstance = hi; wc.hCursor = LoadCursor(0, IDC_ARROW); wc.lpszClassName = L"TinyML";
  140.     RegisterClass(&wc);
  141.     HWND hwnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW, L"TinyML", L"ML", WS_POPUP, 0, 0, 0, 0, 0, 0, hi, 0);
  142.     MSG msg; while (GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
  143.     return 0;
  144. }
复制代码


回复

使用道具 举报

5#
发表于 昨天 16:07 | 只看该作者
牛逼!
回复

使用道具 举报

6#
发表于 昨天 16:12 | 只看该作者
感谢分享!
回复

使用道具 举报

7#
发表于 昨天 16:15 | 只看该作者
感谢分享!
回复

使用道具 举报

8#
发表于 昨天 16:17 | 只看该作者
VStart撸过...



点评

最多也就用用此等。。冥界至宝PowerPro肯定是没见过。。。更别说深入研究了。。  发表于 昨天 19:06
大神,,这是啥软件啊,分享下呗,谢谢  详情 回复 发表于 昨天 16:43
回复

使用道具 举报

9#
发表于 昨天 16:38 | 只看该作者
支持
回复

使用道具 举报

10#
发表于 昨天 16:43 | 只看该作者

大神,,这是啥软件啊,分享下呗,谢谢

点评

不是有字么,不认识? 二○二六年三月三日  详情 回复 发表于 昨天 16:54
回复

使用道具 举报

11#
发表于 昨天 16:54 | 只看该作者
hhihh 发表于 2026-3-3 16:43
大神,,这是啥软件啊,分享下呗,谢谢

不是有字么,不认识?


二○二六年三月三日
回复

使用道具 举报

12#
发表于 昨天 16:57 | 只看该作者
学习一下
回复

使用道具 举报

13#
发表于 昨天 16:57 | 只看该作者
感谢楼主分享
回复

使用道具 举报

14#
发表于 昨天 17:02 | 只看该作者

感谢楼主分享
回复

使用道具 举报

15#
发表于 昨天 17:03 | 只看该作者

感谢辛苦提供分享!支持一下
回复

使用道具 举报

16#
发表于 昨天 17:42 | 只看该作者
感谢辛苦提供分享!
回复

使用道具 举报

17#
发表于 昨天 18:01 | 只看该作者
感谢您的分享!
回复

使用道具 举报

18#
发表于 昨天 18:06 | 只看该作者
谢谢分享
回复

使用道具 举报

19#
发表于 昨天 19:17 | 只看该作者
有意思
回复

使用道具 举报

20#
发表于 昨天 19:56 | 只看该作者
感谢分享!
回复

使用道具 举报

21#
发表于 昨天 20:07 | 只看该作者
支持原创
回复

使用道具 举报

22#
发表于 昨天 20:08 | 只看该作者
感谢分享!
回复

使用道具 举报

23#
发表于 昨天 21:34 | 只看该作者
感谢分享,小巧实用
回复

使用道具 举报

24#
发表于 昨天 22:32 | 只看该作者
感谢分享,楼主辛苦了!
回复

使用道具 举报

25#
发表于 昨天 22:40 | 只看该作者
感谢分享
回复

使用道具 举报

26#
发表于 昨天 22:58 | 只看该作者
围观
回复

使用道具 举报

27#
发表于 昨天 23:54 | 只看该作者
学习一下
回复

使用道具 举报

28#
发表于 28 分钟前 | 只看该作者
感谢分享
回复

使用道具 举报

29#
发表于 40 秒前 | 只看该作者
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2026-3-4 00:38

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表