65.9K
CodeProject 正在变化。 阅读更多。
Home

一个显示系统托盘图标的服务

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (8投票s)

2000年1月18日

viewsIcon

207463

downloadIcon

5161

本文演示了一个使用系统托盘与用户交互的服务。

  • 下载演示可执行文件 - 7 Kb
  • 下载源代码文件 - 13 Kb
  • IconService 是一个 Win32 控制台应用程序,它在系统托盘中显示一个图标。该服务可以从提示符安装/删除:“IconService -install”,“IconService -remove”,并从控制面板(“服务”图标)启动。为了从服务中显示内容,您必须允许它与桌面交互。这可以通过在创建服务时指定 SERVICE_INTERACTIVE_PROCESS 选项来实现。

    schService = CreateService(
                schSCManager,               // SCManager database
                TEXT(SZSERVICENAME),        // name of service
                TEXT(SZSERVICEDISPLAYNAME), // name to display
                SERVICE_ALL_ACCESS,         // desired access
                SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS ,  // service type
                SERVICE_DEMAND_START,       // start type
                SERVICE_ERROR_NORMAL,       // error control type
                szPath,                     // service's binary
                NULL,                       // no load ordering group
                NULL,                       // no tag identifier
                TEXT(SZDEPENDENCIES),       // dependencies
                NULL,                       // LocalSystem account
                NULL);                      // no password
    

    ServiceStart 创建一个事件,稍后用于停止服务,以及一个负责图标父窗口的线程。这里我使用一个老技巧来防止对话框出现在任务栏中。首先,我创建一个模式对话框,并且不选中 WS_VISIBLE

    HWND hwnd = CreateDialog(NULL, MAKEINTRESOURCE(IDD_DIALOG1), NULL, NULL);

    然后我创建图标的父窗口

    DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DialogProc);

    为了隐藏这个窗口

    SetWindowPos(hwndDlg, NULL, -10,-10,0,0, SWP_NOZORDER|SWP_NOMOVE);

    DialogProc 非常简单。它创建图标,并在 RBCLK 上显示一个菜单来停止服务。ServiceStop 设置由 ServiceStart 创建的事件并删除图标。

    服务的核心在于 ServiceStart 函数。因此,如果您希望您的服务在创建图标后实际执行某些操作,请将 WaitForSingleObject 替换为其他内容。

    © . All rights reserved.