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





4.00/5 (8投票s)
2000年1月18日

207463

5161
本文演示了一个使用系统托盘与用户交互的服务。
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
替换为其他内容。