Click here to Skip to main content
Click here to Skip to main content

A service that displays an icon in the system tray

By , 17 Jan 2000
 
  • Download demo executable - 7 Kb
  • Download source files - 13 Kb
  • 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

    About the Author

    Bruno Vais
    United States United States
    Member
    No Biography provided

    Sign Up to vote   Poor Excellent
    Add a reason or comment to your vote: x
    Votes of 3 or less require a comment

    Comments and Discussions

     
    You must Sign In to use this message board.
    Search this forum  
        Spacing  Noise  Layout  Per page   
    GeneralRe: createinstancememberrana7421 Aug '06 - 21:04 
    Hi Sukanta ,
    I am facing a similar problem as this .
    Were you able to resolve this?Can you give some idea?
    GeneralPrivilegesmemberbruno leclerc2 Dec '02 - 22:10 
    If i want do create the service with a privileged domain user account,
    it can't interact with the desktop.
    how can we solve this ?
    GeneralI have problem of Interactive ServicesussAnonymous1 Sep '02 - 15:29 
    My service is based on MFC Dialog. I can show a system tray icon when I login. But I find a strange problem. When I logoff then re-login. The service works great. But if I logoff again, win2000 will not logoff? The problem comes from my interactive service. Because if I close it, win2000 works normaly.
     
    Any NT service expert help me ?
    GeneralRe: I have problem of Interactive ServicesussAnonymous23 Oct '02 - 7:05 
    Hey buddy, when the win2k logs off, it sends WM_QUERYEND to all the applications running. If ur application has to allow the OS to logoff successfully then it has to return 1 in the queryendmessage message handler, u can check more on this on MSDN with a key search WM_QUERYEND.
    Hope that helps!!!
    GeneralRe: I have problem of Interactive ServicememberPeter Husemann23 Jan '04 - 4:19 
    See Page "Logoff Events" under "Window Stations and Desktops" in the MSDN Library.
    GeneralRe: I have problem of Interactive Servicememberskjacob28 Sep '05 - 1:56 
    Any solution for this???
    GeneralIcon did not appear!!sussAnonymous24 Jul '02 - 1:48 
    when I install iconservice Nothing happen!!!!!!!
    GeneralRe: Icon did not appear!!memberKhumpty15 Jul '03 - 9:13 
    Me either..what am i doing wrong?!Confused | :confused:
    GeneralCreateProcessmemberSarun8 Mar '02 - 20:13 
    I would like to execute a ".jar" file in Start Service, i used CreateProcess Method but it didn't executed..but if i'm giving a ".exe" file instead of ".jar" file then the command is executed properly and window is displayed..Please advice
    GeneralRe: CreateProcesssussTamer Mash29 Apr '03 - 2:23 
    You need to use ShellExecute() with "open" for the verd in order to open a non-exe file with its associated program.

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

    Permalink | Advertise | Privacy | Mobile
    Web01 | 2.6.130523.1 | Last Updated 18 Jan 2000
    Article Copyright 2000 by Bruno Vais
    Everything else Copyright © CodeProject, 1999-2013
    Terms of Use
    Layout: fixed | fluid