Click here to Skip to main content
Click here to Skip to main content
Go to top

A service that displays an icon in the system tray

, 17 Jan 2000
Rate this:
Please Sign up or sign in to vote.
This article demonstrates a service that uses the system tray to interact with the user.
  • Download demo executable - 7 Kb
  • Download source files - 13 Kb
  • <!-- Article Starts -->

    IconService is a Win32 console app that displays an icon in the system tray. The service can be installed/removed from the prompt: "IconService -install" , "IconService -remove", and started from the control panel (the "Services" icon). In order to display something from a service you must allow it to interact with the desktop. This can be done by specifying the SERVICE_INTERACTIVE_PROCESS switch when creating the service:

    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 creates an event used later for stopping the service, and a thread that is responsible for the icon's parent. Here I use an old trick to prevent the dialog from appearing in the task bar. First I create a modeless dialog with the WS_VISIBLE not checked:

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

    and than I create the icon's parent:

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

    To hide this one:

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

    The DialogProc is quite simple. It creates the icon, and on RBCLK it displays a menu to stop the service. ServiceStop sets the event created by ServiceStart and deletes the icon.

    The heart of the service is in the ServiceStart function. So if you want your service to actually do something after creating the icon, replace the WaitForSingleObject with something else.

    License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here

    Share

    About the Author

    Bruno Vais

    United States United States
    No Biography provided

    Comments and Discussions

     
    QuestionHow about terminal services? Pinmemberz161669-Feb-06 15:21 
    GeneralOffical way to add a description to a service Pinmembernapalm2k10-Sep-05 10:26 
    GeneralCannot Get System Started Automatically Pinmemberenjewneer3-Dec-04 2:34 
    Generalremoving args Pinmemberspicy_kid200018-Mar-04 16:38 
    Generalrunning my routine Pinmemberrapace29-Oct-03 13:24 
    QuestionWhy I can't modify the icon? Pinmemberakingnika5-Sep-03 1:20 
    AnswerRe: Why I can't modify the icon? Pinmemberakingnika7-Sep-03 16:39 
    GeneralNot a good practice (in general) PinmemberSardaukar18-Aug-03 22:07 
    GeneralRe: Not a good practice (in general) Pinmembermilkyhonglee12-Mar-06 5:34 
    Generalcreateinstance PinmemberSukanta Kumar Dash26-Jan-03 21:02 
    long dd=m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));
    does not work in services.
    it gives an error msg "Class not Registered"
     
    If i run this statement from an application in nt then it works.

    GeneralRe: createinstance Pinmemberrana7421-Aug-06 21:04 
    GeneralPrivileges Pinmemberbruno leclerc2-Dec-02 22:10 
    GeneralI have problem of Interactive Service PinsussAnonymous1-Sep-02 15:29 
    GeneralRe: I have problem of Interactive Service PinsussAnonymous23-Oct-02 7:05 
    GeneralRe: I have problem of Interactive Service PinmemberPeter Husemann23-Jan-04 4:19 
    GeneralRe: I have problem of Interactive Service Pinmemberskjacob28-Sep-05 1:56 
    GeneralIcon did not appear!! PinsussAnonymous24-Jul-02 1:48 
    GeneralRe: Icon did not appear!! PinmemberKhumpty15-Jul-03 9:13 
    GeneralCreateProcess PinmemberSarun8-Mar-02 20:13 
    GeneralRe: CreateProcess PinsussTamer Mash29-Apr-03 2:23 
    AnswerRe: CreateProcess PinmemberProfessorF7-Oct-07 13:31 
    GeneralDo i have to remove the icon when the user logs out PinmemberWeberMenschi20-Dec-01 9:24 
    GeneralRe: Do i have to remove the icon when the user logs out PinsussTamer Mash29-Apr-03 2:29 
    GeneralAdd icon on "Taskbar Creation" PinmemberDerius1-Nov-01 11:33 
    GeneralRe: Add icon on "Taskbar Creation" PinmemberPaul Hunter22-Nov-01 23:18 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

    | Advertise | Privacy | Mobile
    Web04 | 2.8.140916.1 | Last Updated 18 Jan 2000
    Article Copyright 2000 by Bruno Vais
    Everything else Copyright © CodeProject, 1999-2014
    Terms of Service
    Layout: fixed | fluid