Windows service with icon on taskbar

J

juliashah

I've developed a windows service that monitors the database and shows
icon of a different color depending on the data. To be able to show an
icon I have to select the "Allow service to interact with desktop"
checkbox on the service, and when I do it manually, the icon shows just
fine.

But I want the users to double-click the installation file and not have
to go to the Services and select the checkbox. So I used this example
http://www.codeproject.com/csharp/CsWindowsServiceDesktop.asp to check
the checkbox programmatically. I found out that it selected the
checkbox, but the icon still doesn't show. But if I go and manually
deselect and select the checkbox, it starts working. So I figured that
piece of code in the example does select the checkbox, but does not
really change the property of the service.

I also tried this:
ServiceController sc = new ServiceController("MyServiceName");
sc.ServiceType = ServiceType.InteractiveProcess;

but got an error message:
Property or indexer
'System.ServiceProcess.ServiceController.ServiceType' cannot be
assigned to -- it is read only.

So I am wondering if there is any way to allow a service to interact
with desktop programmatically. Would appreciate any help.
 
N

Nicholas Paldino [.NET/C# MVP]

Julia,

The article that you referenced should be disregarded.

Services should never be set to interact with the desktop. You can not
always assume that there is an interactive user session to work with.

What you should do is have your service expose a remoting endpoint, and
then have an application that runs in the tray that makes calls to the
service through remoting to get/set information and receive feedback.

You can then have this program run on startup so that it is launched
when a user logs in.

Hope this helps.
 
M

Michael Nemtsev

Hello (e-mail address removed),

The whole approach is wrong. You should avoid comunication with desktom from
the service.
Service and UI are 2 different things. Service started before user logon
and works in the different security context.

Moreover, in the Windows Vista you have no access to the "Allow service to
interact with desktop" at all.

You need to use some IPC approach to interact with your service from UI.
You can use Pipes, Sockets, Remoting, SOAP, DCOM - everything that suitable
in your case
I've developed a windows service that monitors the database and shows
icon of a different color depending on the data. To be able to show an
icon I have to select the "Allow service to interact with desktop"
checkbox on the service, and when I do it manually, the icon shows
just fine.

But I want the users to double-click the installation file and not
have to go to the Services and select the checkbox. So I used this
example http://www.codeproject.com/csharp/CsWindowsServiceDesktop.asp
to check the checkbox programmatically. I found out that it selected
the checkbox, but the icon still doesn't show. But if I go and
manually deselect and select the checkbox, it starts working. So I
figured that piece of code in the example does select the checkbox,
but does not really change the property of the service.

I also tried this:
ServiceController sc = new ServiceController("MyServiceName");
sc.ServiceType = ServiceType.InteractiveProcess;
but got an error message:
Property or indexer
'System.ServiceProcess.ServiceController.ServiceType' cannot be
assigned to -- it is read only.
So I am wondering if there is any way to allow a service to interact
with desktop programmatically. Would appreciate any help.
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsch
 
J

juliashah

Thanks for quick reply, guys.

Ok, I guess my whole approach is wrong. It doesn't have to be a
service. What I need is some kind of program that starts when a user
logs in, it should run in the background and check the database once in
a while. When a certain data appears in the database, an icon on a
taskbar should change. So what is the easiest way to do it?
 
M

Michael Nemtsev

Hello (e-mail address removed),
Thanks for quick reply, guys.

Ok, I guess my whole approach is wrong. It doesn't have to be a
service. What I need is some kind of program that starts when a user
logs in, it should run in the background and check the database once
in a while. When a certain data appears in the database, an icon on a
taskbar should change. So what is the easiest way to do it?

Any app that will start from the Autorun folder

---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsch
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top