how to identify logon event in window service

我与影子孤独终老i 提交于 2019-12-01 13:53:01

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.onsessionchange.aspx

This may be your best bet, as Vista and Win7 handle the user sessions much like a terminal server would. This should let you handle session changes and it gives a structure with the relevant information, if you want session ID or reason for session change (logon / logoff / lock etc)

Take a look into the SystemEvents class, here's the MSDN link.

Relevant in your case are the exposed events SessionEnded, SessionEnding and SessionSwitch and potentially PowerModeChanged.

A quick example might look like this:

SystemEvents.SessionSwitch += OnSessionSwitch;

void OnSessionSwitch(object sender, SessionSwitchEventArgs e)
{
    //implement your logic here
}

These events are not raised unless a message loop is provided; manually by adding a hidden form (or may be allowing the Service to interact with the desktop - not sure never tired, may be not recommended).

I'd a similar issue with one of the services not receiving TimeZone changes, so had to add a hidden form to the service.

Here is one of the examples as to how to solve the issue.

And below is what I did to solve my issue:

Added the TimeZoneForm to the service.sln;

And in the Service's OnStart add this code : new System.Threading.Thread(RunMessagePump).Start();

And add this method to the service file:

private void RunMessagePump()
        {            
            Application.Run(new TimeZoneForm.TimeZoneForm());
        }


internal class TimeZoneForm : Form
    {
        public TimeZoneForm()
        {
            InitializeComponent();
        }

        private void TimeZoneForm_Load(object sender, EventArgs e)
        {
            SystemEvents.TimeChanged += SystemEvents_TimeChanged;            
        }

        private void TimeZoneForm_Closing(object sender, FormClosingEventArgs e)
        {
            SystemEvents.TimeChanged -= SystemEvents_TimeChanged;            
        }

        private void SystemEvents_TimeChanged(object sender, EventArgs e)
        {
            System.Globalization.CultureInfo.CurrentCulture.ClearCachedData();
        }

        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(0, 0);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "TimeZoneForm";
            this.Text = "TimeZoneForm";
            this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
            this.Load += this.TimeZoneForm_Load;
            this.FormClosing += this.TimeZoneForm_Closing;
            this.ResumeLayout(false);

        }
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!