我查了很多资料,由于自己水平有限,总没有找到控制鼠标的好方法。
哪位能帮我示范一个例子,控制鼠标在屏幕上的位置,并在我需要的地方单击或双击或右击。
我知道这个问题应该不难,但是很多的资料都不介绍这个,只好到这里来寻求帮助了。
哪位能帮我示范一个例子,控制鼠标在屏幕上的位置,并在我需要的地方单击或双击或右击。
我知道这个问题应该不难,但是很多的资料都不介绍这个,只好到这里来寻求帮助了。
解决方案 »
- c#获取系统信息。顶者有分
- 如何让helpbutton和最大化最小化button同时出现
- 如何在 其它窗体 和 类中 更改另一个窗体内控件的属性?
- 我对sql一个表保存,同时又要对别的一些表进行插入或更新操作
- 急急急!!!!求助,,,有关用c#编写udp局域网聊天软件
- Sql数据表int类型主键,是否设置自动增长.
- 如何判断上传的路径是不是图片(gif\jpg)? ---C#
- 初学编程请问一个关于变量的菜鸟级问题!
- 使用treeview控件,开发环境没有问题,发布后就出错,在线等~~~~
- c#与pb的讨论
- 请教各位高手怎么样修改文本文件中的某个内容?
- 国外的报表工具除了水晶报表外还有其他的吗?
知道在C#下怎么用吗?这些资料网上有的吧?
以下是两个鼠标API函数的VB声明,希望你写成C#格式再使用:SetCursorPos VB声明
Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As Long, ByVal y As Long) As Long
说明
设置指针的位置
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
x,y 鼠标指针在屏幕像素坐标系统中的X,Y位置 mouse_event VB声明
Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
说明
模拟一次鼠标事件
参数表
参数 类型及说明
dwFlags Long,下述标志的一个组合
MOUSEEVENTF_ABSOLUTE dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
MOUSEEVENTF_MOVE 移动鼠标
MOUSEEVENTF_LEFTDOWN 模拟鼠标左键按下
MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起
MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下
MOUSEEVENTF_RIGHTUP 模拟鼠标右键按下
MOUSEEVENTF_MIDDLEDOWN 模拟鼠标中键按下
MOUSEEVENTF_MIDDLEUP 模拟鼠标中键按下
dx Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动
dy Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动
cButtons Long,未使用
dwExtraInfo Long,通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序
注解
进行相对运动的时候,由SystemParametersInfo函数规定的系统鼠标轨迹速度会应用于鼠标运行的速度
我回去看了一下winAPI的相关书籍,再结合楼上的解答,做了一下。现在还有两个问题,请高手不吝赐教:
1. 这个mouse_event函数的第一个参数如何赋值?
我是这么做的,kk.mouse_event(MOOSEEVENTFMOVE,35536,35536,0,0),其中kk是我c#中的自定义类,里面是对user32.dll中mouse_event函数的引用。可是总是编译不过去。我把第一个参数赋一个具体的值,比如100,编译和运行没有问题,但结果不可预料阿,有一次运行以后把我的鼠标左键变成了右键。所以恳请专家再帮帮我,这第一个参数怎么赋值。
2. .net环境下应该也有类似的模拟鼠标动作的函数,只是本人水平有限,还请高手赐告。
谢谢了!
{
this.Cursor = new Cursor(Cursor.Current.Handle);
Cursor.Position = new Point(1024, 768);
}
这样鼠标就会在右下角出现了,具体可以查Cursor类
MOUSEEVENTF_LEFTDOWN 模拟鼠标左键按下
MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起
MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下
MOUSEEVENTF_RIGHTUP 模拟鼠标右键按下
MOUSEEVENTF_MIDDLEDOWN 模拟鼠标中键按下
MOUSEEVENTF_MIDDLEUP 模拟鼠标中键按下
dx Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动
dy Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动
cButtons Long,未使用
dwExtraInfo Long,通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序
/// 模拟鼠标事件
///
/// 鼠标事件的Enum
/// X座标
/// Y座标
///
///
[DllImport("user32.dll")]
public static extern void mouse_event (MouseEvents dwFlags,long dx, long dy,long cButtons,long dwExtraInfo); ///
/// 定义模拟鼠标的常数
///
public enum MouseEvents:uint
{
MOUSEEVENTF_LEFTDOWN = 0x2,
MOUSEEVENTF_LEFTUP = 0x4,
MOUSEEVENTF_MIDDLEDOWN = 0x20,
MOUSEEVENTF_MIDDLEUP = 0x40,
MOUSEEVENTF_MOVE = 0x1,
MOUSEEVENTF_ABSOLUTE = 0x8000,
MOUSEEVENTF_RIGHTDOWN = 0x8,
MOUSEEVENTF_RIGHTUP = 0x10,
} ///
/// 按指定标题寻找窗口,以获得指定窗口的句柄,为空则返回零。
///
/// 如未知则设置为NULL
/// 窗口名
/// 整型数据,代表窗口句柄
[DllImport("user32.dll")]
public static extern int FindWindow(String lpClassName,String lpWindowName); ///
/// 根据窗口句柄,获得窗口的类名
///
/// 窗口句柄
/// 缓冲区
/// 最大字节数
/// 整型,代表类名
[DllImport("user32.dll")]
public static extern int GetClassName(int hwnd,System.Text.StringBuilder buf, int nMaxCount); ///
/// 根据窗口句柄,获得指定窗口的标题。
///
/// 窗口句柄
/// 缓冲区
/// 最大字节数
/// 返回标题
[DllImport("user32.dll")]
public static extern int GetWindowText(int hwnd,System.Text.StringBuilder buf, int nMaxCount); ///
/// 根据窗口句柄,设置指定窗口为前置窗口。
///
/// 窗口句柄
[DllImport("user32.dll")]
public static extern void SetForegroundWindow(int hwnd);
///
/// 根据窗口句柄和显示的样式,显示窗口。
///
/// 窗口句柄
/// 显示窗口的样式。
/// 成功与否。
[DllImport("user32.dll")]
public static extern bool ShowWindow(int hWnd, nCmdShow nCmdShow);
public enum nCmdShow:uint
{
SW_FORCEMINIMIZE=0x0,
SW_HIDE=0x1,
SW_MAXIMIZE=0x2,
SW_MINIMIZE=0x3,
SW_RESTORE=0x4,
SW_SHOW=0x5,
SW_SHOWDEFAULT=0x6,
SW_SHOWMAXIMIZED=0x7,
SW_SHOWMINIMIZED=0x8,
SW_SHOWMINNOACTIVE=0x9,
SW_SHOWNA=0xA,
SW_SHOWNOACTIVATE=0xB,
SW_SHOWNORMAL=0xC,
} ///
/// 捕捉当前鼠标位置
///
/// 传入参数,代表鼠标的当前位置
///
[DllImport("user32.dll")]
public static extern long GetCursorPos (ref System.Drawing.Point lpPoint);
#endregion
1. 这个mouse_event函数的第一个参数如何赋值?
这个问题是因为你没有重写那个enum类型
先写一个类: public class Class1
{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int mouse_event(long dwFlags,long dx,long dy,long dwData,long dwExtralnfo);
}
然后在页面模块里这么引用: private void button1_Click(object sender, System.EventArgs e)
{
Class1.mouse_event(1,50,80,0,0);
}当然我是把第一个参数16进制的1换成了10进制的1直接赋值,这样应该也是可以的。但是鼠标只在y方向移动50(不是80),怎么也控制不到x方向。
请高手再解惑。