国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

抓圖程序開發實戰

抓圖程序開發實戰

更新時間:2021-11-16 文章作者:未知 信息來源:網絡 閱讀次數:

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

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

1. 全局變量

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

#pragma data_seg("shareddata")
    HHOOK hHook =NULL; //鉤子句柄
    UINT nHookCount =0; //掛接的程序數目
    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()
關于共享段,有幾點重要的說明:
a. 必須在鏈接選項里指定該段為共享,project->settings->link->object/library,加上/section:shareddata,rws
b. 第二種指定共享段的方法:在def文件的sections里加上一句shareddata read write shared
c. 第三種指定共享段的方法:在程序里加上一句#pragma comment(linker,"section:shareddata,rws")
d. 所有的變量必須初始化,否則鏈接程序會把它放到普通數據段
e. 如果不初始化變量,需要在段外用“__declspec(allocate("shareddata")) 變量類型 變量名”的方式定義

2. 兩個輸出函數如下:

//添加熱鍵,如果cKey和cMask均為0則監視所有按鍵事件
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. 鉤子函數如下:

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){ //一般按鍵事件,為監視鍵盤的程序留出余地
        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就做好了,我們就可以在程序里調用AddHotkey了

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

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

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

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

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

保存屏幕由函數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);//此函數在處理5-5-5模式的16位色下會出現顏色混亂
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. 界面處理。該程序為了避免熱鍵沖突,采用了動態設置熱鍵的方法,具體界面上的東西,可以看源程序

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

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

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        国产亚洲成aⅴ人片在线观看| 91免费观看视频在线| 蜜臀99久久精品久久久久久软件| 91丨九色porny丨蝌蚪| 综合久久久久久久| 日本道色综合久久| 婷婷一区二区三区| 精品理论电影在线| 国产一区日韩二区欧美三区| 国产视频911| 97成人超碰视| 蜜桃av一区二区在线观看| 久久精品在这里| 91激情五月电影| 另类的小说在线视频另类成人小视频在线| 亚洲精品一线二线三线| 91尤物视频在线观看| 亚洲与欧洲av电影| 久久久国产精品不卡| 91免费视频网| 精品一区二区三区免费视频| 一区在线播放视频| 日韩欧美国产一区二区三区| 懂色av一区二区在线播放| 亚洲小说春色综合另类电影| 日韩久久免费av| 欧美日韩一区三区| av在线不卡免费看| 久久国产精品色婷婷| 亚洲免费毛片网站| 国产日韩一级二级三级| 欧美伦理影视网| 成人白浆超碰人人人人| 久久av老司机精品网站导航| 一区二区三区日本| 国产欧美日韩视频一区二区| 91精品中文字幕一区二区三区| 99久久综合精品| 国产成人综合亚洲网站| 婷婷丁香久久五月婷婷| 亚洲另类春色校园小说| 国产精品久久久久久久浪潮网站 | 国产精品久久久久天堂| 制服丝袜日韩国产| 色噜噜狠狠色综合欧洲selulu| 蜜桃久久久久久| 亚洲成人资源在线| 自拍av一区二区三区| 国产三级精品在线| 久久久久久久久久电影| 欧美一级高清片在线观看| 欧美最新大片在线看| 99re热视频精品| eeuss国产一区二区三区| 国产99久久久国产精品潘金| 精品一区二区三区香蕉蜜桃| 麻豆精品一二三| 久久精品国产成人一区二区三区| 天天操天天综合网| 丝袜亚洲精品中文字幕一区| 亚洲成人动漫精品| 日韩一区精品字幕| 日韩电影免费在线看| 香蕉影视欧美成人| 全国精品久久少妇| 美女一区二区久久| 国产精品一二三四五| 国产电影一区二区三区| 懂色av中文字幕一区二区三区| 懂色av噜噜一区二区三区av| 成人免费观看男女羞羞视频| 成人免费av资源| 色综合久久久久综合体| 欧美性大战久久久| 91精品国产高清一区二区三区 | 色诱亚洲精品久久久久久| 99re这里都是精品| 欧美唯美清纯偷拍| 日韩美一区二区三区| 国产日韩欧美亚洲| 亚洲综合色婷婷| 美日韩一区二区| 国产成人在线视频网站| 91在线观看地址| 欧美性猛交xxxxxx富婆| 精品国产一区二区三区av性色 | 91麻豆精品国产91久久久 | 国产色一区二区| 亚洲精品视频在线观看免费| 日精品一区二区| 国产精品538一区二区在线| 91视频国产资源| 日韩精品中午字幕| 一区二区三区在线播| 久久99精品久久久久久| 一本色道综合亚洲| 日韩一级高清毛片| 亚洲视频香蕉人妖| 韩国av一区二区三区| 色素色在线综合| 国产日本亚洲高清| 日韩1区2区3区| 91极品视觉盛宴| 国产情人综合久久777777| 亚洲大片精品永久免费| 懂色av中文字幕一区二区三区| 欧美日韩一本到| 中文字幕日韩一区二区| 国产一区二区三区免费看 | 日韩电影一区二区三区| 99re成人精品视频| 中文字幕免费一区| 久久99热国产| 欧美日韩日日夜夜| 亚洲日本丝袜连裤袜办公室| 激情综合五月婷婷| 91精品国产综合久久久蜜臀粉嫩 | 一区二区三区丝袜| 国产不卡视频一区| 欧美成人官网二区| 首页国产欧美日韩丝袜| 在线亚洲人成电影网站色www| 国产日产亚洲精品系列| 国产精品自在欧美一区| 欧美成人激情免费网| 男人操女人的视频在线观看欧美| 在线看一区二区| 亚洲精品成人在线| 色又黄又爽网站www久久| 亚洲女同一区二区| 色婷婷久久综合| 亚洲影视在线观看| 欧美伊人久久大香线蕉综合69| 亚洲欧美日韩国产手机在线| 成人免费高清在线观看| 中文字幕不卡在线播放| 成人国产在线观看| 中文字幕一区免费在线观看| 99久久精品免费观看| 亚洲三级视频在线观看| 99久久精品国产麻豆演员表| 国产精品二区一区二区aⅴ污介绍| 国产美女久久久久| 久久久精品蜜桃| k8久久久一区二区三区 | 国产精品一二三区在线| 中文字幕二三区不卡| 91视频一区二区| 丝袜美腿成人在线| 精品国产一区二区三区忘忧草 | 欧美一区二视频| 久久精品国产成人一区二区三区| 精品av综合导航| 不卡一区中文字幕| 亚洲va国产va欧美va观看| 日韩视频免费观看高清完整版在线观看| 免费观看日韩av| 久久精品一区四区| 91国模大尺度私拍在线视频| 强制捆绑调教一区二区| 国产精品午夜在线观看| 色综合激情五月| 久久精品国产一区二区| 国产精品久久看| 欧美一区二区三区在线| 国产一区在线看| 亚洲美女电影在线| 日韩女优av电影| 91黄色小视频| 国产精品2024| 日韩精品欧美精品| 国产精品传媒入口麻豆| 91麻豆精品国产自产在线| 成av人片一区二区| 精品一区二区三区久久| 一区二区在线免费| 国产农村妇女精品| 欧美福利一区二区| 99久久免费视频.com| 激情另类小说区图片区视频区| 亚洲男人的天堂一区二区| 精品成人a区在线观看| 欧美视频完全免费看| 国产成人午夜电影网| 日韩不卡一二三区| 亚洲伦理在线精品| 国产亚洲精品超碰| 日韩精品一区二区三区四区| 欧美午夜影院一区| 一本久久a久久精品亚洲| 国产91精品精华液一区二区三区| 奇米精品一区二区三区在线观看| 亚洲精品日韩专区silk| 国产精品久久久一本精品| 久久免费精品国产久精品久久久久| 欧美精品色综合| 欧美日韩国产高清一区二区三区 | 成人免费看的视频| 韩国女主播成人在线| 免费成人美女在线观看|