VC 模拟鼠标和键盘输入

VC 模拟鼠标和键盘输入
VC 模拟鼠标和键盘输入

VC 模拟鼠标和键盘输入 - 天下 - 博客频道 -

https://www.360docs.net/doc/0b13871121.html,

模拟鼠标点击:

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表示,这函数认为是当前鼠标所在的点--直接设定绝对坐标并单击

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分别是你要点击的点的横坐标和纵坐标

模拟键盘输入:

[cpp]

void EnterString(const char* text) { bool bShift = false; size_t length = strlen(text);

for(size_t index = 0;index < length;index++) { int val = text[index];

if(val >= 97 && val <= 122) //小写a-z {

val -= 32; bShift = false; } else if(val

>= 65 && val <= 90) //大写A-Z { bShift = true;

} else if(val >= 48 && val <= 57) //数字0-9 { bShift = false; } else //特殊符号

{ switch(val) { case '`':

val = 192; bShift = false;

break; case '~': val = 192;

bShift = true; break; case '!':

val = '1'; //!和1在同一个键盘,使用同一个键盘码,以下相同

bShift = true; break; case '@': val = '2'; //@和2在同一个键盘,使用同一个键盘码,以下相同

bShift = true; break; case '#': val = '3'; bShift = true;

break; case '$': val = '4';

bShift = true; break; case '%':

val = '5'; bShift = true;

break; case '^': val = '6';

bShift = true; break; case '&':

val = '7'; bShift = true;

break; case '*': val = '8';

bShift = true; break; case '(':

val = '9'; bShift = true;

break; case ')': val = '0';

bShift = true; break; case '-':

val = 189; bShift = false;

break; case '=': val = 187;

bShift = false; break; case '_':

val = 189; bShift = true;

break; case '+': val = 187;

bShift = true; break; case '[':

val = 219; bShift = false;

break; case '{': val = 219;

bShift = true; break; case ']':

val = 221; bShift = false;

break; case '}': val = 221;

bShift = true; break; case '\\':

val = 220; bShift = false;

break; case '|': val = 220;

bShift = true; break; case ';':

val = 186; bShift = false;

break; case ':': val = 186;

bShift = true; case '\'': val = 222; bShift = false; break; case

'\"': val = 222; bShift = true;

break; case ',': val = 188;

bShift = false; break; case '<': val = 188; bShift = true;

break; case '.': val = 190;

bShift = false; break; case '>':

val = 190; bShift = true;

break; case '/': val = 191;

bShift = false; break; case '?':

val = 191; bShift = true;

break; default: break;

} } if(bShift)

keybd_event(VK_SHIFT,0,0,0); keybd_event(val,0,0,0);

keybd_event(val,0,KEYEVENTF_KEYUP,0); if(bShift)

keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0); } }但是要注意,如果用户默认是中文输入法,那我们得先想办法切换到英文输入法才行。

到网上看到一篇文章,说的是在WinCE下的法:

https://www.360docs.net/doc/0b13871121.html,/iVincentFeng/archive/2010/04/20/KeyboardInput Simulation_SendMessage_keybd_event_PostKeybdMessage.html

但是后来发现,如果我们想写入中文字符,怎么办呢??

我开始的思路是像控制输入法的切换状态,来实现。。。其实,我们只需找到我们需要输入的控件,然后填入中文字符就行了。

我用"按键精灵"找到控件的名称等相关信息,然后用下面的代码来遍历,之后填充数据即可。

[cpp]

wchar_t sPath[]=_T("niha风范股份围观"); CWnd * pWnd =

FindWindow(NULL,_T("另存为")); CString sCtrlName; CWnd *pedit;

CString filename; wchar_t *buf=new wchar_t[512]; if(pWnd) {

CWnd *pwnd=pWnd->GetWindow(GW_CHILD);//枚举保存对话框的所有子控件

while(pwnd!=NULL) {

::GetClassName(pwnd->GetSafeHwnd(),buf,512);//得到枚举的控件是什么类型的,

CString str=buf; str.TrimRight();

if(str==_T("ComboBoxEx32"))//如果枚举到保存文件名的EDIT

{ pedit=pwnd;//保存EDIT句柄用来发消息

pwnd-

>SendMessage(WM_SETTEXT,sizeof(sPath)/sizeof(wchar_t),(LPARAM)(void*)sPath);

UpdateData(FALSE); break; }

pwnd = pwnd->GetNextWindow(); }

} delete [] buf; SetCursorPos(512+r2.left,366+r2.top);//按钮【保存】

mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );

想想,如果把坐标的操作全部转化为控件指针来处理,也许更安全,这样,不管客户那边的分辨率和中途改变窗口,我们的操作依然正确。

下面是附带的一点代码:

[cpp]

if(str=="保存(&S)")//如果是保存按钮{

lstrcpy(BUF,(LPCTSTR)sPath);//sPath表示我们要设置的对话框浏览目录//发消息设置文件名EDIT为我们的路径名,完成第二步pedit-

>SendMessage(WM_SETTEXT,0,(LPARAM)BUF); //发消息模拟点击保存按钮,完成第三步::SendMessage(pwnd->GetSafeHwnd(),WM_LBUTTONDOWN,0,0);

::SendMessage(pwnd->GetSafeHwnd(),WM_LBUTTONUP,0,0); }

[cpp]

//发消息还原EDIT里的文件名,完工! pedit-

>SendMessage(WM_SETTEXT,0,(LPARAM)filename);

附带一个链接,自认为比较好的一篇文章:点击打开链接

OK ,就此为止,有什么不正确的地方,欢迎大家指正,共同进步..!!!

查看文档来源:https://www.360docs.net/doc/0b13871121.html,/ypist/article/details/7472703

鼠标点击按钮图片切换+自动切换+左右按钮点击切换效果

鼠标点击按钮图片切换+自动切换+左右按钮点击切换效果 上一次在我的文库中分享了点击按钮,图片左右切换轮播效果代码,今天主要是分享【鼠标点击按钮,图片进行切换+图片自动切换+点击左右按钮图片进行切换的三种效果的组合代码】。 最后的效果如下: Html代码部分: 图片轮播效果制作

Css代码部分: *{margin:0px;padding:0px}

c# 调用api实现模拟键盘输入举例(向QQ对话框发送字符串)

//调用API模拟键盘事件 usingSystem; usingSystem.Collections.Generic; https://www.360docs.net/doc/0b13871121.html,ponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Diagnostics; usingMicrosoft.Win32; usingSystem.Runtime.InteropServices;//这个必须要引用 namespaceWindowsFormsApplication2{publicpartialclassForm1:Form{publicFor m1(){InitializeComponent();}//需要调用的API //找到窗口(进程名称可空,窗口名称) [System.Runtime.InteropServices.DllImport("user 32.dll",EntryPoint ="FindWindow")] publicstaticexternIntPtrFindWindow(stringlpClassName,stringlpWindowName); //把窗口放到最前面 [DllImport("USER 32.DLL")] publicstaticexternboolSetForegroundWindow(IntPtrhWnd);//模拟键盘事件

[DllImport("User 32.dll")] publicstaticexternvoidkeybd_event(BytebVk,BytebScan,Int32dwFlags,Int32dwEx traInfo); //释放按键的常量 privateconstintKEYEVENTF_KEYUP = 2; //发送消息 [DllImport("user 32.dll")] privatestaticexternintSendMessage(IntPtrhWnd,intMsg,intwParam,intlParam); [DllImport("user 32.dll")]//获取窗口大小 [return: MarshalAs(UnmanagedType.Bool)] staticexternboolGetWindowRect(IntPtrhWnd,refRECTlpRect);[StructLayout(Layo utKind.Sequential)]//获取窗口坐标 publicstructRECT{publicintLeft;//最左坐标 publicintTop;//最上坐标 publicintRight;//最右坐标 publicintBottom;//最下坐标}////显示窗口 //[DllImport("user 32.dll")]

鼠标事件:鼠标点击出现下拉菜单,很基础的一个特效。

鼠标事件:鼠标点击出现下拉菜单,很基础的一个特效。 先上代码