We help IT Professionals succeed at work.

Killing a process when user invokes shutdown or log off - Urgent

posae asked
Medium Priority
Last Modified: 2010-04-24

I have an app that is running upon startup.  When the user shuts down the system or logs off, i get the "End Now" message to kill the process.  

Is there any registry entry that I can add upon install of the app so that when the user logs off or shuts down, it kills the process?

Thanks Experts

Watch Question

How about installing the application as a Windows Service?


It is a little trickier than that as the program requires username/password that the user enters upon startup at log-on time.
Sorry, slightly short and sweet reply there :)

Is your application a Windows Forms application or a Console application?  Converting it to a service isn't that much of a chore really and would probably be better in the long run.

That way, when the computer starts up, your application will startup in the background and, when it shuts down, Windows will terminate it automatically, with no fuss.

That's assuming you have the ability to create a windows service with your version of Visual Studio ;)
Ah, sorry, posted my 2nd comment before seeing your addition there
Look at help on the SessionEnding event.  There's an example of how to trap this, and then you could just have your app close.

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts
Just had a look into Mastoo's solution and he is a god :)  I didn't realise that the functionality existed in .NET but, now I do I plan to make full use of it myself.

Here's an example on MSDN on the use of the SessionEnding event.  Please though, if you do use this, give Mastoo the accepted solution.  I just googled SessionEnding, which isn't an answer from me at all :) Mastoo came up with the idea and deserves the credit



Thanks for your help guys...I have been a little busy up until now but I will get to it ASAP and then go from there.  I appreciate your time.


For some reason, the program is not trapping the shutdown.  Here is my code

Imports Microsoft.Win32
Public Class dsTokProcessorInfo
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()

        'This call is required by the Windows Form Designer.

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
            End If
        End If
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    Friend WithEvents NotifyIcon1 As System.Windows.Forms.NotifyIcon
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.components = New System.ComponentModel.Container
        Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(dsTokProcessorInfo))
        Me.NotifyIcon1 = New System.Windows.Forms.NotifyIcon(Me.components)
        Me.NotifyIcon1.Icon = CType(resources.GetObject("NotifyIcon1.Icon"), System.Drawing.Icon)
        Me.NotifyIcon1.Text = "docusyst Processor"
        Me.NotifyIcon1.Visible = True
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 173)
        Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
        Me.Name = "dsTokProcessorInfo"
        Me.Text = "dsTokProcessorInfo"
        Me.TopMost = True
        Me.WindowState = System.Windows.Forms.FormWindowState.Minimized

    End Sub

#End Region

    Private Sub dsTokProcessorInfo_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler SystemEvents.SessionEnding, AddressOf OnShuttingdown
        AddHandler SystemEvents.SessionEnded, AddressOf OnShutdown

        Dim endsessionHandler As SessionEndedEventHandler
        AddHandler SystemEvents.SessionEnded, endsessionHandler


    End Sub

    Public Shared Sub OnShuttingdown(ByVal sender As Object, ByVal e As SessionEndingEventArgs)
            msgbox("Shutting Down")      
    End Sub

    Public Shared Sub OnShutdown(ByVal sender As Object, ByVal e As SessionEndedEventArgs)
            msgbox("Shut Down")
    End Sub

Let me change my answer slightly.  I thought I'd used that but I'd forgotten it was awkward to work with because the event isn't guaranteed to be before the closing event and it comes in on a different thread.  The easier way is something like this:

  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

    Const WM_QUERYENDSESSION As Integer = &H11
      Me.m_bSystemShutdownInProgress = True
    End If
  End Sub

and then in your form's closing event you can test m_bSystemShutdownInProgress to see if you should really shut down.  Which now that I look at hairyminga's link, I see it is explained there also.
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.


Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.