mouse_event是一种计算机功能,集成了鼠标移动和按钮单击。如果移动了鼠标,则设置MOUSEEVENTF_MOVE以指示dX和dy保留移动信息。给出的信息是绝对或相对整数值。

在自动测试的开发中,很难找到某些控件的ID,因此有时我们直接设置鼠标的位置,然后使用click事件,将会取得良好的效果。 Windows API中有一个mouse_event函数,可以为我们准备一切。
此功能在user32.dll库文件中。我们可以在系统随附的目录C:/ WINDOWS / system32(XP系统)中找到该文件。让我们以C#直接调用此文件中的API为例来说明如何执行鼠标操作。首先,在我们的C#中声明引用。如果它是基于From的程序,则在您的From类中写入此声明的位置。
[System.Runtime.InteropServices.DllImport(“ user32”)]
私有静态外部int mouse_event(int dwFlags,int dx,int dy,int cButton,int dwExtraInfo);
参数含义
dwFlags Long,下表中的标志之一或它们的组合
dx,dy Long,根据MOUSEEVENTF_ABSOLUTE标志,指定x和y方向上的绝对位置或相对位置
cButtons长,不使用
dwExtraInfo Long,未使用
DwFlags常量含义
const int MOUSEEVENTF_MOVE = 0x0001;移动鼠标
const int MOUSEEVENTF_LEFTDOWN = 0x0002;模拟按下鼠标左键
const int MOUSEEVENTF_LEFTUP = 0x0004;模拟鼠标左键
const int MOUSEEVENTF_RIGHTDOWN = 0x0008;模拟鼠标右键按下
const int MOUSEEVENTF_RIGHTUP = 0x0010;模拟鼠标右键的抬起
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;模拟鼠标中键按下

const int MOUSEEVENTF_MIDDLEUP = 0x0040;模拟鼠标中键向上
const int MOUSEEVENTF_ABSOLUTE = 0x8000;指示是否使用绝对坐标
在程序中,我们可以直接调用mouse_event函数。
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE,500,500,0,0);
1、这是按下和释放鼠标左键这两个事件的组合,即单击一次:
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0)
2、模拟鼠标右键单击事件:
mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP,0,0,0,0)
3、两个连续的鼠标左键单击事件构成鼠标双击事件:
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0)
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0)
4、使用绝对坐标
MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE,500、500、0、0
应注意,如果不使用MOUSEEVENTF_ABSOLUTE,则该功能默认为相对于鼠标当前位置的点。如果dx和dy用0、0表示,则此函数考虑当前鼠标所在的点。5、直接设置绝对坐标,然后点击
mouse_event(MOUSEEVENTF_LEFTDOWN,X * 65536/1024,Y * 65536/768,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,X * 65536/1024,Y * 65536/768,0,0);

其中X和Y是您要单击的点的横坐标和纵坐标
使用mouse_event时如何计算屏幕绝对坐标
[DllImport(“ user32”,EntryPoint =“ mouse_event”)]
public static extern void mouse_event(
int dwFlags
int dx,
int dy
int cButtons
int dwExtraInfo
);
MOOSE_EVENTF_ABSOLOTE:指示参数dX和dy包含标准化的绝对坐标。如果未设置此位,则参数包含相对数据:相对于最后位置的更改位置。不管鼠标的类型或与系统连接的类似鼠标的设备的类型,都可以设置或不设置此标志。有关鼠标相对操作的信息,请参见下面的备注部分。
MOOSEEVENTFMOVE:指示发生了移动。
M00SEEVENTF_LEFTDOWN:表示按下鼠标左键。
M00SEEVENTF_LEFTUP:表示释放鼠标左键。
MOOSEEVENTF_RIGHTDOWN:表示按下了鼠标右键。
MOOSEEVENTF_RIGHTUP:表示释放鼠标右键。

