C++屏幕抓圖代碼- 抓取屏幕 保存位圖
本程序是利用通用的熱鍵管理DLL 實(shí)現(xiàn)的熱鍵功能,在收到熱鍵通知后截取屏幕的內(nèi)容并保存到BMP 文件中。編譯并運(yùn)行本例程序,單擊【瀏覽…】按鈕可以改變保存文件的路徑,而單擊【設(shè)置】按鈕則可以改變截取屏幕的熱鍵。
實(shí)現(xiàn)方法和思路:在一個(gè)DLL(熱鍵管理DLL)中安裝一個(gè)鍵盤(pán)鉤子,用另一個(gè)程序(Capture)通過(guò)這個(gè)DLL 來(lái)增加、修改、刪除熱鍵。當(dāng)用戶按了抓取屏幕的熱鍵后,熱鍵管理DLL 通知Capture 抓取屏幕,并保存位圖。下面來(lái)看程序代碼:
1.制作熱鍵管理DLL
這個(gè)DLL 實(shí)際上是一個(gè)鍵盤(pán)鉤子,由它來(lái)監(jiān)視系統(tǒng)的鍵盤(pán)事件。如果有和程序登記符合的按鍵和按鍵組合就通知該程序的窗口。為了應(yīng)用方便,把它做成了一個(gè)標(biāo)準(zhǔn)的管理庫(kù)來(lái)為其他的程序通過(guò)熱鍵服務(wù),它有兩個(gè)輸出函數(shù)AddHotkey 和DeleteHotkey,程序只需要調(diào)用這兩個(gè)函數(shù)即可,如果編譯之后不用改變熱鍵,則只需要AddHotkey 即可。
(1)全局變量:所有的全局變量都放在一個(gè)共享段中,定義如下:
1
#pragma
data_seg("shareddata")
2
HHOOK
hHook
=NULL;
//鉤子句柄
3
UINT
nHookCount
=0;
//掛接的程序數(shù)目
4
static
UCHAR
HotKey[MAX_KEY]
= {0};
//熱鍵虛擬鍵碼
5
static
UCHAR
HotKeyMask[MAX_KEY]
= {0};
//組合掩碼,
control=4,alt=2,shift=1
6
static
HWND
hCallWnd[MAX_KEY]
= {0};
//window
handle associated with hotkey
7
static
int
KeyCount
=0;
8
static
UCHAR
MaskBits=0;
//00000
Ctrl=4&Alt=2&Shift=1
9
#pragma
data_seg()
關(guān)于共享段,有幾點(diǎn)重要的說(shuō)明:
A. 第一種必須在鏈接選項(xiàng)里指定該段為共享, projectsettingslinkobject/library , 加上/section:shareddata,rws。
B.第二種指定共享段的方法:在DLF 文件的sections 里加上一句shareddata read write shared。
C. 另外還有第三種指定共享段的方法: 需要在程序里加上一句“ #pragma comment(linker,"section:shareddata,rws")”。
D.所有的變量必須初始化,否則鏈接程序會(huì)把它放到普通數(shù)據(jù)段。
E.如果不初始化變量,需要在段外用“__declspec(allocate("shareddata")) 變量類(lèi)型 變量名”的方式定義。
(2)兩個(gè)輸出函數(shù):
01
//添加熱鍵
02
BOOL
__declspec
(
dllexport
)
__stdcall AddHotkey(
HWND
hWnd,
UCHAR
cKey,
UCHAR
cMask)
03
<code class="plain" style="margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; float:none!important; vertical-align:baseline!important; position:static!important; left:auto!important; top:auto!important; right:auto!important; bottom:auto!important; height:auto!important; width:auto!important; line-height:1.1em!important; font-family:Consolas,'Bitstream Vera Sans M