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 ;)
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.


Expert Comment

ID: 17774315
Ah, sorry, posted my 2nd comment before seeing your addition there
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

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Since .Net 2.0, Visual Basic has made it easy to create a splash screen and set it via the "Splash Screen" drop down in the Project Properties.  A splash screen set in this manner is automatically created, displayed and closed by the framework itsel…
Parsing a CSV file is a task that we are confronted with regularly, and although there are a vast number of means to do this, as a newbie, the field can be confusing and the tools can seem complex. A simple solution to parsing a customized CSV fi…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…
In a recent question ( here at Experts Exchange, a member asked how to run an AutoHotkey script (.AHK) directly from Notepad++ (aka NPP). This video…

808 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