R
Rune Jacobsen
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("MyApp");
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
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("MyApp");
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