您的位置:首页 > 其它

vc模拟鼠标键盘操作实用类

2012-10-02 23:47 369 查看

//******************
类mk头文件mk.h **************************

#if !defined(AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_)

#define AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "winable.h"

class mk

{

public:

mk();

static void Key(BYTE k, int mSeconds=0);//按一个键,mSeconds表按键后到

//下一次操作延迟的时间:ms

static void Key2(BYTE k1, BYTE k2,int mSeconds=0);//按2个键

static void Key3(BYTE k1,BYTE k2,BYTE k3,int mSeconds=0);//按3个键

static void Click(int x,int y,int mSeconds=0);//单击

static void RClick(int x,int y,int mSeconds=0);//右击

static void DClick(int x,int y,int mSeconds=0);//双击

static void CtrlClick(int x, int y, int mSeconds=0);//Ctrl+单击

static
void Drag(int x1,int y1,int x2,int y2,int mSeconds=0);//鼠标拖动

virtual ~mk();

};

#endif // !defined(AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_)

//****************** 类mk头文件mk.h end**************************

//****************** 类mk实现文件mk.cpp **************************

#include "stdafx.h"

#include "mk.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

mk::mk()

{

}

mk::~mk()

{

}

void mk::Click(int x, int y, int mSeconds)

{

SetCursorPos(x,y);

mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);

mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

Sleep(mSeconds);

}

void mk::DClick(int x, int y, int mSeconds)

{

SetCursorPos(x,y);

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);

Sleep(mSeconds);

}

void mk::Drag(int x1, int y1, int x2, int
y2, int mSeconds)

{

SetCursorPos(x1,y1);

mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);

SetCursorPos(x2,y2);

mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

Sleep(mSeconds);

}

void mk::RClick(int x, int y, int mSeconds)

{

SetCursorPos(x,y);

mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);

mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);

Sleep(mSeconds);

}

void mk::Key(BYTE k, int mSeconds)

{

keybd_event(k,0,0,0);

keybd_event(k,0,KEYEVENTF_KEYUP,0);

Sleep(mSeconds);

}

void mk::Key2(BYTE k1, BYTE k2, int mSeconds)

{

//法1

//keybd_event(k1, 0, 0 ,0);

//keybd_event(k2, 0, 0 ,0);

//keybd_event(k2, 0, KEYEVENTF_KEYUP,0);

//keybd_event(k1, 0, KEYEVENTF_KEYUP,0);

//法2,更通用,但须先#include "winable.h"

INPUT input[4];

memset(input,0,sizeof(input));

input[0].type=input[1].type=input[2].type=input[3].type=INPUT_KEYBOARD;

input[0].ki.wVk=input[3].ki.wVk=k1;

input[1].ki.wVk=input[2].ki.wVk=k2;

input[2].ki.dwFlags = input[3].ki.dwFlags =
KEYEVENTF_KEYUP;

SendInput(4, input, sizeof(INPUT));

Sleep(mSeconds);

}

void mk::CtrlClick(int x, int y, int mSeconds)

{

SetCursorPos(x,y);

keybd_event(VK_CONTROL ,0,0,0);

mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);

mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);

Sleep(mSeconds);

}

void mk::Key3(BYTE k1, BYTE k2, BYTE k3, int
mSeconds)

{

if(k1==VK_CONTROL&&k2==VK_MENU&&k3==VK_DELETE)

ShellExecute(NULL,NULL,"taskmgr.exe",NULL,NULL,SW_SHOW);

else

{

INPUT input[6];

memset(input,0,sizeof(input));

input[0].type=input[1].type=input[2].type=input[3].type=input[4].type=input[5].type=INPUT_KEYBOARD;

input[0].ki.wVk=input[5].ki.wVk=k1;

input[1].ki.wVk=input[4].ki.wVk=k2;

input[2].ki.wVk=input[3].ki.wVk=k3;

input[3].ki.dwFlags=input[4].ki.dwFlags=input[5].ki.dwFlags=KEYEVENTF_KEYUP;

SendInput(6, input, sizeof(INPUT));

}

Sleep(mSeconds);

}

//****************** 类mk实现文件mk.cpp end**************************

===================================================================

VC模拟键盘操作

INPUT input[4];

memset(input, 0, sizeof(input));

//设置模拟键盘输入

input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;

input[0].ki.wVk = input[2].ki.wVk = VK_CONTROL;

input[1].ki.wVk = input[3].ki.wVk = VK_ESCAPE;

// 释放按键

input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(4, input, sizeof(INPUT));

*********************************************************************************

