用什么API函数可模拟api 鼠标点击击而不影响其他程序工作?

用程序模拟键盘和鼠标键盘用程序模拟键盘和鼠标键盘
  在Windows大行其道的今天,windows界面程序受到广大用户的欢迎。对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制。有时,对于繁杂的,或重复性的操作,我们能否通过编制程序来代替手工输入,而用程序来模拟键盘及鼠标的输入呢?答案是肯定的。这主要是通过两个API函数来实现的。     下面以Delphi为例来介绍一下如何实现这两个功能。模拟键盘我们用Keybd_event这个api函数,模拟鼠标按键用mouse_event函数。大家不用担心,在delphi里调用api函数是很方便的事。     先介绍一下Keybd_event函数。Keybd_event能触发一个按键事件,也就是说回产生一个WM_KEYDOWN或WM_KEYUP消息。当然也可以用产生这两个消息来模拟按键,但是没有直接用这个函数方便。Keybd_event共有四个参数,第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab。第二个参数为扫描码,一般不用设置,用0代替就行。第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成“KEYEVENTF_KEYUP”,第四个参数一般也是置0即可。用如下代码即可实现模拟按下i键,其中的$49表示i键的虚拟键值: keybd_event($49,0,0,0); keybd_event($49,0,KEYEVENTF_KEYUP,0); ...       mouse_event最好配合setcursorpos(x,y)函数一起使用,与Keybd_event类似,mouse_event有五个参数,第一个为选项标志,为MOUSEEVENTF_LEFTDOWN时表示左键按下,为MOUSEEVENTF_LEFTUP表示左键松开,向系统发送相应消息。第二三个参数分别表示x,y相对位置,一般可设为0,0,第四五个参数并不重要,一般也可设为0,0。若要得到Keybd_event和mouse_event函数的更详细的用法,可以查阅msdn或delphi帮助。下面是关于mouse_event的示例代码: setcursorpos(20,132);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); ...    上面的代码表示鼠标的双击,若要表示单击,用两个mouse_event即可(一次放下,一次松开)。     注意,不管是模拟键盘还是鼠标事件,都要注意还原,即按完键要松开,一个keydown对应一个keyup;鼠标单击 完也要松开, 不然可能影响程序的功能。      好了,希望本文能让你对模拟键盘和鼠标按键有个初步的了解,如果想更深入的了解其中的奥妙,可以查阅详实的msdn在线帮助,并多多动手实践。如果对程序有不明白的地方,可以到下载相应的源程序。模拟鼠标事件的实现思路及代码
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了模拟鼠标事件的实现思路及代码,有需要的朋友可以参考一下
模拟鼠标事件,一般可以通过mouse_event()和SendInPut()两种方法。mouse_event()在windows后期版本中逐渐被SendInPut()取代。SendInPut()模拟鼠标移动的事件中,标志位取值不同,输入坐标的意义也不同。简单来说就是,添加MOUSEEVENTF_ABSOLUTE标志位表示鼠标移动是通过绝对坐标定位,此时的坐标要通过转换。光标在屏幕中被分成65535个小块,可以通过如下转换:
代码如下:double fx = x *(65535.0f / fScreenWidth);double fy = y *(65535.0f / fScreenHeight);
若不使用MOUSEEVENTF_ABSOLUTE标志位,则坐标是相对前一坐标的位移。
SendInPut()鼠标时间使用结构如下:
代码如下:typedef struct tagMOUSEINPUT {&&& LONG&&&&&& LONG&&&&&& DWORD&& mouseD&&& DWORD&& dwF&&& DWORD&&&&& ULONG_PTR dwExtraI} MOUSEINPUT, *PMOUSEINPUT, FAR* LPMOUSEINPUT;
msdn中完整解释如下:&&&& dx 鼠标的绝对位置,或自上次鼠标事件的运动量产生的dwFlags成员的值而定。鼠标的x坐标被指定为绝对的数据,相对于被指定为数据的移动像素数。&&&& dy 鼠标的绝对位置,或自上次鼠标事件的运动量产生的dwFlags成员的值而定。鼠标的y坐标被指定为绝对的数据,相对于被指定为数据的移动像素数。&&&& mouseData 如果dwFlags中包含MOUSEEVENTF_WHEEL,mouseData指定滚轮运动的量。正值表示滚轮向前旋转,即远离用户,负值表示滚轮向后旋转,即朝向用户。滚轮被定义为WHEEL_DELTA,这是120。
&&&& 下面代码演示了鼠标的几个具体操作。&&&& 1、我怎样才能在应用程序中模拟鼠标事件?
&&&& 有两个API函数可以使用:mouse_event()和SendInput();
&&&& 2、应该使用哪个API函数?
&&&& 在Windows NT/2000/XP中,mouse_event()函数已经被SendInput()函数已被取代的。因此,在这些操作系统上,你应该使用SendInput()函数。(除非你需要提供向后兼容性与Windows98等)。
&&&& 3、如何使用SendInput()函数来模拟点击鼠标左键?
代码如下:void LeftClick ( ){& &&& INPUT&&& Input={0};&&& // 左键按下&&& Input.type&&&&& = INPUT_MOUSE;&&& Input.mi.dwFlags& = MOUSEEVENTF_LEFTDOWN;&&& ::SendInput(1,&Input,sizeof(INPUT));
&&& // 左键抬起&&& ::ZeroMemory(&Input,sizeof(INPUT));&&& Input.type&&&&& = INPUT_MOUSE;&&& Input.mi.dwFlags& = MOUSEEVENTF_LEFTUP;&&& ::SendInput(1,&Input,sizeof(INPUT));}
4、如何使用SendInput()函数来模拟点击鼠标右键?
代码如下:void RightClick ( ){& &&& INPUT&&& Input={0};&&& // 右键按下&&& Input.type&&&&& = INPUT_MOUSE;&&& Input.mi.dwFlags& = MOUSEEVENTF_RIGHTDOWN;&&& ::SendInput(1,&Input,sizeof(INPUT));
&&& // 右键抬起&&& ::ZeroMemory(&Input,sizeof(INPUT));&&& Input.type&&&&& = INPUT_MOUSE;&&& Input.mi.dwFlags& = MOUSEEVENTF_RIGHTUP;&&& ::SendInput(1,&Input,sizeof(INPUT));}
5、如何使用SendInput()函数模拟鼠标的移动? 代码如下:void MouseMove (int x, int y ){& &&& double fScreenWidth&&& = ::GetSystemMetrics( SM_CXSCREEN )-1; &&& double fScreenHeight& = ::GetSystemMetrics( SM_CYSCREEN )-1; &&& double fx = x*(65535.0f/fScreenWidth);&&& double fy = y*(65535.0f/fScreenHeight);&&& INPUT& Input={0};&&& Input.type&&&&& = INPUT_MOUSE;&&& Input.mi.dwFlags& = MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE;&&& Input.mi.dx =&&& Input.mi.dy =&&& ::SendInput(1,&Input,sizeof(INPUT));}6、如何使用SendInput()函数来模拟点击鼠标中键?
代码如下:void MiddleClick(){&&& INPUT&&& Input={0};&&& // 设置滚轮量&&& Input.type&&&&& = INPUT_MOUSE;&&& Input.mi.dwFlags& = MOUSEEVENTF_WHEEL;&&& Input.mi.mouseData = 500;&&& ::SendInput(1,&Input,sizeof(INPUT));}
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具下次自动登录
现在的位置:
& 综合 & 正文
模拟键盘鼠标的API,写压力测试程序常用于模拟点击
最近用mouse_event写wince6下面的模拟触摸笔单击动作,但是一直不成功。下面是参考资料!
keybd_event  函数功能:该函数合成一次击键事件。系统可使用这种合成的击键事件来产生WM_KEYUP或WM_KEYDOWN消息,键盘驱动的中断处理程序调用keybd_event函数。在Windows NT中该函数己被使用Sendlhput来替代它。
  函数原型;VOID keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,DWORD dwExtralnfo);
  参数:
  bVk:定义一个虚据拟键码。键码值必须在1~254之间。
  bScan:定义该键的硬件扫描码。
  dwFlags:定义函数操作的名个方面的一个标志位集。应用程序可使用如下一些预定义常数的组合设置标志位。
  KEYEVENTF_EXETENDEDKEY:若指定该值,则扫描码前一个值为OXEO(224)的前缀字节。KEYEVENTF_KEYUP:若指定该值,该键将被释放;若未指定该值,该键交被接下。dwExtralnfo:定义与击键相关的附加的32位值。
  返回值:该函数无返回值。
  备注:尽管keybd_event传递一个与OEM相关的硬件扫描码给系统,但应用程序不能用此扫描码。系统在内部将扫描码转换成虚拟键码,并且在传送给应用程序前清除键码的UP/down位。应用程序可以摸拟PRINTSCREEN键的按下来获得一个屏幕快照,并把它存放到剪切板中。若要做到这一点,则要将keybd_event的bVk参数置为VK_SNAPSHOT,bScan参数置为 0(用以获得全屏快照)或hScan置为1(仅获得活动窗口的快照)。Windows CE:WindowsCE支持dwFlags参数附加的标志位。即使用KEYEVENTF_SILENT标志模拟击键,而不产生敲击的声音。
Windows CE不支持KEYEVENTF_EXTENDEDKEY标志。
  速查:Windows NT:3.1及以上版本;Windows:95及以上版本 ;Windows CE:1.0及以上版本;头文件:winuser.h;库文件:user32.lib。  
mouse_event  函数功能:该函数综合鼠标击键和鼠标动作。
  函数原型:
  VOID mouse_event(
  DWORD dwFlags, // motion and click options
  DWORD dx, // horizontal position or change
  DWORD dy, // vertical position or change
  DWORD dwData, // wheel movement
  ULONG_PTR dwExtraInfo // application-defined information
  参数:
  dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。此参数里的各位可以是下列值的任何合理组合:
  MOUSEEVENTF_ABSOLUTE:表明参数dX,dy含有规范化的绝对坐标。如果不设置此位,参数含有相对数据:相对于上次位置的改动位置。此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分。
  MOOSEEVENTFMOVE:表明发生移动。
  MOOSEEVENTF_LEFTDOWN:表明接按下鼠标左键。
  MOOSEEVENTF_LEFTUP:表明松开鼠标左键。
  MOOSEEVENTF_RIGHTDOWN:表明按下鼠标右键。
  MOOSEEVENTF_RIGHTUP:表明松开鼠标右键。
  MOOSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。
  MOOSEEVENTF_MIDDLEUP:表明松开鼠标中键。
  MOOSEEVENTF_WHEEL:在Windows NT中如果鼠标有一个轮,表明鼠标轮被移动。移动的数量由dwData给出。
  dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于 MOOSEEVENTF_ABSOLOTE的设置。给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。
  dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLVTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的mickeys数。
  dwData:如果dwFlags为MOOSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。
  如果dwFlagsS不是MOOSEEVENTF_WHEEL,则dWData应为零。
  dwExtralnfo:指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessgeExtrajnfo来获得此附加信息。
  返回值:无。
  备注:如果鼠标被移动,用设置MOUSEEVENTF_MOVE来表明,dX和dy保留移动的信息。给出的信息是绝对或相对整数值。
  如果指定了MOWSEEVENTF_ABSOLOTE值,则dX和dy含有标准化的绝对坐标,其值在0到65535之间。事件程序将此坐标映射到显示表面。坐标(0,0)映射到显示表面的左上角,()映射到右下角。
  如果没指定MOWSEEVENTF_ABSOLOTE,dX和dy表示相对于上次鼠标事件产生的位置(即上次报告的位置)的移动。正值表示鼠标向右(或下)移动;负值表示鼠标向左(或上)移动。
  鼠标的相对移动服从鼠标速度和加速度等级的设置,一个最终用户用鼠标控制面板应用程序来设置这些值,应用程序用函数SystemParameterslnfo来取得和设置这些值。
  在应用加速时系统对指定相对鼠标移动提供了两个测试。如果指定的沿X轴y轴的距离比第一个鼠标阈值大,并且鼠标的加速等级非零,则操作系统将距离加倍。如果指定的沿X轴或y轴的距离比第二个鼠标阈值大,并且鼠标的加速等级为2,则操作系统将从第一个阈测试得来的距离加倍。这样就允许操作系统将指定鼠标沿X轴或y轴的相对位移加到4倍。
  一旦应用了加速,系统用期望的鼠标速度换算合成的值。鼠标速度的范围是从1(最慢)到20(最快),并代表基于鼠标移动的距离指示符移动的数量。缺省值是10,表示对鼠标的移动设有附加的修改。
  函数mouse_event需要用的应用程序用来合成鼠标事件。也被应用程序用来取得鼠标位置和鼠标按键状态之外的鼠标信息。例如,如果输入板制造商想将基于画笔的信息传给自己的应用程序,可以写一个直接与输入板硬件通信的动态键接库(DLL),获得附加的信息,并保存到一个队列中。DLL然后调用mouse_event,用标准按键和x/y位置数据,并在参数dwExtralnfo设置排列的附加信息的指针或索引。当应用程序需要附加信息时,调用DLL(连同存贮在dwEXtralnfo中的指针或索引),则DLL返回附加信息。
  Windows CE:Windows CE不支持参数 dwFlags取MOOSE EVENTF WHEEL常数。
系统要求:
Windows CE 2.0 and later.
Winuser.h.
Wmgr_c.lib, Uibase.lib.
函数功能:
发送键盘输入。可以一次发送多个输入。
第1个参数:
UINT nInputs
输出结构量的个数。
第2个参数:
LPINPUT pInputs
指向包含多个INPUT结构的缓冲区的指针。
第3个参数:
int cbSize
每个INPUT结构的大小。如果这个参数出错函数将出错。
返回插入的键盘,鼠标事件的个数。
typedef struct tagINPUT {
MOUSEINPUT
// 模拟鼠标输入的结构
KEYBDINPUT
// 模拟键盘结构的定义
HARDWAREINPUT
// 模拟类型
} INPUT, *PINPUT, FAR* LPINPUT;
typedef struct tagMOUSEINPUT {
DWORD mouseD
// 当dwFlags不是 MOUSEEVENTF_WHEEL
// MOUSEEVENTF 搂主讲的很详细了这里就不说了
单步的时间
ULONG_PTR dwExtraI
} MOUSEINPUT, *PMOUSEINPUT;
typedef struct tagKEYBDINPUT {
// 虚拟键值
// 扫描方式
// KEYEVENTF_EXTENDEDKEY 和 KEYEVENTF_KEYUP
ULONG_PTR dwExtraI
} KEYBDINPUT, *PKEYBDINPUT;
// 模拟 Ctrl + Alt + Del 按钮调用 WinCE 任务管理器
tagINPUT Inputs[6];
Inputs[0].type = INPUT_KEYBOARD;
Inputs[0].ki.wVk = VK_CONTROL;
Inputs[0].ki.dwFlags = 0;
Inputs[1].type = INPUT_KEYBOARD;
Inputs[1].ki.wVk = VK_MENU;
Inputs[1].ki.dwFlags = 0;
Inputs[2].type = INPUT_KEYBOARD;
Inputs[2].ki.wVk = VK_DELETE;
Inputs[2].ki.dwFlags = 0;
Inputs[3].type = INPUT_KEYBOARD;
Inputs[3].ki.wVk = VK_DELETE;
Inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
Inputs[4].type = INPUT_KEYBOARD;
Inputs[4].ki.wVk = VK_MENU;
Inputs[4].ki.dwFlags = KEYEVENTF_KEYUP;
Inputs[5].type = INPUT_KEYBOARD;
Inputs[5].ki.wVk = VK_CONTROL;
Inputs[5].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(6,Inputs,sizeof(tagINPUT));
可喜可贺,终于测试可以用了,现在它乖乖的自动点击屏幕了,为了其他同学使用,我把这个功能封装成为了一个函数。
你调用MouseClickAt(49,56);
就等于用你的爪爪单击(down and up)了坐标为49,56的点,0,0在左上角。
function:MouseClickAt
return: void
parameters:
g_x: The true x pix
g_y: The true y pix.
void MouseClickAt(int g_x,int g_y)
int dx = g_x * 65535 / 800;
//把实际坐标换算成为绝对坐标,0-65535
int dy = g_y * 65535 / 600;
mouse_event(MOUSEEVENTF_TOUCH,dx,dy,0,0);
//之前可能就是没有这句话导致问题,在xp上可能不要,但是wince下必须,我是ce6的实验。
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,dx,dy,0,0);
Sleep(200);
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,dx,dy,0,0);
----------------------------------------------
-----------------------------------------------
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 c 模拟鼠标点击 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信