重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
可以,需要调用windowsAPI函数。
我们提供的服务有:网站设计制作、网站设计、微信公众号开发、网站优化、网站认证、商水ssl等。为上千多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的商水网站制作公司
头文件windows.h。
简单思路:
通过GetStdHandle获取标准输入句柄。
再通过ReadConsokeInput将输入信息存储到结构体类型INPUT_RECODE变量中。
再通过判断,截取到鼠标电击的事件。
具体API函数、参数、功能还有很多。需要网上找资料可以学。
我这里就简单写一个,鼠标点击控制台任意位置,并在该位置打印字符串。
#include stdio.h
#include windows.h
int main()
{
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
INPUT_RECORD inRec;
DWORD res;
COORD p0;
while(1)
{
ReadConsoleInput(hInput, inRec, 1, res);
if (inRec.EventType == MOUSE_EVENT inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //鼠标左键
{
p0.X=inRec.Event.MouseEvent.dwMousePosition.X;
p0.Y=inRec.Event.MouseEvent.dwMousePosition.Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);
printf("你在这里点击的左键\n");
}
}
return 0;
}
首先最简单的但可以后台处理的有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
的头文件,
有兴趣可以去学,
一般用不到的,
你是想问通过控制鼠标操作播放器播放歌(类似按键精灵那样重复用户操作)。还是直接播放音乐文件。
两种都需要window API支持。
一、直接播放文件,可用函数playSound,头文件windows.h和mmsystem.h。(注意不是支持所有文件格式)。
二、控制鼠标模拟操作:
1、鼠标点击操作可用SendInput函数或keybd_event函数。
2、鼠标移动可用SetCursorPos或mouse_event。
三、通过FundWindow函数获取播放软件的窗口句柄,再通过FindWindowEx遍历窗口下所有控件,直接对窗口控件发送消息。
可以
B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
关于后两个类型:
typedef UINT WPARAM;
typedef LONG LPARAM;
都是4字节
hWnd--要发给的程序句柄
Msg:
Msg=WM_MOUSEMOVE..鼠标移动事件
wParam:
MK_CONTROL ctrl键按下.
MK_LBUTTON 鼠标左键键按下.
MK_MBUTTON 鼠标中间键按下.
MK_RBUTTON 鼠标右键按下.
MK_SHIFT shift键按下.
lParam--高位当前鼠标y坐标,低位当前鼠标x坐标
比如给句柄为hWnd的程序队列发送一个鼠标移动信息,同时鼠标左键和中间处于按下状态,鼠标坐标为(120,100)
PostMessage(hWnd, WM_MOUSEMOVE ,MK_LBUTTON|MK_MBUTTON,(16100)|120);
如果是要发送数据,然后你在程序端自己处理的话,推荐用sendmessage函数,因为PostMessage只是把消息发送到程序的消息队列去,程序自动处理.就是说,如果接收消息的程序是你自己写,用sendmessage就可以,如果是别人写的程序,你要仿真一个事件给那个程序,那么就用PostMessage
如果用
SendMessage(Hwnd, WM_MOUSEMOVE , x, y);
其中
x:wParam,取值范围
MK_CONTROL Set if the ctrl key is down.
MK_LBUTTON Set if the left mouse button is down.
MK_MBUTTON Set if the middle mouse button is down.
MK_RBUTTON Set if the right mouse button is down.
MK_SHIFT Set if the shift key is down.
y:lParam,鼠标的坐标
xPos = LOWORD(lParam); //horizontal position of cursor
yPos = HIWORD(lParam); //vertical position of cursor
你就可以在程序里重载虚函数LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
switch(message)
{
case WM_MOUSEMOVE:
//写你要在鼠标移动时做的处理
break;
.....
}
CDialog::WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
}
CDialog::WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);是MFC自己的处理函数,最好加上,不然会很麻烦
很简单的SendMessage和postmessage一样使用方法