在线看毛片视频-国产免费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>
  • 日韩激情免费视频| 男人揉女人奶房视频60分| 缅甸午夜性猛交xxxx| 一级淫片在线观看| 激情网站五月天| 欧美两根一起进3p做受视频| 国产极品尤物在线| 日本三级免费网站| 日韩av资源在线| 五月婷婷之婷婷| 亚洲欧美一二三| 亚洲午夜精品久久久久久人妖| 精品中文字幕av| 国语对白做受xxxxx在线中国 | 国产精品va无码一区二区| 欧美网站免费观看| 日韩av片在线看| 国产精品久久久毛片| jizz欧美性11| 欧美少妇一级片| 亚洲精品蜜桃久久久久久| 亚洲熟妇av日韩熟妇在线| 国产精品区在线| 91九色国产ts另类人妖| 男人添女人荫蒂免费视频| 国产乱子伦农村叉叉叉| 99视频免费播放| 国产成人三级视频| 视色视频在线观看| 亚洲国产精品无码观看久久| 北条麻妃在线视频观看| 亚洲欧美日韩一级| 黄色一级大片免费| 天堂av8在线| 成年女人18级毛片毛片免费| 亚洲视频一二三四| 国产精品三级一区二区| 欧美精品色婷婷五月综合| 好色先生视频污| 成人日韩在线视频| 黄色大片在线免费看| 97超碰在线视| 99精品一区二区三区的区别| 成年人视频网站免费观看| 国产人妻互换一区二区| 亚洲天堂伊人网| 无码少妇一区二区三区芒果| 激情五月六月婷婷| 福利片一区二区三区| 成年人黄色片视频| 人妻av无码专区| 亚洲视频在线不卡| 亚洲综合20p| 亚洲图片 自拍偷拍| 亚洲视频一二三四| 国产熟人av一二三区| 国产福利视频在线播放| 久久人人爽人人爽人人av| 亚洲一二三av| 一级在线免费视频| 中国黄色片一级| 亚洲 欧美 日韩系列| www.亚洲天堂网| 丝袜老师办公室里做好紧好爽| 黑人巨茎大战欧美白妇| 国产高清免费在线| 免费在线黄网站| 黑人巨大国产9丨视频| 99九九精品视频| 免费网站永久免费观看| 亚洲精品天堂成人片av在线播放| 免费的一级黄色片| 无码人妻精品一区二区蜜桃百度| 菠萝蜜视频在线观看入口| 国产乱子伦精品视频| 国产专区在线视频| 日韩不卡的av| 久久免费一级片| www精品久久| 日日干夜夜操s8| 国产探花在线看| 超碰超碰超碰超碰超碰| 欧美人成在线观看| 无码人妻h动漫| 在线观看成人免费| 2018中文字幕第一页| 国产日产欧美视频| 成人亚洲精品777777大片| 亚洲精品久久久久久宅男| 国产肉体ⅹxxx137大胆| 蜜臀久久99精品久久久酒店新书| 日本爱爱免费视频| 天天看片天天操| 免费看欧美黑人毛片| 虎白女粉嫩尤物福利视频| 亚洲第一色av| www.浪潮av.com| 国产福利片一区二区| 国产又黄又大又粗视频| 吴梦梦av在线| 成人黄色片视频| 免费看黄色a级片| 久久精品网站视频| 黄色网zhan| 中国黄色片免费看| 久久综合久久网| 神马午夜伦理影院| 国产精品久久久久9999小说| 日本中文字幕亚洲| 激情成人在线观看| 欧美性猛交xxxx乱大交91| 久久久久人妻精品一区三寸| 久久久久久久久久毛片| 日本欧美黄色片| 国产毛片视频网站| 国产又黄又爽免费视频| 色天使在线观看| 福利视频999| 青青草精品视频在线观看| 中文精品无码中文字幕无码专区 | 精品少妇人欧美激情在线观看| 久久久国产精华液999999 | 男女激情无遮挡| 超级碰在线观看| 日韩欧美理论片| 一级黄色免费在线观看| 欧美精品成人网| 少妇高清精品毛片在线视频| 国产午夜福利100集发布| 黄色一级片黄色| 黄色成人在线免费观看| 国产四区在线观看| 国内精品国产三级国产aⅴ久| 爱爱爱爱免费视频| 成人性做爰片免费视频| 欧美乱做爰xxxⅹ久久久| 欧美少妇一级片| 精品久久久久久久久久中文字幕| 国产又粗又猛又爽又黄的网站| 久色视频在线播放| 欧美,日韩,国产在线| 久久亚洲中文字幕无码| 一女被多男玩喷潮视频| 天天色综合天天色| 黄色小视频大全| 精品国产成人av在线免| 一级淫片在线观看| 国产真人做爰毛片视频直播| 国产亚洲精品网站| 国产超碰在线播放| 日本精品一区在线| 男人的天堂成人| 日韩精品一区二区三区不卡| 日本一极黄色片| 久久www视频| 国产极品粉嫩福利姬萌白酱| 欧美性大战久久久久xxx| 黄色www在线观看| 日本欧美视频在线观看| 欧美视频亚洲图片| 无码无遮挡又大又爽又黄的视频| 久久久精品三级| 国产精品一区二区免费在线观看| 日韩av播放器| 永久免费网站视频在线观看| 能在线观看的av网站| 男人添女荫道口喷水视频| 精品免费国产一区二区| 国产va亚洲va在线va| 中文字幕日韩综合| 少妇性l交大片| 国产高清av在线播放| 国产区二区三区| 国产v片免费观看| 色一情一区二区三区| 国产va亚洲va在线va| www.色就是色.com| 日日碰狠狠丁香久燥| 大陆极品少妇内射aaaaaa| 国内外免费激情视频| 欧美三级一级片| 高清无码一区二区在线观看吞精| 超碰中文字幕在线观看| 中文字幕 日韩 欧美| 女性女同性aⅴ免费观女性恋| 成人性生活视频免费看| www.久久com| 999精彩视频| 成人综合久久网| 久久国产成人精品国产成人亚洲 | gogogo高清免费观看在线视频| 日本www在线视频| aa视频在线播放| 女人床在线观看| 国产精品jizz在线观看老狼| 一级特黄妇女高潮| 警花观音坐莲激情销魂小说| 亚洲免费黄色录像| 中国女人做爰视频| 天天操精品视频|