在Visual Studio 2013中,我安装了一个名为" InputSimulator " 的C#包.在这样做之后,我看到一个新的引用被添加到我的项目"WindowsInput"中.(即WindowsInput.dll)
问题是codeplex网站谈论的方法都不可访问.如果我尝试:
InputSimulator.SimulateTextEntry("Say hello!");
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Error 14 'WindowsInput.InputSimulator' does not contain a definition for
'SimulateTextEntry' Blah.cs 33 32 ALibrary
Run Code Online (Sandbox Code Playgroud)
我确实有using WindowsInput指令.
有谁知道为什么这些方法无法访问?类似SimulateKeyPress()的方法也不可用.这些是关键的API.我是否遗漏了有关添加此库并引用它的内容?
我知道这个问题之前肯定已被问过几百次,所以,也许,我只是做错了什么.但我有一个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相信用户实际上在机器上做了什么?
谢谢!!!
在我的特定情况下,我正在尝试创建一个将键盘击键发送到DosBox的应用程序(dos游戏模拟器,而不是Windows命令提示符)。
我尝试使用SendKeys进行此操作,但由于DosBox不是处理Windows消息的应用程序(一个异常告诉了我),因此不起作用。
目前,我正在尝试使用键盘钩子做到这一点,例如:第一种方法是接收钩子击键并将其传递到下一个应用程序的方法(如本例所示)
private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
return CallNextHookEx(hookId, nCode, wParam, lParam);
}
private void GenerateKeyPress()
{
int vkCode = (int)Keys.Up; //My chosen key to be send to dosbox
IntPtr lParam = new IntPtr(vkCode);
IntPtr wParam = new IntPtr(255);
CallNextHookEx(hookId, 0, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)
但是,CallNextHookEx()函数调用会引发访问冲突异常。
我需要在这里想到什么?