【问题标题】:.NET WinForms - How to listen to events for system LogOff, User Locked, Hibernate Started and System resumed?.NET WinForms - 如何监听系统注销、用户锁定、休眠启动和系统恢复的事件?
【发布时间】:2023-03-05 00:11:01
【问题描述】:

我想在我的 Windows 窗体 .NET 应用程序中监听以下系统范围的事件:

注销 锁定窗口 休眠开始 睡眠开始 系统恢复

这些可能吗?

谢谢

【问题讨论】:

  • SystemEvents 类涵盖了大部分内容。

标签: c# .net vb.net winforms events


【解决方案1】:

【讨论】:

    【解决方案2】:

    如上所述,您可以使用 WMI 来捕获事件。
    我正在添加一些我几年前写的代码示例(希望它仍然可以工作,因为它是在 VS2010 上使用 .Net3.5 编写的)

    这是一个收集所有事件的类

    Imports Microsoft.Win32
    Imports System.Windows.Forms
    
    Public Class PowerMessageFilter
        Implements IMessageFilter
        Const WM_POWERBROADCAST As Integer = &H218
        Const PBT_APMSUSPEND As Integer = &H4
        Const PBT_APMSTANDBY As Integer = &H5
        Const PBT_APMRESUMESUSPEND As Integer = &H7
        Const PBT_APMRESUMESTANDBY As Integer = &H8
    
       Protected Sub reportpowerchange(ByVal reason As Integer)
           Dim report As String = String.Empty
           Select Case (reason)
               Case PBT_APMSUSPEND
                   report = "system is suspending operation "
                   suspend_service()
                   Exit Select
               Case PBT_APMSTANDBY
                   report = "system is standing by "
                   suspend_service()
                   Exit Select
               Case PBT_APMRESUMESUSPEND
                   report = "operation resuming after suspension."
                   suspend_service()
                   Exit Select
               Case PBT_APMRESUMESTANDBY
                   report = "operation resuming after stand by."
                   suspend_service()
               Exit Select
           End Select
       End Sub
    
       Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
           If WM_POWERBROADCAST = m.Msg Then
               Console.Out.WriteLine("Power Broadcast recieved.")
               Dim reason As Integer = m.WParam.ToInt32()
               reportpowerchange(reason)
           End If
           Return False
       End Function
    
       Private Sub suspend_service()
          ' Your suspend code
       End Sub
    End Class
    

    现在,对于监听器,我有一个 Win32 服务在后台运行并完成监听工作

    Dim Filter As New PowerMessageFilter 'The Standby/Hibernation Filter catch;
    Application.AddMessageFilter(Filter)
    

    很抱歉,我没有任何关于我从中获取示例的网站的参考资料,我猜它可能来自上面的 MSDN 链接。

    希望对你有帮助,
    利隆

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 2016-11-12
      • 2010-11-02
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多