MOOSEEVENTF_MIDDLEDOWN:表示按下了鼠标中键。
MOOSEEVENTF_MIDDLEUP:指示释放鼠标中键。
MOOSEEVENTF_WHEEL:如果在Windows NT中鼠标具有滚轮,则表示鼠标滚轮已移动。移动次数由dwData给出。
dx:根据MOOSEEVENTF_ABSOLOTE的设置,指定鼠标在x轴上的绝对位置或自上一次鼠标事件发生以来的移动量。给出的绝对数据是鼠标的实际X坐标;给出的相对数据是移动的米键数。米奇代表鼠标的移动量,表示鼠标已移动。
dy:指定鼠标沿y轴的绝对位置或自上一次鼠标事件生成以来的移动量,具体取决于MOOSEEVENTF_ABSOLVTE的设置。给出的绝对数据是鼠标的实际y坐标,给出的相对数据是移动的米键数。
dwData:如果dwFlags为MOOSEEVENTF_WHEEL,则dwData指定鼠标滚轮的移动量。正值表示鼠标滚轮向前旋转,即远离用户;负值表示鼠标滚轮向后(即,向用户)旋转。一轮命中定义为WHEEL_DELTA,即120。
如果dwFlagsS不是MOOSEEVENTF_WHEEL,则dWData应该为零。
dwExtralnfo:指定与鼠标事件相关的其他32位值。该应用程序调用函数GetMessgeExtrajnfo以获得此附加信息。
阅读帮助后,我仍然不知道如何计算dx和dy。下面是C ++代码供参考:
cursor.X = static_cast(position.point.x * 65535 / pimpl-> desktopSize.width);
cursor.Y = static_cast(position.point.y * 65535 / pimpl-> desktopSize.height);
c#mouse_event模拟鼠标单击事件的绝对位置
首先添加
using System.Runtime.InteropServices;
//鼠标事件 因为我用的不多,所以其他参数没有写 private readonly int MOUSEEVENTF_LEFTDOWN = 0x0002;//模拟鼠标移动 private readonly int MOUSEEVENTF_MOVE = 0x0001;//模拟鼠标左键按下 private readonly int MOUSEEVENTF_LEFTUP = 0x0004;//模拟鼠标左键抬起 private readonly int MOUSEEVENTF_ABSOLUTE = 0x8000;//鼠标绝对位置 private readonlyint MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键按下 private readonlyint MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标右键抬起 private readonlyint MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键按下 private readonlyint MOUSEEVENTF_MIDDLEUP = 0x0040;// 模拟鼠标中键抬起 [DllImport("user32")] public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
private void button2_Click(object sender, EventArgs e) { int x = int.Parse(textBox1.Text); int y = int.Parse(textBox2.Text);
//绝对位置 mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x * 65535 / 1600, y * 65535 / 900, 0, 0);//移动到需要点击的位置 mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, x * 65535 / 1600, y * 65535 / 900, 0, 0);//点击 mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, x * 65535 / 1600, y * 65535 / 900, 0, 0);//抬起
//相对位置 指的是相对于当前鼠标的相对位置
mouse_event(MOUSEEVENTF_MOVE , x , y, 0, 0);//移动 mouse_event(MOUSEEVENTF_LEFTDOWN , x , y, 0, 0);//点击 mouse_event(MOUSEEVENTF_LEFTUP , x , y , 0, 0);//抬起
}在textBox1和textBox2中输入要单击的位置,然后单击。点击范围是当前整个屏幕
两种模拟VC的鼠标(SendMessage,mouse_event)

用于鼠标模拟的常见解决方案包括发送鼠标事件消息和使用mouse_event系统功能。发送鼠标消息的示例如下:
pWnd->SendMessage(WM_RBUTTONDOWN,0,(y<<16)|x);此方法不需要表格位于前端,即使最小化也可以使用。但是,此方法并非在所有情况下都有效,尤其是对于不响应鼠标消息的程序。在这种情况下,您可以尝试使用mouse_event函数。
首先,给出mouse_event函数的原型:
VOID mouse_event( DWORD <em>dwFlagsem>, DWORD <em>dxem>, DWORD <em>dyem>, DWORD <em>dwDataem>, ULONG_PTR <em>dwExtraInfoem> );
mouse_event有五个参数,第一个是选项标志,当它是MOUSEEVENTF_LEFTDOWN时,表示按下左键,而MOUSEEVENTF_LEFTUP表示释放左键,并将相应的消息发送到系统;三个参数二、分别表示对应的模拟鼠标的x,y的位置,需要注意的测量是该参数对应于屏幕坐标;第五个参数四、不重要,通常也可以设置为0,0。有关Keybd_event和mouse_event函数的更多详细用法,请参考msdn。
mouse_even只能发送前台消息,该消息仅对当前活动的窗口有效。最好将其与SetCursorPos(x,y)函数一起使用。首先,调用SetCursorPos函数将鼠标位置设置为需要模拟鼠标操作的位置,然后调用mouse_event以模拟鼠标操作。这是mouse_event的示例代码:
POINT lpPoint; GetCursorPos(&lpPoint); SetCursorPos(lpPoint.x, lpPoint.y); mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
该示例代码代表双击鼠标。要表示一次单击,请使用两个mouse_events(一次释放,一次释放)。
上面介绍了两种常用的模拟鼠标操作的方法,下面给出一个完整的示例进行说明:
//在发送按键消息前需要设置下鼠标位置,扫雷程序似乎是根据鼠标位置
//确定点击的方块的,而不是鼠标消息的参数
//所以PostMessage在这里也不可以使用
::SetCursorPos(x,y);
//判断是否是雷,不是雷才执行鼠标点击动作
if(MineInf[acol*row+arow]==1){
/*::mouse_event(MOUSEEVENTF_RIGHTDOWN,x,y,0,0);
::mouse_event(MOUSEEVENTF_RIGHTUP,x,y,0,0); */
pWnd->SendMessage(WM_RBUTTONDOWN,0,(y<<16)|x);
pWnd->SendMessage(WM_RBUTTONUP,0,(y<<16)|x);
}else{
/*::mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
::mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);*/
pWnd->SendMessage(WM_LBUTTONDOWN,0,(y<<16)|x);
pWnd->SendMessage(WM_LBUTTONUP,0,(y<<16)|x);
}好的,这是目前使用最频繁的VC程序的两种鼠标事件模拟方案,读者可以根据实际情况选择使用它们。
使用mouse_event模拟鼠标事件时,程序窗口失去焦点并变为无效
最近,当使用mouse_event模拟鼠标事件时,令人头疼的是,在运行程序测试时,鼠标单击,双击和移动都可以。一旦可执行文件执行完毕,该窗口就会失去焦点,它将变得无效。
我只是根据Internet上提到的方法关闭了360。我尝试了,它确实发生了。解决了几天的麻烦,原来是原因。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-340117-1.html
我要被帅晕了o
中国宣布