在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

抓圖程序開發(fā)實戰(zhàn)

抓圖程序開發(fā)實戰(zhàn)

更新時間:2021-11-16 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

前言
本程序是利用通用的熱鍵管理DLL實現(xiàn)的熱鍵功能,在收到熱鍵通知后截取屏幕的內(nèi)容并保存到bmp文件中。本文提供了全部源代碼供大家參考。例如我們設(shè)置圖片保存路徑為c:\,熱鍵為F9 + Control,然后按Change按鈕設(shè)置好熱鍵,當(dāng)我們在任意程序中按下CTRL+F9,當(dāng)前界面將被保存在C:\下的BMP文件中。下面我們來看看程序的實現(xiàn)原理與基本結(jié)構(gòu)。

一、熱鍵管理DLL
這個DLL實際上是一個鍵盤鉤子,由它來監(jiān)視系統(tǒng)的鍵盤事件。如果有和程序登記符合的按鍵和按鍵組合就通知該程序的窗口。為了應(yīng)用方便,我把它做成了一個標(biāo)準(zhǔn)的管理庫來為其它的程序通過熱鍵服務(wù),它有兩個輸出函數(shù):AddHotkey和DeleteHotkey,程序只需要調(diào)用這兩個函數(shù)就可以了,如果編譯之后不用改變熱鍵,則只需要AddHotkey就可以了。

1. 全局變量

所有的全局變量都放在一個共享段中,定義如下:

#pragma data_seg("shareddata")
    HHOOK hHook =NULL; //鉤子句柄
    UINT nHookCount =0; //掛接的程序數(shù)目
    static UCHAR HotKey[MAX_KEY] = {0}; //熱鍵虛擬鍵碼
    static UCHAR HotKeyMask[MAX_KEY] = {0}; //組合掩碼, control=4,alt=2,shift=1 可以“或”
    static HWND hCallWnd[MAX_KEY] = {0}; //window handle associated with hotkey
    static int KeyCount =0;
    static UCHAR MaskBits =0; //00000 Ctrl=4 & Alt=2 & Shift=1
#pragma data_seg()
關(guān)于共享段,有幾點重要的說明:
a. 必須在鏈接選項里指定該段為共享,project->settings->link->object/library,加上/section:shareddata,rws
b. 第二種指定共享段的方法:在def文件的sections里加上一句shareddata read write shared
c. 第三種指定共享段的方法:在程序里加上一句#pragma comment(linker,"section:shareddata,rws")
d. 所有的變量必須初始化,否則鏈接程序會把它放到普通數(shù)據(jù)段
e. 如果不初始化變量,需要在段外用“__declspec(allocate("shareddata")) 變量類型 變量名”的方式定義

2. 兩個輸出函數(shù)如下:

//添加熱鍵,如果cKey和cMask均為0則監(jiān)視所有按鍵事件
BOOL __declspec(dllexport) __stdcall AddHotkey(HWND hWnd,UCHAR cKey,UCHAR cMask)
{
    BOOL bAdded=FALSE;
    for(int index=0;index<MAX_KEY;index++){
        if(hCallWnd[index]==0){
          hCallWnd[index]=hWnd;
          HotKey[index]=cKey;
          HotKeyMask[index]=cMask;
          bAdded=TRUE;
          KeyCount++;
          break;
        }
    }
    return bAdded;
}
//刪除熱鍵
BOOL __declspec(dllexport) __stdcall DeleteHotkey(HWND hWnd,UCHAR cKey,UCHAR  cMask)
{
    BOOL bRemoved=FALSE;
    for(int index=0;index<MAX_KEY;index++){
        if(hCallWnd[index]==hWnd){
          if(HotKey[index]==cKey&&HotKeyMask[index]==cMask){
            hCallWnd[index]=NULL;
            HotKey[index]=0;
            HotKeyMask[index]=0;
            bRemoved=TRUE;
            KeyCount--;
            break;
          }
        }
    }
    return bRemoved;
}
3. 鉤子函數(shù)如下:

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    BOOL bProcessed=FALSE;
    if(HC_ACTION==nCode)
    {
        if((lParam&0xc0000000)==0xc0000000){// 有鍵松開
          switch(wParam)
          {
          case VK_MENU:
          MaskBits&=~ALTBIT;
          break;
          case VK_CONTROL:
          MaskBits&=~CTRLBIT;
          break;
          case VK_SHIFT:
          MaskBits&=~SHIFTBIT;
          break;
          default: //judge the key and send message
          break;
          }
          for(int index=0;index<MAX_KEY;index++){
          if(hCallWnd[index]==NULL)
          continue;
          if(IsWindow(hCallWnd[index])&&(HotKey[index]==wParam)&&(HotKeyMask[index]==MaskBits)){
          SendMessage(hCallWnd[index],WM_HOTKEY,wParam,WM_KEYUP);
          bProcessed=TRUE;
          }
          }
        }
        else if((lParam&0xc000ffff)==1){ //有鍵按下
          switch(wParam)
          {
          case VK_MENU:
          MaskBits|=ALTBIT;
          break;
          case VK_CONTROL:
          MaskBits|=CTRLBIT;
          break;
          case VK_SHIFT:
          MaskBits|=SHIFTBIT;
          break;
          default: //judge the key and send message
          break;
          }
          for(int index=0;index<MAX_KEY;index++){
          if(hCallWnd[index]==NULL)
            continue;
          if(IsWindow(hCallWnd[index])&&(HotKey[index]==wParam)&&(HotKeyMask[index]==MaskBits)){
          SendMessage(hCallWnd[index],WM_HOTKEY,wParam,WM_KEYDOWN);
          bProcessed=TRUE;
          }
          }
        }
        if(!bProcessed){ //一般按鍵事件,為監(jiān)視鍵盤的程序留出余地
        for(int index=0;index<MAX_KEY;index++){
        if(hCallWnd[index]==NULL)
        continue;
        if(IsWindow(hCallWnd[index])&&(HotKey[index]==0)&&(HotKeyMask[index]==0))
        SendMessage(hCallWnd[index],WM_HOTKEY,WM_HOTKEY,lParam); //lParam的意義可看MSDN中WM_KEYDOWN部分
        }
        }
    }
    return CallNextHookEx( hHook, nCode, wParam, lParam );
}
這樣,熱鍵管理的DLL就做好了,我們就可以在程序里調(diào)用AddHotkey了

