我有以下代码:事件处理程序“错误”使用VB.NET与窗口形成
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 =现在,当屏幕变得活跃和FIM =现在检测到活动时(当屏幕保护程序变为无效),所以我应该有2个不同的时间,但如果我有它像我贴2日期时间将是相同的。如果你注意到我有一个msgbox显示现在(当屏幕保护程序停止)评论,如果我把它从评论2日期时间将是differente和正确的(我用天文台确保结果)
现在我的问题: 为什么它需要更新now
的消息框,为什么它不工作debug.print?
有没有办法解决这个问题/更新now
变种,而无需使用一个消息框的方式(我不希望对应用有弹出消息)
,如果我真的要使用为此,msgbox是否有办法让它不发送弹出窗口或自动点击OK,以便立即消失?
编辑:
我一直在寻找,我发现这个代码:
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是与活动相关的事件 – Newbie
它与应用程序有关将变为“空闲”,因此没有活动......使您的事件处理程序发出嘟嘟声而不是显示消息框。 –