可以,需要調(diào)用windowsAPI函數(shù)。
我們提供的服務(wù)有:網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、商水ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的商水網(wǎng)站制作公司
頭文件windows.h。
簡單思路:
通過GetStdHandle獲取標準輸入句柄。
再通過ReadConsokeInput將輸入信息存儲到結(jié)構(gòu)體類型INPUT_RECODE變量中。
再通過判斷,截取到鼠標電擊的事件。
具體API函數(shù)、參數(shù)、功能還有很多。需要網(wǎng)上找資料可以學(xué)。
我這里就簡單寫一個,鼠標點擊控制臺任意位置,并在該位置打印字符串。
#include?stdio.h
#include?windows.h
int?main()
{
HANDLE?hInput?=?GetStdHandle(STD_INPUT_HANDLE);?//?獲取標準輸入設(shè)備句柄
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()
發(fā)送鼠標,
鍵盤消息,
這個百度一搜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);
這里注意調(diào)用
keyboard_event
的時候一定要用MapVirtualKey
網(wǎng)上大部分的代碼都是沒用的,
這個函數(shù)時獲取
硬件掃描碼
的先說下keybd_event();函數(shù)的參數(shù)keybd_event(要模擬按下的虛擬按鍵碼,
虛擬按鍵碼對應(yīng)的硬件掃描碼,0,0);網(wǎng)上的代碼大部分都有
虛擬按鍵碼,
當然你運行大部分都是沒問題的,
因為對于一般的程序而言是沒問題的但有的程序為了防止
外掛
或者
防止其他程序惡意修改什么的,會對
鼠標鍵盤
消息進行檢測,
如果檢測到?jīng)]有硬件掃描碼會拒絕執(zhí)行的
然后還有比較高級的就是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
事件設(shè)定
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;//
指定
鍵盤
屬性結(jié)構(gòu)
inputKeyUP.ki
=
kUp;
//
指定
鍵盤
屬性結(jié)構(gòu)
//
v-code
Clicked
INPUT
事件設(shè)定完成
//
將
INPUT
事件送到
Root
視窗,
系統(tǒng)會根據(jù)視窗位置,送給目標視窗
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
能區(qū)分大小寫
OnSendCharCode('A');
OnSendCharCode('a');
不過還是有很多游戲,它是用
DirectX
技術(shù)去做的,這些大部分對他們沒用所以還有最最最高級的模擬,
就是
對硬件驅(qū)動程序的模擬這個有個外國人寫的
winio.h
的頭文件,
有興趣可以去學(xué),
一般用不到的,
你是想問通過控制鼠標操作播放器播放歌(類似按鍵精靈那樣重復(fù)用戶操作)。還是直接播放音樂文件。
兩種都需要window API支持。
一、直接播放文件,可用函數(shù)playSound,頭文件windows.h和mmsystem.h。(注意不是支持所有文件格式)。
二、控制鼠標模擬操作:
1、鼠標點擊操作可用SendInput函數(shù)或keybd_event函數(shù)。
2、鼠標移動可用SetCursorPos或mouse_event。
三、通過FundWindow函數(shù)獲取播放軟件的窗口句柄,再通過FindWindowEx遍歷窗口下所有控件,直接對窗口控件發(fā)送消息。
可以
B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
關(guān)于后兩個類型:
typedef UINT WPARAM;
typedef LONG LPARAM;
都是4字節(jié)
hWnd--要發(fā)給的程序句柄
Msg:
Msg=WM_MOUSEMOVE..鼠標移動事件
wParam:
MK_CONTROL ctrl鍵按下.
MK_LBUTTON 鼠標左鍵鍵按下.
MK_MBUTTON 鼠標中間鍵按下.
MK_RBUTTON 鼠標右鍵按下.
MK_SHIFT shift鍵按下.
lParam--高位當前鼠標y坐標,低位當前鼠標x坐標
比如給句柄為hWnd的程序隊列發(fā)送一個鼠標移動信息,同時鼠標左鍵和中間處于按下狀態(tài),鼠標坐標為(120,100)
PostMessage(hWnd, WM_MOUSEMOVE ,MK_LBUTTON|MK_MBUTTON,(16100)|120);
如果是要發(fā)送數(shù)據(jù),然后你在程序端自己處理的話,推薦用sendmessage函數(shù),因為PostMessage只是把消息發(fā)送到程序的消息隊列去,程序自動處理.就是說,如果接收消息的程序是你自己寫,用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
你就可以在程序里重載虛函數(shù)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自己的處理函數(shù),最好加上,不然會很麻煩
很簡單的SendMessage和postmessage一樣使用方法
網(wǎng)頁題目:c語言鼠標功能函數(shù) c語言鼠標操作
文章來源:http://chinadenli.net/article34/hpepse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、動態(tài)網(wǎng)站、標簽優(yōu)化、Google、云服務(wù)器、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)