【问题标题】:VB.NET: How to know time for which system is idle?VB.NET:如何知道哪个系统空闲的时间?
【发布时间】:2014-10-24 03:31:41
【问题描述】:

我正在制作一个应用程序,当系统空闲时,即当用户不与系统交互时,我将在其中实现 自动监控关闭

我找到了一个链接:http://www.codeproject.com/KB/system/SystemIdleTimerComponent.aspx

它确实提供了知道系统何时空闲的组件。但是当我包括:

Public WM_SYSCOMMAND As Integer = &H112
Public SC_MONITORPOWER As Integer = &Hf170

<DllImport("user32.dll")> _
Private Shared Function SendMessage(hWnd As Integer, hMsg As Integer, wParam As Integer, lParam As Integer) As Integer
End Function

Private Sub button1_Click(sender As Object, e As System.EventArgs)
    SendMessage(Me.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, 2)
End Sub

显示此错误:跨线程操作无效:控件“Form1”从创建它的线程以外的线程访问。

【问题讨论】:

  • 如果你想要一个 VB.NET 解决方案,不要标记它 [c#]。
  • @Oded:我已经编辑了问题... :)
  • 您如何看待“当用户离开一段时间”?
  • 我关闭显示器的目的是为了节省电量。所以当用户不使用系统时,即系统空闲时,显示器应该关闭。因此,我想知道系统空闲的时间。
  • 操作系统在关闭显示器方面肯定比你做得更好?

标签: .net vb.net


【解决方案1】:

它显示此错误:跨线程操作无效:控件“Form1”从创建它的线程以外的线程访问。

不要从另一个线程访问 Form1。阅读调用模式。

【讨论】:

    【解决方案2】:

    我让 LastInputInfo 在我的应用程序中工作,方法是使用计时器每 500 毫秒检索一次, 代码如下所示:

    Private ATimer As DispatcherTimer
    
    Public Sub New()
            ....
    
        ATimer = New DispatcherTimer
        AddHandler ATimer.Tick, AddressOf Me.ATimer_Tick
        ATimer.Interval = TimeSpan.FromMilliseconds(500)  'Checks for idle every 500ms
        ATimer.Start()
    End Sub
    
    
    Public Structure LASTINPUTINFO
        Public cbSize As Integer
        Public dwTime As Integer
    End Structure
    
    Private Declare Function GetTickCount Lib "kernel32" () As Long
    
    Public Declare Function GetLastInputInfo Lib "User32.dll" _
                                  (ByRef lii As LASTINPUTINFO) As Boolean
    
    Private Sub ATimer_Tick(ByVal sender As Object, ByVal e As EventArgs)
    
        MyLastInputInfo = New LASTINPUTINFO
        MyLastInputInfo.cbSize = Runtime.InteropServices.Marshal.SizeOf(MyLastInputInfo)
    
       ' get last input info from Windows
        If GetLastInputInfo(MyLastInputInfo) Then     ' if we have an input info     
           ' compute idle time
           Dim sysIdleTime_ms As Integer = (GetTickCount() - MyLastInputInfo.dwTime)
    
        End if
           ... Now you have the idle time in ms, do whatever you want with it :=)
    

    这种做事方式的一个限制可能是,由于时间存储在一个 32 位整数内的刻度中,它“仅”在您的计算机最后一次重新启动后的 50 天内有效 (...)。 我的猜测是 TickCount 和 dwTime 都会在 TickCount 换行时换行,因此没有问题,但无法测试。

    【讨论】:

      【解决方案3】:

      您可以尝试使用 GetLastInputInfo() 进行监控吗? http://msdn.microsoft.com/en-us/library/ms646302.aspx

      【讨论】:

      • 谢谢...但我不知道如何使用 LastInputInfo 结构。你能帮我写一段代码来返回系统空闲的时间吗?
      【解决方案4】:

      试试

      CheckForIllegalCrossThreadCalls = False
      

      它通常对我使用来自其他线程的控件,即使它不是最有效的正确方法,但它确实可以帮助你,直到你找到替代方法

      【讨论】:

        猜你喜欢
        • 2017-10-29
        • 1970-01-01
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        • 2013-09-05
        • 2021-08-18
        • 1970-01-01
        • 2011-04-24
        相关资源
        最近更新 更多