【发布时间】:2013-07-27 01:51:20
【问题描述】:
我有以下代码:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_SYSCOMMAND As Integer = &H112
Const SC_SCREENSAVE As Integer = &HF140
MyBase.WndProc(m)
If bloqueado = 0 Then
If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32 = SC_SCREENSAVE Then
Timer2.Start()
inicio = Now
pausa = pausa + 1
AddHandler Application.Idle, AddressOf Application_Idle
End If
End If
End Sub
Private Sub Application_Idle(ByVal sender As Object, ByVal e As EventArgs)
Dim newitem As ListViewItem
Dim diferença As TimeSpan
'MsgBox(Now.ToString)'
Debug.Print(Now.ToString)
fim = Now
diferença = fim - inicio
Timer2.Stop()
newitem = New ListViewItem
newitem.Text = pausa
newitem.SubItems.Add(inicio.ToLongTimeString)
newitem.SubItems.Add(fim.ToLongTimeString)
newitem.SubItems.Add(diferença.ToString.Substring(0, 8))
ListView1.Items.Add(newitem)
parcial = parcial & pausa & vbTab & vbTab & inicio.ToLongTimeString & vbTab & vbTab & fim.ToLongTimeString _
& vbTab & vbTab & diferença.ToString.Substring(0, 8) & vbTab & vbTab & " screensaver" & System.Environment.NewLine
RemoveHandler Application.Idle, AddressOf Application_Idle
End Sub
基本上第一部分检测屏幕保护程序何时激活并创建 application.idle 事件处理程序,第二部分检测活动时运行一堆代码并删除处理程序。
除了一点,一切都很好:
如您所见,当屏幕保护程序变为活动状态时,我有 inicio = now,当检测到活动时(当屏幕保护程序变为非活动状态时),我有 inicio = now,所以我应该有 2 个不同的时间,但如果我有它,就像我发布了 2 个日期时间将是相同的。如果您注意到我有一个 msgbox 在评论中显示现在(当屏幕保护程序停止时),如果我将其从评论中删除,则 2 个日期时间将不同且正确(我使用计时器来确保结果)
现在我的问题:
为什么它需要更新 now 的消息框,为什么它在 debug.print 中不起作用?
有没有办法解决这个问题/更新now var,而不必使用消息框(我不希望应用有弹出消息)
如果我真的必须为此目的使用 msgbox,有没有办法让它不发送弹出窗口或立即自动单击确定,以便它立即消失?
编辑:
我一直在搜索,我找到了这段代码:
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Function IsSNRunning() As Boolean
IsSNRunning = (FindWindow("WindowsScreenSaverClass", vbNullString) <> 0)
End Function
Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
If IsSNRunning() Then
'Screen Saver Is Running
Else
Timer3.Stop()
code
End If
End Sub
我在捕获屏幕保护程序开始的部分中使用Timer3.Start(),我的想法是如果我在知道屏幕保护程序是否打开时启动计时器,那么当我将 IsSNRunning 设为 false 时是屏幕保护程序停止运行时,但它不起作用,任何想法为什么?
【问题讨论】:
-
fim = 现在检测到活动时
Application.Idle如何提醒您活动? 为什么它现在需要更新消息框,为什么它在 debug.print 中不起作用? 大概消息框会立即运行(Application.Idle是一个非常常见的事情)但会阻止代码从继续,直到您移动鼠标、清除屏幕保护程序并看到消息框。当您关闭消息框时,Debug.Print代码会以当前时间运行。 -
application_idle 是一个与activity相关的事件
-
这与应用程序即将变为“空闲”有关,因此没有活动...让您的事件处理程序发出哔声而不是显示消息框。
-
嗯。那么我如何检测活动?像鼠标移动或计时或按键?以便我知道屏幕保护程序何时结束?
-
您认为
pausa = pausa + 1和AddHandler Application.Idle, AddressOf Application_Idle执行需要多长时间?我怀疑它比你在两次调用Now时捕获的要快得多,尤其是因为第一次是一个简单的增量。
标签: vb.net winforms visual-studio visual-studio-2012