Joh*_*tos 7 c# vb.net winforms
我知道这个问题之前肯定已被问过几百次,所以,也许,我只是做错了什么.但我有一个WinForms程序,我正在编写,试图让系统保持活动状态,以便在注册空闲时停止它.
我认为在我的表单上有一个Timer并且做一些像移动鼠标System.Windows.Forms.Cursor.Position或使用该SendKeys.Send方法一样简单的操作就足以注册用户交互,但它不会注册为用户操作,并且仍然让系统在设置后显示为非活动状态多少时间.
我的代码相当简单......要么:
Private Sub Updater_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Updater.Tick
SendKeys.Send("+")
End Sub
Run Code Online (Sandbox Code Playgroud)
或者按照以下方式做一些事情:
Private Sub Updater_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Updater.Tick
Dim MyMousePosition As Point
MyMousePosition = Windows.Forms.Cursor.Position
Windows.Forms.Cursor.Position = New Point(MyMousePosition.X - 10, MyMousePosition.Y)
End Sub
Run Code Online (Sandbox Code Playgroud)
但是这两种技巧都没有......我怎样才能让它发挥作用并且最好以对用户实际使用系统最不方便的方式?(这意味着我不想发送一堆密钥,如果用户实际处于活动状态或将鼠标移到屏幕上,可能会弄乱用户)
我知道这个coce在VB中,但我很擅长VB/C#解决方案.
谢谢!!!
编辑
作为这个问题的补充,我使用GetLastInputInfo了User32.dll来检查系统活动.
即使我的鼠标/键盘事件链接到Timer_Tick事件,GetLastInputInfo只有在物理移动鼠标/在计算机上执行某些操作时才会重置...
我想我的问题是
我可以添加什么事件到我的Timer_Tick事件,这将重置GetLastInputInfo - 换句话说,让Windows相信用户实际上在机器上做了什么?
谢谢!!!
经过大量的游戏后,我想出了一个有效的解决方案,我正在回答这个问题,以便帮助那些可能正在寻找相同信息的人.
(用VB编写):
在声明部分:
Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Integer, ByRef pInputs As INPUT_TYPE, ByVal cbSize As Integer) As Integer
Const INPUT_MOUSE = 0
Const MOUSEEVENTF_MOVE = &H1
Public Structure MOUSEINPUT
Public dx As Integer
Public dy As Integer
Public mouseData As Integer
Public dwFlags As Integer
Public dwtime As Integer
Public dwExtraInfo As Integer
End Structure
Public Structure INPUT_TYPE
Public dwType As Integer
Public xi As MOUSEINPUT
End Structure
Run Code Online (Sandbox Code Playgroud)
Sub移动鼠标:
Public Sub MoveMouse(ByVal x As Integer, ByVal y As Integer, ByVal flag As Integer)
Dim inputEvents As INPUT_TYPE
Dim xi As New MOUSEINPUT
xi.dx = x
xi.dy = y
xi.mouseData = 0
xi.dwtime = 0
xi.dwFlags = flag
xi.dwExtraInfo = 0
inputEvents.dwType = INPUT_MOUSE
inputEvents.xi = xi
SendInput(1, inputEvents, Len(inputEvents))
End Sub
Run Code Online (Sandbox Code Playgroud)
Timer_Tick事件中的代码:
Private Sub Updater_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Updater.Tick
' Move the mouse (relatively) 1 pixel away and then back
MoveMouse(1, 1, MOUSEEVENTF_MOVE)
MoveMouse(-1, -1, MOUSEEVENTF_MOVE)
End Sub
Run Code Online (Sandbox Code Playgroud)
我使用GetLastInputInfoAPI函数测试了它,它的工作原理!
...我找到的最有用的链接是这个:http: //homeofcox-cs.blogspot.com/2008/07/c-simulate-mouse-and-keyboard-events.html
谢谢大家的帮助,我希望这也有助于其他人!