符号常量 十六进制值 指定的鼠标或键盘按键

  VK_LBUTTON 01 鼠标左键

  VK_RBUTTON 02 鼠标右键

  VK_CANCEL 03 Control-break 过程

  VK_MBUTTON 04 鼠标中键

  VK_BACK 08 BACKSPACE 键

  VK_TAB 09 TAB 键

  VK_CLEAR 0C CLEAR 键

  VK_RETURN 0D ENTER 键

  VK_SHIFT 10 SHIFT 键

  VK_CONTROL 11 CTRL 键

  VK_MENU 12 ALT 键

  VK_PAUSE 13 PAUSE 键

  VK_CAPITAL 14 CAPS LOCK 键

  VK_ESCAPE 1B ESC 键

  VK_SPACE 20 SPACEBAR

  VK_PRIOR 21 PAGE UP 键

  VK_NEXT 22 PAGE DOWN 键

  VK_END 23 END 键

  VK_HOME 24 HOME 键

  VK_LEFT 25 LEFT ARROW 键

  VK_UP 26 UP ARROW 键

  VK_RIGHT 27 RIGHT ARROW 键

  VK_DOWN 28 DOWN ARROW 键

  VK_SELECT 29 SELECT 键

  VK_EXECUTE 2B EXECUTE 键

  VK_SNAPSHOT 2C PRINT SCREEN键(用于Windows 3.0及以后版本)

  VK_INSERT 2D INS 键

  VK_DELETE 2E DEL 键

  VK_HELP 2F HELP 键

  ///////////////////////////////////////////////////

  对于字母键和非小键盘上的数字键,直接在单引号中加入该键就行.

  比如:a键:'A'

   1键:'1'

  //////////////////////////////////////////////

  VK_LWIN 5B Left Windows 键 (Microsoft自然键盘)

  VK_RWIN 5C Right Windows 键 (Microsoft自然键盘)

  VK_APPS 5D Applications 键 (Microsoft自然键盘)

  VK_NUMPAD0 60 数字小键盘上的 0 键

  VK_NUMPAD1 61 数字小键盘上的 1 键

  VK_NUMPAD2 62 数字小键盘上的 2 键

  VK_NUMPAD3 63 数字小键盘上的 3 键

  VK_NUMPAD4 64 数字小键盘上的 4 键

VK_NUMPAD5 65 数字小键盘上的 5 键

  VK_NUMPAD6 66 数字小键盘上的 6 键

  VK_NUMPAD7 67 数字小键盘上的 7 键

  VK_NUMPAD8 68 数字小键盘上的 8 键

  VK_NUMPAD9 69 数字小键盘上的 9 键

  VK_MULTIPLY 6A Multiply 键

  VK_ADD 6B Add 键

  VK_SEPARATOR 6C Separator 键

  VK_SUBTRACT 6D Subtract 键

  VK_DECIMAL 6E Decimal 键

  VK_DIVIDE 6F Divide 键

  VK_F1 70 F1 键

  VK_F2 71 F2 键

  VK_F3 72 F3 键

  VK_F4 73 F4 键

  VK_F5 74 F5 键

  VK_F6 75 F6 键

  VK_F7 76 F7 键

  VK_F8 77 F8 键

  VK_F9 78 F9 键

  VK_F10 79 F10 键

  VK_F11 7A F11 键

  VK_F12 7B F12 键

  VK_F13 7C F13 键

  VK_F14 7D F14 键

  VK_F15 7E F15 键

  VK_F16 7F F16 键

  VK_F17 80H F17 键

  VK_F18 81H F18 键

  VK_F19 82H F19 键

  VK_F20 83H F20 键

  VK_F21 84H F21 键

  VK_F22 85H F22 键

  VK_F23 86H F23 键

  VK_F24 87H F24 键

  VK_NUMLOCK 90 NUM LOCK 键

  VK_SCROLL 91 SCROLL LOCK 键

  VK_ATTN F6 Attn 键

  VK_CRSEL F7 CrSel 键

  VK_EXSEL F8 ExSel 键

  VK_EREOF F9 Erase EOF 键

VK_PLAY FA Play 键

  VK_ZOOM FB Zoom 键

  VK_OEM_CLEAR FE Clear 键

  

  举例:

  

  (一)响应单独的按键:

  先添加PreTranslateMessage()(响应WM_CHAR)也是同样的效果,因为本例只捕捉键盘)

  BOOL CMydilog::PreTranslateMessage(MSG* pMsg)

  {

   // TODO: Add your specialized code here and/or call the base class

   if (pMsg->message == WM_KEYDOWN)

   {

   if(pMsg->wParam=='M')//直接用上面的虚码代替就可以响应所指键

   MessageBox("hello");//如果按下M键弹出消息.比如想当按下小键盘1时

   //弹出就用VK_NUMPAD1代替'M'

  }

   return CDialog::PreTranslateMessage(pMsg);

  }

  (二)组合键的用法:(本例响应Ctrl+X键)

  BOOL CMydilog::PreTranslateMessage(MSG* pMsg)

  {

   // TODO: Add your specialized code here and/or call the base class

  

   if (pMsg->message == WM_KEYDOWN)

   {

   switch (pMsg->wParam)

   {

   case VK_ESCAPE:

   SetFocus ();

   return TRUE;

   case 'X':

   if(::GetKeyState(VK_CONTROL) < 0)//如果是Shift+X这里就

   //改成VK_SHIFT

   MessageBox("hello");

   return TRUE;

  

   }

   }

   return CDialog::PreTranslateMessage(pMsg);

  }

-------

模拟键盘我们用Keybd_event这个api函数,模拟鼠标按键用mouse_event函数。在VC里调用api函数是既简单又方便不过的事了。

  首先介绍一下Keybd_event函数。Keybd_event能触发一个按键事件,也就是说回产生一个WM_KEYDOWN或WM_KEYUP消息。当然也可以用产生这两个消息来模拟按键,但是没有直接用这个函数方便。Keybd_event共有四个参数,第一个为按键的虚拟键值,如回车键为 vk_return, tab键为vk_tab。第二个参数为扫描码,一般不用设置,用0代替就行第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成“KEYEVENTF_KEYUP”,第四个参数一般也是置0即可。用如下代码即可实现模拟按下键,其中的XX表示XX键的虚拟键值,在这里也就是各键对应的键码,如''A''=65

keybd_event(65,0,0,0);

keybd_event(65,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的示例代码:

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: