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

Posted on 2006-10-20
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

Question by:posae
  • 4
  • 3
  • 2

Expert Comment

ID: 17774265
How about installing the application as a Windows Service?

Author Comment

ID: 17774291
It is a little trickier than that as the program requires username/password that the user enters upon startup at log-on time.

Expert Comment

ID: 17774303
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 ;)

Expert Comment

ID: 17774315
Ah, sorry, posted my 2nd comment before seeing your addition there
Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

LVL 21

Accepted Solution

mastoo earned 500 total points
ID: 17775308
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.

Expert Comment

ID: 17786998
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


Author Comment

ID: 17788163
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.

Author Comment

ID: 17882516
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
LVL 21

Expert Comment

ID: 17883284
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.

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

I think the Typed DataTable and Typed DataSet are very good options when working with data, but I don't like auto-generated code. First, I create an Abstract Class for my DataTables Common Code.  This class Inherits from DataTable. Also, it can …
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Here's a very brief overview of the methods PRTG Network Monitor ( offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now