473,473 Members | 1,484 Online
Bytes | Software Development & Data Engineering Community
Create Post

Home Posts Topics Members FAQ

Finding a running instance of my app

Hey all,

Maybe someone knows this problem; I have a C# WinForms app that every
now and then has a new version that I deploy to my users using an
installation script written with the NSIS installer. To improve on this,
I want the installer to shut down any running instances of my
application when it does the installation.

To do this, I have implemented the following function to kill any
instances I find (yeah, I have the pinvoke for PostMessage and the other
functions right):

(Sorry if the posted code comes out wrong)

System.Diagnostics.Process[] myProcesses;
myProcesses = System.Diagnostics.Process.GetProcessesByName("MyA pp");
foreach (System.Diagnostics.Process instance in myProcesses)
{
if( instance.MainWindowHandle == (System.IntPtr)0 )
{
IntPtr h = IntPtr.Zero;
int tid;
int pid;
do
{
pid = 0;
// get the window handle
h = FindWindowEx(IntPtr.Zero, h, null, null);
// get the process id (and thread id)
tid = GetWindowThreadProcessId(h, out pid);
if (pid == instance.Id)
{
PostMessage( h, 0x11, 0, 0 );
break;
}
} while( !h.Equals(IntPtr.Zero) );
}
else
PostMessage( instance.MainWindowHandle, 0x11, 0, 0 );
}

This is partially based on something I found on the web.

It fine if the Window of the application is open - then
instance.MainWindowHandle is ok, and the shutdown message works fine (I
used this because this is a systray based app, closing the Window does
nothing, but 0x11 is what Windows uses to shut down the app when the
system is going down, I figure I can use this for my own shutdown as
well). So that is no problem. If the user minimizes the application, the
window is hidden - in that case, it loops trough all the windows, and
sends the 0x11 message to any windows it finds that belongs to the found
process ID.

However, one thing that doesn't work, is if the main window of the
application is closed, and other windows are open - then
MainWindowHandle will return 0, AND the code above will not find any
windows owned by the process. Thus I can not post the message, and
nothing will happen.

Having the main window of my app closed while other of it's windows are
open isn't an uncommon situation with this program, so my question is -
does anyone know what to do? Why is the window not "existing" and owned
by the correct process when another window has been opened?

Any insight will be highly appreciated!

Thanks,

Rune
Jan 6 '06 #1
3 5920
Rune,

I wouldn't do it this way at all.

What I would do is make a call to RegisterWindowMessage in your
application. This will allow you to pass a string to the function, and get
a windows message id which is unique throughout the system.

You would store this in your app, and then override the WndProc method
to check against that message id. If you get it, you simply exit the
application (calling Application.Exit should do the trick).

Then, in your update program, you would call PostMessage, passing the
HWND_BROADCAST constant for the window handle. This will cause the message
to be sent to all top level windows. Other applications will ignore the
message, because they dont know how to interpret it (assuming that they play
nice and call RegisterWindowsMessage to create their message ids). Your
app, however, will know what to do.

You just have to call RegistrWindowMessage in your update app with the
same string to indicate the message to send.

