十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
可以,需要調(diào)用windowsAPI函數(shù)。
創(chuàng)新互聯(lián)基于成都重慶香港及美國等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)服務(wù)器托管報價,主機(jī)托管價格性價比高,為金融證券行業(yè)成都服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。
頭文件windows.h。
簡單思路:
通過GetStdHandle獲取標(biāo)準(zhǔn)輸入句柄。
再通過ReadConsokeInput將輸入信息存儲到結(jié)構(gòu)體類型INPUT_RECODE變量中。
再通過判斷,截取到鼠標(biāo)電擊的事件。
具體API函數(shù)、參數(shù)、功能還有很多。需要網(wǎng)上找資料可以學(xué)。
我這里就簡單寫一個,鼠標(biāo)點擊控制臺任意位置,并在該位置打印字符串。
#include?stdio.h
#include?windows.h
int?main()
{
HANDLE?hInput?=?GetStdHandle(STD_INPUT_HANDLE);?//?獲取標(biāo)準(zhǔn)輸入設(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)?//鼠標(biāo)左鍵
{
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ā)送鼠標(biāo),
鍵盤消息,
這個百度一搜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);
}
模擬
鼠標(biāo)左鍵單擊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)上的代碼大部分都有
虛擬按鍵碼,
當(dāng)然你運行大部分都是沒問題的,
因為對于一般的程序而言是沒問題的但有的程序為了防止
外掛
或者
防止其他程序惡意修改什么的,會對
鼠標(biāo)鍵盤
消息進(jìn)行檢測,
如果檢測到?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ù)視窗位置,送給目標(biāo)視窗
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é),
一般用不到的,
我之前給別人寫過一個打地鼠的小游戲,就是用鼠標(biāo)操作的。發(fā)給你參考下。代碼很簡單。
主要函數(shù)我在下方說明了,但更多信息你必須自己百度看,一言兩語說不完。
SetConsoleCursorPosition函數(shù)可以定位光標(biāo)位置,也就是文字內(nèi)容顯示的起點。
ReadConsoleInput(HANDLE hConsoleInput,*INPUT_RECORD lpBuffer,DWORD nLength,
DWORD lpNumberOfEventsRead)函數(shù)可以獲取鼠標(biāo)的操作信息。
調(diào)用過上面函數(shù)后,lpBuffer由于是傳址,所以其地址里的值就包含了鼠標(biāo)信息。
lpBuffer.EventType == MOUSE_EVENT //判斷是鼠標(biāo)事件
lpBuffer.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED//判斷是鼠標(biāo)左鍵點擊
兩個判斷一起就是鼠標(biāo)左鍵點擊的判斷,其他事件參數(shù)你可以自己網(wǎng)上找。
#include?stdio.h
#include?stdlib.h
#include?windows.h
#include?conio.h
#include?time.h
#include?string.h
#include?malloc.h
#define?gSizek?30//區(qū)域大小寬度
#define?gSizeg?20//區(qū)域大小高度
#define?gBegin?3//活動區(qū)域起始行
int?main()
{
int?t=0,s0,s1,i,j,count=0,fen=0,row=0,clo=0;
char?gameA[gSizeg][gSizek+1],fSave[10]={0};
SetConsoleTitle("打地鼠");
HANDLE?hInput?=?GetStdHandle(STD_INPUT_HANDLE);?//?獲取標(biāo)準(zhǔn)輸入設(shè)備句柄
INPUT_RECORD?inRec;
DWORD?res;
COORD?p0;
p0.X=0;
p0.Y=0;
srand(time(0));
s0=?time(NULL);
strcpy(gameA[0],"????????????GAME");
strcpy(gameA[1],"未命中次數(shù):0,計分:000000");
for(i=gBegin-1;igSizeg;i++)
{
for(j=0;jgSizek+1;j++)
{
if(igBegin-1??igSizeg-1??j0??jgSizek-1)
gameA[i][j]='?';
else
gameA[i][j]=4;
if(j==gSizek)
gameA[i][j]=0;
}
}
for(i=0;igSizeg;i++)
printf("%s\n",gameA[i]);
while?(1)
{
if(t=3)
{
if(row0??clo0)
gameA[row][clo]='?';
row=rand()%(gSizeg-1);
clo=rand()%(gSizek-1);
s0=?time(NULL);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);
if(row3)
row=4;
if(clo1)
clo=1;
gameA[row][clo]=2;
for(i=0;igSizeg;i++)
{
//gameA[i][gSizeg+1]=0;
printf("%s\n",gameA[i]);
}
}
if(count==3)
{
p0.X=10;
p0.Y=8;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);
printf("GAME?OVER!");
break;
}
s1=?time(NULL);
t=s1-s0;
ReadConsoleInput(hInput,?inRec,?1,?res);
if?(inRec.EventType?==?MOUSE_EVENT??inRec.Event.MouseEvent.dwButtonState?==?FROM_LEFT_1ST_BUTTON_PRESSED)?//鼠標(biāo)左鍵
{
if(inRec.Event.MouseEvent.dwMousePosition.X==clo??inRec.Event.MouseEvent.dwMousePosition.Y==row)
{
if(fen==0)
fen=1;
if(fen999999)
fen=999999;
else
fen=fen*2;
sprintf(fSave,"%06d",fen);
gameA[1][18]=0;
strcat(gameA[1],fSave);
}
else
{
count++;
fen=0;
gameA[1][11]=count+'0';
}
t=4;
}
}
while(1);
return?0;
}
在控制臺窗口,點擊鼠標(biāo)右鍵,選擇屬性,將選項中的“快速編輯模式(Q)”關(guān)掉,
并選擇舊版控制臺,重新啟動即可。