二、抓圖程序
抓圖程序是一個基于對話框的程序,它在建立對話框的時候調(diào)用前面的DLL,登記熱鍵

1. 添加hook.lib到工程里,在程序里給出兩個DLL函數(shù)的定義,也可以寫個頭文件,再包含進(jìn)來

BOOL __declspec(dllexport)__stdcall AddHotkey(HWND,UCHAR key,UCHAR mask);
BOOL __declspec(dllexport)__stdcall DeleteHotkey(HWND,UCHAR key,UCHAR mask);
也可以用動態(tài)載入的辦法調(diào)用

2. 添加對熱鍵通知事件的響應(yīng),程序中用的辦法是重載WindowProc

LRESULT CCaptureDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)   
{
    if(message==WM_HOTKEY&&lParam==WM_KEYDOWN){ //lParam表示是按下還是松開,如果有多個熱鍵,由wParam來區(qū)分
      SaveBmp();
      return FALSE;
    }
    …… //其它處理及默認(rèn)處理
}
3. 保存屏幕

保存屏幕由函數(shù)SaveBmp完成,如下:

void CCaptureDlg::SaveBmp()
{
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,Width,Height);
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap*pOld=tdc.SelectObject(&bm);
tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
//bm.GetBitmapBits(size,lpData);//此函數(shù)在處理5-5-5模式的16位色下會出現(xiàn)顏色混亂
static int filecount=0;
CString name;
name.Format("pict%04d.bmp",filecount++);
name=m_Path+name;
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<< 8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
nCount++;
}
GlobalFreePtr(lpData);
if(nCount==1)
m_Number.Format("%d picture captured.",nCount);
else
m_Number.Format("%d pictures captured.",nCount);
UpdateData(FALSE);
}
4. 界面處理。該程序為了避免熱鍵沖突,采用了動態(tài)設(shè)置熱鍵的方法,具體界面上的東西,可以看源程序

