📜  电子-系统托盘(1)

📅  最后修改于: 2023-12-03 14:56:25.249000             🧑  作者: Mango

电子-系统托盘

电子-系统托盘通常是一种显示在计算机操作系统的任务栏或启动器上的小图标。它们用于显示应用程序的状态,提供一些快捷操作,例如退出应用程序或打开主要窗口。在本文中,我们将探讨一些与电子-系统托盘相关的主题。

托盘的历史和用途

电子-系统托盘源自于早期操作系统的图标通知区域。Windows 95是第一个引入托盘的操作系统,它用于显示系统图标和小工具。托盘很快成为了每个桌面应用程序必不可少的一部分,因为它允许应用程序保持运行,同时最小化到系统托盘中,以节省屏幕空间。

今天,在计算机操作系统中,电子-系统托盘被广泛用于以下几个方面:

  • 显示程序的状态和提供快捷操作
  • 支持桌面通知和弹出通知
  • 提供桌面快捷操作 (例如,点击一次打开应用程序、双击打开某个功能、右键单击打开上下文菜单等)
电子-系统托盘如何工作

电子-系统托盘的原理比较简单,它们本质上是一个通知区域的图标。托盘图标是一段可执行代码,该代码在Windows操作系统上运行,不断在其窗口消息循环中处理各种事件。例如,当用户单击托盘图标时,代码会响应单击事件并调用相应的函数。

与更复杂的应用程序相比,系统托盘通常是比较简单的应用程序,并可以轻松部署和维护。一些托盘程序如网络状态检测、天气预报、RSS阅读器等,我们日常生活中都会用到。

如何开发电子-系统托盘

开发电子-系统托盘会涉及到操作系统特定的API以及GUI框架。在Windows操作系统中,托盘程序需要使用WinAPI或类库,例如QT等。以下是编写Windows托盘应用程序的示例代码:

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  MSG msg;
  HWND hwnd;
  WNDCLASS wc;
  
  ZeroMemory(&wc, sizeof(wc));
  wc.lpfnWndProc   = WndProc;
  wc.hInstance     = hInstance;
  wc.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
  wc.lpszClassName = "MyTrayApp";
  RegisterClass(&wc);
  
  hwnd = CreateWindow("MyTrayApp", NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
  
  if (!hwnd) {
    return 0;
  }
  
  NOTIFYICONDATA nIconData;
  ZeroMemory(&nIconData, sizeof(NOTIFYICONDATA));
  nIconData.cbSize = sizeof(NOTIFYICONDATA);
  nIconData.hWnd   = hwnd;
  nIconData.uID    = 0;
  nIconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  nIconData.uCallbackMessage = WM_USER;
  nIconData.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYTRAYAPP));
  lstrcpy(nIconData.szTip, "My Tray App");
  
  Shell_NotifyIcon(NIM_ADD, &nIconData);
  
  while (GetMessage(&msg, NULL, 0, 0) > 0) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  
  return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
  switch (message) {
    case WM_USER:
      if (LOWORD(lParam) == WM_RBUTTONUP) {//右键单击
        HMENU hPopup = CreatePopupMenu();
        AppendMenu(hPopup, MF_STRING, ID_TRAY_OPEN, "Open");
        AppendMenu(hPopup, MF_STRING, ID_TRAY_ABOUT, "About");
        AppendMenu(hPopup, MF_SEPARATOR, 0, NULL);
        AppendMenu(hPopup, MF_STRING, ID_TRAY_EXIT, "Exit");

        POINT pt;
        GetCursorPos(&pt);

        SetForegroundWindow(hWnd);
        TrackPopupMenu(hPopup, TPM_RIGHTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hWnd, NULL);
        PostMessage(hWnd, WM_NULL, 0, 0);//清楚菜单操作
      }
      break;
    default:
      break;
  }
}
结论

电子-系统托盘是一种重要的应用程序类型它可以轻松地向你提供实时通知和快捷操作。尽管开发这种应用程序需要学习操作系统特定的API和GUI框架,但一旦掌握,它们可以方便地优化用户工作流程和增强用户体验。