扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这段代码没问题,我亲自验证过。
青川网站建设公司成都创新互联公司,青川网站设计制作,有大型网站制作公司丰富经验。已为青川近1000家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的青川做网站的公司定做!
或者你尝试我这段代码,效果应该明显:
#include Windows.h
#include stdlib.h
#include stdio.h
int main()
{
// 模拟Alt+Tab
keybd_event(VK_MENU, 0xb8, 0, 0); //Alt 按下
keybd_event(VK_TAB, 0x8f, 0, 0); // Tab 按下
while (1); // 停住观察
keybd_event(VK_TAB, 0x8f, KEYEVENTF_KEYUP, 0); // Tab 释放
keybd_event(VK_MENU, 0xb8, KEYEVENTF_KEYUP, 0); // Alt 释放
return 0;
}
keybd_event函数模拟了键盘输入。调用该函数会让系统触发WM_KEYUP或者WM_KEYDOWN事件。
函数原型是:
VOID WINAPI keybd_event(
_In_ BYTE bVk,
_In_ BYTE bScan,
_In_ DWORD dwFlags,
_In_ ULONG_PTR dwExtraInfo
);
首先最简单的但可以后台处理的有SendMessage()PostMessage()
发送鼠标,
键盘消息,
这个百度一搜n多了
然后中等级的模拟就是keyboard_eventmouse_event了这个比较用的比较多,
给个例子你
模拟键盘点击void
Press(UINT
key)
{
keybd_event(key,MapVirtualKey(key,
0),0,0);
keybd_event(key,MapVirtualKey(key,
0),KEYEVENTF_KEYUP,0);
}
模拟
鼠标左键单击mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
这里注意调用
keyboard_event
的时候一定要用MapVirtualKey
网上大部分的代码都是没用的,
这个函数时获取
硬件扫描码
的先说下keybd_event();函数的参数keybd_event(要模拟按下的虚拟按键码,
虚拟按键码对应的硬件扫描码,0,0);网上的代码大部分都有
虚拟按键码,
当然你运行大部分都是没问题的,
因为对于一般的程序而言是没问题的但有的程序为了防止
外挂
或者
防止其他程序恶意修改什么的,会对
鼠标键盘
消息进行检测,
如果检测到没有硬件扫描码会拒绝执行的
然后还有比较高级的就是SendInput模拟了void
OnSendCharCode(unsigned
short
unicode
=
0,unsigned
short
vcode
=
0,bool
bDown
=
false,bool
bUnicode
=
true);
void
OnSendCharCode(unsigned
short
unicode,unsigned
short
vcode,bool
bDown,bool
bUnicode)
{
unsigned
short
uNum
=
0;
//
v-code
Clicked
INPUT
事件设定
KEYBDINPUT
kDown;
KEYBDINPUT
kUp;
if(!bUnicode)
{
//
'A';
(Virtual
Code
只有大写),
要输入小写
//
Enter:
13,
Backspace:
8,
Up:38
kDown.wVk
=
kUp.wVk
=
vcode;
kDown.wScan
=
kUp.wScan
=
::MapVirtualKey(kDown.wVk,0);
//kDown.dwFlags
=
KEYEVENTF_EXTENDEDKEY;
kUp.dwFlags
=
KEYEVENTF_KEYUP;
}else{
kDown.wVk
=
kUp.wVk
=
0;
kDown.wScan
=
kUp.wScan
=
unicode;
kDown.dwFlags
=
KEYEVENTF_UNICODE;
kUp.dwFlags
=
KEYEVENTF_UNICODE
|
KEYEVENTF_KEYUP;
}
//
建立
KeyDown
事件
建立
KeyUP
事件
INPUT
inputKeyDown,
inputKeyUP;
inputKeyDown.type
=
inputKeyUP.type
=
INPUT_KEYBOARD;
//
指定
input
为
keyboard
kDown.time
=
kUp.time
=
0;
//
the
system
will
provide
its
own
time
stamp.
kDown.dwExtraInfo
=
kUp.dwExtraInfo
=
(WORD)::GetMessageExtraInfo();
inputKeyDown.ki
=
kDown;//
指定
键盘
属性结构
inputKeyUP.ki
=
kUp;
//
指定
键盘
属性结构
//
v-code
Clicked
INPUT
事件设定完成
//
将
INPUT
事件送到
Root
视窗,
系统会根据视窗位置,送给目标视窗
if(bDown)
{
INPUT
event[1]
=
{inputKeyDown};
uNum
=
::SendInput(1,event,
sizeof(INPUT));
}else{
INPUT
event[2]
=
{inputKeyDown,inputKeyUP};
uNum
=
::SendInput(2,event,
sizeof(INPUT));
}
}
//例子:
OnSendCharCode(0,VK_SHIFT,true,false);
OnSendCharCode(0,'A',false,false);
OnSendCharCode(0,VK_SHIFT,false,false);
OnSendCharCode(0,'A',false,false);
//KEYEVENTF_UNICODE
能区分大小写
OnSendCharCode('A');
OnSendCharCode('a');
不过还是有很多游戏,它是用
DirectX
技术去做的,这些大部分对他们没用所以还有最最最高级的模拟,
就是
对硬件驱动程序的模拟这个有个外国人写的
winio.h
的头文件,
有兴趣可以去学,
一般用不到的,
C语言模拟键盘代码如下:
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRszCmdLine,intiCmdShow)
{
MSGmsg;
if(!MyRegisterClass(hInstance))
{
returnFALSE;
}
if(!InitInstance(hInstance,iCmdShow))
{
returnFALSE;
}
while(GetMessage(msg,NULL,0,0))
{
TranslateMessage(msg);
DispatchMessage(msg);
}
returnmsg.wParam;
}
//函数:ShowKey
//作用:实现在窗口中显示按键信息
voidShowKey(HWNDhwnd,intiType,char*szMessage,WPARAMwParam,LPARAMlParam)
{
staticchar*szFormat[2]={"%-14s%3d%c%6u%4d%5s%5s%6s%6s",
"%-14s%3d%c%6u%4d%5s%5s%6s%6s"};
charszBuffer[80];
HDChdc;
ScrollWindowEx(hwnd,0,-yChar,rc,rc,NULL,NULL,SW_INVALIDATE);
hdc=GetDC(hwnd);
SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
TextOut(hdc,
xChar,
rc.bottom-yChar,
szBuffer,
wsprintfszBuffer,
szFormat[iType]。
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流