用C#写的鼠标模块动作,主要用了以下API
SetCursorPos
mouse_event
与C#自带的SendKeys方法
在本地执行一切正常,放在在终端服务(3389)也执行也正常。
可是当关闭终端服务(不是注销,会话还保持着的)
结果发现,程序能够运行(我写成定时执行),但实际上鼠标或键盘模拟没有运行。
我怀疑是否关闭终端时,由于终端服务认为不用反馈动作给用户,所以没有执行。
这个问题较急,先谢谢大家了 !
问题补充:
这里假设我要移动鼠标到桌面一文本文件(109,253),单击文件并按回车(打开文件),
然后输入文本OK.
程序无论在本机或者在终端服务上运行都能正常。
可如果运行后,关闭了终端,或者最小化终端(即鼠标失去了焦点)则会发现下面的代码虽然有执行,但并没有生效。
程序如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;
namespace test
{
public partial class Form1 : Form
{
#region API
[DllImport("user32.dll")]
protected static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);
[Flags]
protected enum MouseEventFlag : uint
{
Move = 0x0001,
LeftDown = 0x0002,
LeftUp = 0x0004,
RightDown = 0x0008,
RightUp = 0x0010,
MiddleDown = 0x0020,
MiddleUp = 0x0040,
XDown = 0x0080,
XUp = 0x0100,
Wheel = 0x0800,
VirtualDesk = 0x4000,
Absolute = 0x8000
}
[DllImport("user32.dll")]
private static extern bool SetCursorPos(int X, int Y);
#endregion
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread.Sleep(5000); //有足够时间关闭终端窗口
SetCursorPos(109, 253); //直接移到目的地
Thread.Sleep(1000);
mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
Thread.Sleep(1000);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(2000);
SendKeys.SendWait("OK");
}
}
}