none
用户解锁屏幕事件 RRS feed

  • 问题

  • 我想在用户解锁屏幕的时候进行一些操作,有什么相关的事件可以触发,如果没有,有什么方案可以替换
    2012年4月17日 3:30

答案

全部回复

  • 您好!

    在Metro应用中,无法捕获解锁屏幕事件。

    相关的一些Desktop和Workstation API只能用于“桌面应用程序"。


    Best wishes,


    Robin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年4月17日 5:50
    版主
  • 和之前讨论类似, 我觉得如果你确实需要实现解锁后执行一些操作,我建议你还是设计用Windows Service 或者Desktop App 模式,他们可以侦听SystemEvents ,其中里面包括这个解锁的信号 (http://msdn.microsoft.com/en-us/library/microsoft.win32.sessionswitchreason.aspx in SessionSwitchEventArgs)。 我看到你在英文那边也发了帖子,看看是否他们又更好的想法,或者和我的想法类似。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 6:17
    版主
  • 但是有个问题,比如我有个操作,当用户解锁的时候更换锁屏背景图片,win32没有相关Api可以做此操作,当Windows Service侦听到用户解锁的时候,它怎么通知metro程序。可以用socket让metro App在一个端口监听是否有命令发过来然后进行更换锁屏背景操作?

    注:我试过,用windows service是侦听不到用户解锁事件的,貌似windows service和用户解锁事件不在同一个会话(我用实例测过不行)

    2012年4月17日 8:43
  • 可以, http://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.sockets.aspx 这个名字空间提供了类型支持.

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 9:07
    版主
  • 我试过,用windows service是侦听不到用户解锁事件的,貌似windows service和用户解锁事件不在同一个会话,windows service在会话0,第一个用户登录的在会话1,依次递增,不知道有没什么方案可以跨会话通信
    2012年4月17日 9:32
  • 我试过,用windows service是侦听不到用户解锁事件的,貌似windows service和用户解锁事件不在同一个会话,windows service在会话0,第一个用户登录的在会话1,依次递增,不知道有没什么方案可以跨会话通信

    文档 http://msdn.microsoft.com/zh-cn/library/microsoft.win32.systemevents.sessionswitch.aspx 中关于Windows Service 处理方式有一个注意说明:

    注意注意

    只有在消息泵运行时,才会引发此事件。 在 Windows 服务中,除非使用隐藏窗体或者手动启动消息泵,否则不会引发此事件。 有关演示如何在 Windows 服务中使用隐藏窗体来处理系统事件的代码示例,请参见SystemEvents 类。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月18日 3:26
    版主
  • 我测试过,可以触发TimeChanged事件,但是触发不了SessionSwitch事件(测试时将电脑锁屏,然后解锁),代码如下:

    protected override void OnStart(string[] args)
            {
                //Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch);
                EventLog.WriteEntry("Service1", "Starting Service1");
                new Thread(RunMessagePump).Start();

            }

            void RunMessagePump()
            {
                EventLog.WriteEntry("Service1.MessagePump", "Starting Service1 Message Pump");

                Application.Run(new HiddenForm());
            }

           

          

            protected override void OnStop()
            {
                Application.Exit();

            }

            public partial class HiddenForm : Form
            {
                public HiddenForm()
                {
                    InitializeComponent();
                }

                private void HiddenForm_Load(object sender, EventArgs e)
                {
                    SystemEvents.TimeChanged += new EventHandler(SystemEvents_TimeChanged);

                    Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch);
                }

                private void HiddenForm_FormClosing(object sender, FormClosingEventArgs e)
                {
                    SystemEvents.TimeChanged -= new EventHandler(SystemEvents_TimeChanged);

                    SystemEvents.SessionSwitch -= new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
                }

                private void SystemEvents_TimeChanged(object sender, EventArgs e)
                {
                    EventLog.WriteEntry("Service1.TimeChanged", "Time changed; it is now " +
                        DateTime.Now.ToLongTimeString());
                }

     

                private void SystemEvents_SessionSwitch(object sender, Microsoft.Win32.SessionSwitchEventArgs e)
                {
                    EventLog.WriteEntry("Service1.SessionSwitch", DateTime.Now.ToLongTimeString());

                    if (e.Reason == Microsoft.Win32.SessionSwitchReason.SessionUnlock)
                    {
                        FileStream fs = new FileStream(@"d:\mcWindowsService.txt", FileMode.OpenOrCreate, FileAccess.Write);

                        StreamWriter m_streamWriter = new StreamWriter(fs);

                        m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);

                        m_streamWriter.WriteLine("mcWindowsService: Service Started" + "Got Unlock Event" + DateTime.Now.ToString() + "\n");

                        m_streamWriter.Flush();

                        m_streamWriter.Close();

                        fs.Close();
                    }
                }
            }

            partial class HiddenForm
            {
                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 = "HiddenForm";
                    this.Text = "HiddenForm";
                    this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
                    this.Load += new System.EventHandler(this.HiddenForm_Load);
                    this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.HiddenForm_FormClosing);
                    this.ResumeLayout(false);
                }
            }

    2012年4月18日 7:25
  • 奇怪的是,下面这样写也可以触发Timechanged事件:

     protected override void OnStart(string[] args)
            {
                SystemEvents.TimeChanged += new EventHandler(SystemEvents_TimeChanged);
                //Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch);
                //EventLog.WriteEntry("Service1", "Starting Service1");
                //new Thread(RunMessagePump).Start();

            }

            private void SystemEvents_TimeChanged(object sender, EventArgs e)
            {
                EventLog.WriteEntry("Service1.TimeChanged", "Time changed; it is now " +
                    DateTime.Now.ToLongTimeString());
            }

    2012年4月18日 7:48
  • 查了些资料,看到 蒋晟一个帖子,一语道破: http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/4c685832-d4aa-4028-9969-60b658115736 


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月18日 8:02
    版主
  • 我这样写还是侦听不到,有什么问题

     protected override void OnSessionChange(SessionChangeDescription changeDescription)
            {
               

    switch (changeDescription.Reason)
                {
                    case SessionChangeReason.SessionLogon:
                        EventLog.WriteEntry("Service1.Logon", DateTime.Now.ToLongTimeString());
                        break;
                    case SessionChangeReason.SessionLogoff:
                        EventLog.WriteEntry("Service1.Logoff", DateTime.Now.ToLongTimeString());
                        break;
                    case SessionChangeReason.SessionLock:
                        EventLog.WriteEntry("Service1.Lock", DateTime.Now.ToLongTimeString());
                        break;
                    case SessionChangeReason.SessionUnlock:
                        EventLog.WriteEntry("Service1.Unlock", DateTime.Now.ToLongTimeString());
                        break;

                }            

                 base.OnSessionChange(changeDescription);
            }


    2012年4月18日 8:28
  • 已解决,少了这一句this.CanHandleSessionChangeEvent = true;

    谢谢Bob的帮助!有问题再请指教

    2012年4月18日 8:53