Hope this helps.
--
- Nicholas Paldino [.NET/C# MVP]
- mv*@spam.guard.caspershouse.com

"Rune Jacobsen" <rune.jacobsen@no_spam.broadpark.no> wrote in message
news:43********@news.broadpark.no...
Hey all,

Maybe someone knows this problem; I have a C# WinForms app that every now
and then has a new version that I deploy to my users using an installation
script written with the NSIS installer. To improve on this, I want the
installer to shut down any running instances of my application when it
does the installation.

To do this, I have implemented the following function to kill any
instances I find (yeah, I have the pinvoke for PostMessage and the other
functions right):

(Sorry if the posted code comes out wrong)

System.Diagnostics.Process[] myProcesses;
myProcesses = System.Diagnostics.Process.GetProcessesByName("MyA pp");
foreach (System.Diagnostics.Process instance in myProcesses)
{
if( instance.MainWindowHandle == (System.IntPtr)0 )
{
IntPtr h = IntPtr.Zero;
int tid;
int pid;
do
{
pid = 0;
// get the window handle
h = FindWindowEx(IntPtr.Zero, h, null, null);
// get the process id (and thread id)
tid = GetWindowThreadProcessId(h, out pid);
if (pid == instance.Id)
{
PostMessage( h, 0x11, 0, 0 );
break;
}
} while( !h.Equals(IntPtr.Zero) );
}
else
PostMessage( instance.MainWindowHandle, 0x11, 0, 0 );
}

This is partially based on something I found on the web.

It fine if the Window of the application is open - then
instance.MainWindowHandle is ok, and the shutdown message works fine (I
used this because this is a systray based app, closing the Window does
nothing, but 0x11 is what Windows uses to shut down the app when the
system is going down, I figure I can use this for my own shutdown as
well). So that is no problem. If the user minimizes the application, the
window is hidden - in that case, it loops trough all the windows, and
sends the 0x11 message to any windows it finds that belongs to the found
process ID.

However, one thing that doesn't work, is if the main window of the
application is closed, and other windows are open - then MainWindowHandle
will return 0, AND the code above will not find any windows owned by the
process. Thus I can not post the message, and nothing will happen.

Having the main window of my app closed while other of it's windows are
open isn't an uncommon situation with this program, so my question is -
does anyone know what to do? Why is the window not "existing" and owned by
the correct process when another window has been opened?

Any insight will be highly appreciated!

Thanks,

Rune

Jan 6 '06 #2

"Rune Jacobsen" <rune.jacobsen@no_spam.broadpark.no> wrote in message
news:43********@news.broadpark.no...
Hey all,

Maybe someone knows this problem; I have a C# WinForms app that every now
and then has a new version that I deploy to my users using an installation
script written with the NSIS installer. To improve on this, I want the
installer to shut down any running instances of my application when it
does the installation.

To do this, I have implemented the following function to kill any
instances I find (yeah, I have the pinvoke for PostMessage and the other
functions right):

(Sorry if the posted code comes out wrong)

System.Diagnostics.Process[] myProcesses;
myProcesses = System.Diagnostics.Process.GetProcessesByName("MyA pp");
foreach (System.Diagnostics.Process instance in myProcesses)
{
if( instance.MainWindowHandle == (System.IntPtr)0 )
{
IntPtr h = IntPtr.Zero;
int tid;
int pid;
do
{
pid = 0;
// get the window handle
h = FindWindowEx(IntPtr.Zero, h, null, null);
// get the process id (and thread id)
tid = GetWindowThreadProcessId(h, out pid);
if (pid == instance.Id)
{
PostMessage( h, 0x11, 0, 0 );
break;
}
} while( !h.Equals(IntPtr.Zero) );
}
else
PostMessage( instance.MainWindowHandle, 0x11, 0, 0 );
}

This is partially based on something I found on the web.

It fine if the Window of the application is open - then
instance.MainWindowHandle is ok, and the shutdown message works fine (I
used this because this is a systray based app, closing the Window does
nothing, but 0x11 is what Windows uses to shut down the app when the
system is going down, I figure I can use this for my own shutdown as
well). So that is no problem. If the user minimizes the application, the
window is hidden - in that case, it loops trough all the windows, and
sends the 0x11 message to any windows it finds that belongs to the found
process ID.

However, one thing that doesn't work, is if the main window of the
application is closed, and other windows are open - then MainWindowHandle
will return 0, AND the code above will not find any windows owned by the
process. Thus I can not post the message, and nothing will happen.

Having the main window of my app closed while other of it's windows are
open isn't an uncommon situation with this program, so my question is -
does anyone know what to do? Why is the window not "existing" and owned by
the correct process when another window has been opened?

Any insight will be highly appreciated!


I have seen many examples of how to implement a single instance application
and they all use remoting to look for the running instance and tell it what
to do. Of course in this case they pass it a new file or some such but they
could just as easily tell it to shut down.

Can't remember the details because I don't use remoting much but it was v.
v. simple

Jan 6 '06 #3
Nicholas Paldino [.NET/C# MVP] wrote:
Rune,

I wouldn't do it this way at all.

What I would do is make a call to RegisterWindowMessage in your
application. This will allow you to pass a string to the function, and get
a windows message id which is unique throughout the system.

[snip]
Hope this helps.


It did indeed! Thanks for very valuable input! The application now shuts
down no matter what kind of state it is in when the message comes!

You just earned yourself a "thank you" in the about box! :)

Rune
Jan 8 '06 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Skip Montanaro | last post by:
At work we have a package structure for our homegrown code. Developers each have their own sandboxes where they work on the stuff they are responsible for (mixtures of C++ libraries, SWIG wrappers...
5
by: Scott McNair | last post by:
Hi, I'm writing an ASP page that will analyze the logfiles and return statistical information. I'd like to make this app so that I could drop it into any of my webservers and get the logs for...
1
by: Bruce | last post by:
I am writing an installer that needs to put a dll file with a bunch of extended stored procedures in the BINN directory. The problem is that if the machine is running multiple instances of SQL...
3
by: Tim | last post by:
Hello Everyone I'd like to create a script/program that can locate all servers running DB2, finding out which instances are running/created and what databases are running under them but have...
3
by: John Veldthuis | last post by:
I am trying to find instances of all the SQL servers on the local network including the machine it is running from. The servers will be a mix of SQL2000 and SQL2005 once it is ready. I have been...
3
by: Michel | last post by:
Hi, I wrote an app in .Net and I whant only 1 instance of this app open for the user; the user open my app, do some works and try to open another instance of my app, I whant to show a message to...
3
by: Rico | last post by:
Hello, I have a generic process that logs errors from different sources. When I call this code, I'd like to also submit the name of the function or sub that is raising the error without having...
7
by: Brad Baker | last post by:
I am trying to programmatically set a placeholder control in csharp which is nested inside a repeater control between <ItemTemplateand </ItemTemplate> tags, however I am running into problems. I've...
7
by: joproulx | last post by:
Hi, I was wondering if there was a way with Reflection to find dynamically if an object was referencing indirectly another object. A simple example would be: Object1 | --Object2 |
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
1
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
1
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
0
muto222
php
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.