源程序的編譯與使用:先編譯hook.dll并將其放在系統(tǒng)目錄(win2000/NT是system32,98/ME是system)。
然后編譯對話框程序運(yùn)行即可!

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 又色又爽又黄视频| 一级黄色大片儿| 人妻互换免费中文字幕| 在线免费看v片| 邪恶网站在线观看| 亚洲另类第一页| 91国内在线播放| www.色欧美| www.午夜色| 国产免费一区二区视频| 日日摸日日碰夜夜爽无码| 国产玉足脚交久久欧美| 免费一级特黄特色毛片久久看| 18禁裸男晨勃露j毛免费观看| 美女av免费观看| 亚洲美免无码中文字幕在线| 国产女女做受ⅹxx高潮| 色多多视频在线播放| 在线播放免费视频| 91国在线高清视频| 黑人糟蹋人妻hd中文字幕| 可以在线看的黄色网址| 手机版av在线| 欧美日韩激情四射| 日本成人中文字幕在线| 午夜大片在线观看| 国产视频九色蝌蚪| 亚洲久久中文字幕| 日韩 欧美 视频| 美女喷白浆视频| 日韩第一页在线观看| 国内精品视频一区二区三区| 中文字幕一区二区三区四区在线视频| 性久久久久久久久久久久久久| 伊人再见免费在线观看高清版| 777精品久无码人妻蜜桃| 亚洲黄色av片| 日本三级免费观看| 亚洲激情免费视频| 一级黄色特级片| 五月丁香综合缴情六月小说| 国产成人在线综合| 成人三级视频在线播放| 日本精品福利视频| 国产成人在线综合| 91视频免费版污| 日本福利视频在线| 日本黄色片一级片| 国内精品国产三级国产aⅴ久| 精品国产免费av| 欧美精品在欧美一区二区| 日本美女视频一区| 国产精品亚洲a| 337p粉嫩大胆噜噜噜鲁| 国产一级不卡视频| 女女百合国产免费网站| 中文字幕资源在线观看| 免费涩涩18网站入口| 妞干网在线视频观看| 久久www视频| 穿情趣内衣被c到高潮视频| 欧美激情国内自拍| 日本美女视频一区| 黄色手机在线视频| 九色porny自拍| 免费涩涩18网站入口| 成人在线观看黄| 日本熟妇人妻xxxxx| 久久9精品区-无套内射无码| 免费在线观看亚洲视频| 欧美a v在线播放| 久久久久狠狠高潮亚洲精品| 黑鬼大战白妞高潮喷白浆| 免费看的黄色大片| 国产真人无码作爱视频免费| 国产精品亚洲二区在线观看 | 超碰在线资源站| 永久av免费在线观看| 超级碰在线观看| 九九热只有这里有精品| 国产极品尤物在线| 爱情岛论坛成人| 国产探花在线观看视频| 日韩中文字幕亚洲精品欧美| 九九热只有这里有精品| 亚洲五月天综合| 国产又大又长又粗又黄| 性高湖久久久久久久久aaaaa| 国产一区二区视频播放| 在线观看国产中文字幕| 精品国产一区二区三区在线| 97国产在线播放| 精品亚洲一区二区三区四区| 在线观看免费黄色片| 男人添女人下部高潮视频在观看| 成年人视频在线免费| 日韩最新中文字幕| 青青草原av在线播放| xxx中文字幕| 国产一区二区三区精彩视频 | 99热手机在线| 51xx午夜影福利| 久久久免费视频网站| 国产精品久久成人免费观看| 国产熟女高潮视频| 免费看日b视频| 亚洲男人天堂av在线| 国产精品后入内射日本在线观看| 日韩成人精品视频在线观看| 日本欧美黄色片| 三年中国中文在线观看免费播放| 日韩激情免费视频| 国产天堂视频在线观看| 亚洲涩涩在线观看| 亚欧在线免费观看| 国产妇女馒头高清泬20p多| xxx中文字幕| 黄色一级片免费的| 噼里啪啦国语在线观看免费版高清版| 男人c女人视频| 久久免费看毛片| 激情久久综合网| 一本色道久久亚洲综合精品蜜桃| 国产一线二线三线女| 警花观音坐莲激情销魂小说| 一起操在线视频| 黄色一级片免费的| 182午夜在线观看| 国产九九热视频| 亚洲成人福利在线| 国产福利在线免费| 中文字幕久久av| 日韩欧美亚洲另类| 成人av毛片在线观看| 国产永久免费网站| 久久免费看毛片| 国产一区 在线播放| 隔壁人妻偷人bd中字| 久久国产精品视频在线观看| 少妇高潮喷水在线观看| 精品少妇一区二区三区在线| 免费黄色日本网站| 午夜精品久久久久久久无码| 激情五月宗合网| 欧美综合在线观看视频| 国产精品区在线| 最新中文字幕久久| 免费看黄在线看| 国产精品亚洲二区在线观看| 色婷婷成人在线| 欧美日韩dvd| 黄色网页免费在线观看| 三级在线免费看| 999在线精品视频| 日本一本中文字幕| 手机看片福利盒子久久| 欧美国产日韩在线视频| 女人被男人躁得好爽免费视频 | 蜜臀一区二区三区精品免费视频| 成年人黄色在线观看| 免费无码毛片一区二三区| 自拍偷拍 国产| 久久久天堂国产精品| 日本熟妇人妻中出| 亚洲啊啊啊啊啊| 亚洲成人av免费看| 日本三级福利片| 蜜臀av午夜一区二区三区 | 欧美日韩国产精品激情在线播放| 亚洲五月天综合| 日韩精品一区在线视频| 色播五月综合网| 99999精品视频| 黄色成人在线免费观看| 欧美大尺度做爰床戏| 欧美成人免费在线观看视频| 99re6在线观看| 日韩在线第三页| 国产一区二区四区| 中文字幕55页| 日本黄色福利视频| 久久9精品区-无套内射无码| 永久免费看av| 午夜视频在线观| 天天插天天操天天射| 无码人妻丰满熟妇区96| 色哺乳xxxxhd奶水米仓惠香| 一女二男3p波多野结衣| 成人一区二区三| 色欲av无码一区二区人妻| 国产av熟女一区二区三区| www.日本久久| 亚洲无在线观看| 日本美女视频一区| 奇米视频7777| 182午夜在线观看| 奇米影视四色在线| www.com久久久| 午夜激情视频网| 日本精品福利视频|