diff --git a/CMakeLists.txt b/CMakeLists.txt index 4338301..d486685 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ file(GLOB SRC ${IMGUI_DIR}/misc/cpp/*.cpp app/src/*.* main.cpp + ) @@ -63,7 +64,7 @@ if(IMGUI_BACKENDS STREQUAL "win32_dx11") endif() # generate binary -add_executable(${PROJECT_NAME} WIN32 ${SRC} ${PLATFORM_SRC}) +add_executable(${PROJECT_NAME} WIN32 ${SRC} ${PLATFORM_SRC} logo.rc) if(IMGUI_BACKENDS STREQUAL "glfw_opengl") target_link_libraries(${PROJECT_NAME} diff --git a/app/inc/TrayIcon.h b/app/inc/TrayIcon.h index f4286d5..6bc6b66 100644 --- a/app/inc/TrayIcon.h +++ b/app/inc/TrayIcon.h @@ -35,12 +35,18 @@ public: // 设置回调函数 void SetShowWindowCallback(const ShowWindowCallback &callback); void SetExitCallback(const ExitCallback &callback); + enum class NotifyAction { + Notify_NONE, + Notify_INFO, + Notify_WARNING, + Notify_ERROR, + Notify_USER + }; + #ifdef _WIN32 - void ShowWindowsNotification(const std::wstring& title, const std::wstring& message); -#elif __APPLE__ - void ShowMacNotification(const std::string& title, const std::string& message); + void ShowNotification(const std::wstring &title, const std::wstring &message, NotifyAction notify= NotifyAction::Notify_INFO) const; #else - void ShowLinuxNotification(const std::string& title, const std::string& message); + void ShowNotification(const std::string& title, const std::string& message, NotifyAction notify= NotifyAction::Notify_INFO); #endif private: void CreateMenu(); diff --git a/app/src/CLIProcess.cpp b/app/src/CLIProcess.cpp index 90abb12..def8da0 100644 --- a/app/src/CLIProcess.cpp +++ b/app/src/CLIProcess.cpp @@ -503,7 +503,6 @@ void CLIProcess::Start(const std::string& command) { if (result) { AddLog("进程已启动: " + command + " PID: " + std::to_string(pi_.dwProcessId)); - CloseHandle(hWritePipe_); CloseHandle(hReadPipe_stdin_); hWritePipe_ = nullptr; diff --git a/app/src/Manager.cpp b/app/src/Manager.cpp index 5852bf4..4728f2c 100644 --- a/app/src/Manager.cpp +++ b/app/src/Manager.cpp @@ -6,6 +6,7 @@ #include "imgui_internal.h" +#include "resource.h" #include "Units.h" Manager::Manager() = default; @@ -126,6 +127,7 @@ bool Manager::Initialize() { m_app_state.cli_process.Start(m_app_state.command_input); m_app_state.show_main_window = false; HideMainWindow(); + m_tray->ShowNotification(L"CLI自启动",StringToWide(m_app_state.command_input) + L"\n当前状态:" + (m_app_state.cli_process.IsRunning() ? L"运行中" : L"已停止")); } m_tray->UpdateStatus(m_app_state.cli_process.IsRunning() ? L"运行中" : L"已停止", m_app_state.cli_process.GetPid()); m_initialized = true; @@ -487,9 +489,11 @@ void Manager::RenderStatusMessages() { } ImGui::End(); + m_save_success_timer -= ImGui::GetIO().DeltaTime; if (m_save_success_timer <= 0.0f) { m_show_save_success = false; + m_tray->ShowNotification(L"CLI_Manager",L"当前布局保存成功!"); } } @@ -503,13 +507,14 @@ void Manager::RenderStatusMessages() { ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::TextColored(ImVec4(0.0f, 1.0f, 0.0f, 1.0f), "布局已加载"); + } ImGui::End(); m_load_success_timer -= ImGui::GetIO().DeltaTime; if (m_load_success_timer <= 0.0f) { m_show_load_success = false; + ImGui::TextColored(ImVec4(0.0f, 1.0f, 0.0f, 1.0f), "布局已加载"); } } @@ -529,6 +534,7 @@ void Manager::RenderStatusMessages() { m_theme_save_success_timer -= ImGui::GetIO().DeltaTime; if (m_theme_save_success_timer <= 0.0f) { m_show_theme_save_success = false; + m_tray->ShowNotification(L"CLI_Manager",L"当前主题保存成功!"); } } @@ -836,6 +842,7 @@ void Manager::RenderControlPanel(float buttonWidth, float buttonHeight, float in m_app_state.AddCommandToHistory(m_app_state.command_input); m_tray->UpdateStatus(m_app_state.cli_process.IsRunning() ? L"运行中" : L"已停止", m_app_state.cli_process.GetPid()); + m_tray->ShowNotification(L"CLI_Manager",m_app_state.cli_process.IsRunning() ? L"重启成功!" : L"重启失败!"); } } @@ -868,7 +875,7 @@ void Manager::RenderCommandPanel(float buttonWidth, float inputWidth) { // 显示发送状态 if (!m_app_state.cli_process.IsRunning()) { - ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "提示: 程序未运行,无法发送命令"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 0.6f), "提示: 程序未运行,无法发送命令"); } } @@ -1096,7 +1103,12 @@ bool Manager::InitializeTray() { return false; } - HICON trayIcon = LoadIcon(NULL, IDI_APPLICATION); + // 加载自定义图标 + HICON trayIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)); + if (!trayIcon) { + // 如果加载失败,使用默认图标 + trayIcon = LoadIcon(NULL, IDI_APPLICATION); + } m_tray = std::make_unique(m_tray_hwnd, trayIcon); // 设置托盘窗口的用户数据,指向TrayIcon实例 diff --git a/app/src/TrayIcon.cpp b/app/src/TrayIcon.cpp index 9202d24..2275113 100644 --- a/app/src/TrayIcon.cpp +++ b/app/src/TrayIcon.cpp @@ -77,16 +77,16 @@ void TrayIcon::SetExitCallback(const ExitCallback &callback) { } #ifdef _WIN32 -void TrayIcon::ShowWindowsNotification(const std::wstring &title, const std::wstring &message) { +void TrayIcon::ShowNotification(const std::wstring &title, const std::wstring &message, NotifyAction notify) const { NOTIFYICONDATA nid = m_nid; nid.uFlags |= NIF_INFO; wcsncpy_s(nid.szInfoTitle, title.c_str(), _TRUNCATE); wcsncpy_s(nid.szInfo, message.c_str(), _TRUNCATE); - nid.dwInfoFlags = NIIF_INFO; // 信息图标,可选 NIIF_WARNING, NIIF_ERROR + nid.dwInfoFlags = static_cast(notify); // 信息图标,可选 NIIF_WARNING, NIIF_ERROR Shell_NotifyIcon(NIM_MODIFY, &nid); } #elif __APPLE__ -void TrayIcon::ShowMacNotification(const std::string &title, const std::string &message) +void TrayIcon::ShowNotification(const std::string &title, const std::string &message) { // 通过 AppleScript 或 Objective-C 桥接 std::string script = "display notification \"" + message + "\" with title \"" + title + "\""; @@ -94,7 +94,7 @@ void TrayIcon::ShowMacNotification(const std::string &title, const std::string & system(cmd.c_str()); } #else -void TrayIcon::ShowLinuxNotification(const std::string &title, const std::string &message) +void TrayIcon::ShowNotification(const std::string &title, const std::string &message) { // 使用 notify-send 命令 std::string cmd = "notify-send \"" + title + "\" \"" + message + "\""; diff --git a/logo.ico b/logo.ico new file mode 100644 index 0000000..363af4c Binary files /dev/null and b/logo.ico differ diff --git a/logo.rc b/logo.rc new file mode 100644 index 0000000..392183a --- /dev/null +++ b/logo.rc @@ -0,0 +1,2 @@ +#include "app/inc/resource.h" +IDI_ICON1 ICON DISCARDABLE "logo.ico"