QQ登录

只需一步,快速开始

204上位机VC MFC使用热键抓取桌面图片

[ 复制链接 ]

204上位机VC MFC使用热键抓取桌面图片

204上位机VC MFC使用热键抓取桌面图片
204上位机VC MFC使用热键抓取桌面图片
功能展示
桌面的图片的保存也是常用的功能,平常按下Prt Sc键就可在画板上粘贴抓取的桌面图片进行编辑,我们当前例程也实现桌面图片的抓取,点击保存桌面为图片或用快捷键CTRL+G可以将抓取桌面图片保存到指定的目录,效果如图;
要点提示
一.位图也是一种格式的图片,可以使用Cfile类的相关函数进行文件的打开写入与关闭操作;位图分为三个部分1.位图文件头 2.文件头,3位置数据,三个部分使用Cfile类的WriteHuge()函数进行数据写入;
二.热键的使用可以用函数RegisterHotKey()进行注册,然后响应消息WM_HOTKEY就可实现热键功能;在程序退出时得调用函数::UnregisterHotKey(this->m_hWnd,m_HotkeyID);将已注册的热键注销;
RegisterHotKey函数原型:BOOL RegisterHotKey(HWNDhWnd,int id,UINTfsModifiers,UINT vk);
详细参数编辑
1.hWnd:
接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中进行处理。
2.id:
定义热键的标识符。调用线程中的其他热键,不能使用同样的标识符。应用程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个范围为0xC000-0xFFFF的值(GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。
3.fsModifoers:
定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。
该参数可以是如下值的组合:
键值含意
MOD_ALT
0x0001按下的可以是任一Alt键。
MOD_SHIFT
0x0004按下的可以是任一Shift键。
MOD_WIN
0x0008按下的可以是任一Windows徽标键。
MOD_NOREPEAT
0x4000更改热键行为,以便键盘自动重复不会产生多个热键通知。
MOD_CONTROL
0x0002按下的可以是任一Ctrl键。
4.vk:
定义热键的虚拟键码。
若函数调用成功,返回一个非0值。若函数调用失败,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数获取具体的错误代码。
实现功能
1.新建基于对话框的应用程序
2.包含截图用头文件#include <math.h> #include<windowsx.h>;添加热键ID变量ATOM m_HotkeyID; 热键响应函数voidHotKey(WPARAM wParam,LPARAM lParam);  桌面图片抓取函数void GrabScreen(CStringsBitmapName,BOOL bScrabCursor=TRUE);并在程序初始化时注册热键m_HotkeyID = GlobalAddAtom("MyHotKey")-0XC000;if(!RegisterHotKey(this->m_hWnd,m_HotkeyID,MOD_CONTROL,'G') )MessageBox("注册热键失败");
3.将热键响应函数HotKey()与消息WM_HOTKEY进行手工映射;ON_MESSAGE(WM_HOTKEY,HotKey)
4.拖拽按钮<保存桌面为图片>关联函数,拖拽选择框ID为IDC_CHECK1用于选择是否抓取鼠标;
5.在程序退出时注销已注册的热键  ::UnregisterHotKey(this->m_hWnd,m_HotkeyID);//注销热键; HotKey() OnGrab() GrabScreen()代码为:
  1. void CGkbc8Dlg::HotKey(WPARAM wParam,LPARAM lParam)
  2. {
  3.         if(m_HotkeyID == (int)wParam)
  4.         {
  5.                 OnGrab();
  6.         }
  7. }
复制代码
  1. void CGkbc8Dlg::OnGrab()
  2. {
  3.         CString ReturnPach;                                                                //字符串变量
  4.         TCHAR szPath[_MAX_PATH];                               //保存路径变量
  5.         BROWSEINFO bi;                                         // BROWSEINFO结构变量
  6.         ZeroMemory(&bi,sizeof(BROWSEINFO));
  7.         bi.lpszTitle       = _T("选择图片保存位置");    //对话框标题
  8.         bi.pszDisplayName = szPath;                     //选择文件夹路径
  9.         bi.ulFlags        = BIF_RETURNONLYFSDIRS;       //标记
  10.         LPITEMIDLIST pItemIDList = SHBrowseForFolder(&bi);//显示文件浏览对话框
  11.         if(pItemIDList)//用户选择了文件夹
  12.         {
  13.                 if(SHGetPathFromIDList(pItemIDList,szPath)) //判断是否获得文件夹路径
  14.                 {
  15.                         CButton* pBtn=(CButton*)GetDlgItem(IDC_CHECK1);
  16.                         CString sFileName(szPath),tmp;        
  17.                         CTime time = CTime::GetCurrentTime(); //抓图时间
  18.                         tmp.Format("\\工控编程吧-%s.bmp",time.Format("_%Y_%m_%d_%H_%M_%S"));
  19.                         sFileName+=tmp;//图片名称
  20.                         GrabScreen(sFileName,pBtn->GetCheck());
  21.                 }
  22.         }
  23. }
  24. void CGkbc8Dlg::OnDestroy()
  25. {
  26.         CDialog::OnDestroy();
  27.         ::UnregisterHotKey(this->m_hWnd,m_HotkeyID);//注销热键
  28. }
  29. void CGkbc8Dlg::GrabScreen(CString sBitmapName,BOOL bScrabCursor)
  30. {
  31.         if(sBitmapName.Right(3)!="bmp")//函数仅保存位图
  32.                 return;
  33. //<>
  34.         CDC* pDeskDC =  GetDesktopWindow()->GetDC();                //获取桌面画布对象
  35.         CRect rc;
  36.         GetDesktopWindow()->GetClientRect(rc);                                //获取屏幕的客户区域
  37.         CDC  memDC;                                                                                        //定义一个内存画布
  38.         memDC.CreateCompatibleDC(pDeskDC);                                        //创建一个兼容的画布
  39.         CBitmap bmp;
复制代码
  1. bmp.CreateCompatibleBitmap(pDeskDC,rc.Width(),rc.Height());        //创建兼容位图
  2.         memDC.SelectObject(&bmp);                                                        //选中位图对象        
  3.         BITMAP bitmap;
  4.         bmp.GetBitmap(&bitmap);                                                                //获得图片信息
  5.         memDC.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,pDeskDC,0,0,SRCCOPY);//绘制图片
  6.         if(bScrabCursor)                                                                    //选择抓取鼠标
  7.         {
  8.                 CPoint point;
  9.                 GetCursorPos(&point);                                                        //鼠标位置
  10.                 HICON hicon = (HICON)GetCursor();                                //获得鼠标图标句柄
  11.                 memDC.DrawIcon(point.x-10,point.y-10,hicon);                                        //绘制鼠标图标
  12.         }
  13. //<>位图数据
  14.         DWORD size=bitmap.bmWidthBytes*bitmap.bmHeight;                //图片数据大小
  15.         LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
  16.         int panelsize  = 0;                                                                        //记录调色板大小
  17.         if(bitmap.bmBitsPixel<16)                                                        //判断是否为真彩色位图
  18.                 panelsize = (int)pow(2,bitmap.bmBitsPixel*sizeof(RGBQUAD));
  19.         BITMAPINFOHEADER *pBInfo = (BITMAPINFOHEADER*)LocalAlloc(LPTR,
  20.                 sizeof(BITMAPINFO)+panelsize);                                        //位图头指针
  21.         pBInfo->biBitCount       = bitmap.bmBitsPixel;                //位图像素
  22.         pBInfo->biClrImportant   = 0;
  23.         pBInfo->biCompression    = 0;
  24.         pBInfo->biHeight         = bitmap.bmHeight;                        //位图高
  25.         pBInfo->biPlanes         = bitmap.bmPlanes;
  26.         pBInfo->biSize           = sizeof(BITMAPINFO);
  27.         pBInfo->biSizeImage      = bitmap.bmWidthBytes*bitmap.bmHeight;        //数据
  28.         pBInfo->biWidth          = bitmap.bmWidth;                        //位图宽
  29.         pBInfo->biXPelsPerMeter  = 0;
  30.         pBInfo->biYPelsPerMeter  = 0;
  31.         GetDIBits(memDC.m_hDC,bmp,0,pBInfo->biHeight,lpData,
  32.                 (BITMAPINFO*)pBInfo,DIB_RGB_COLORS);
  33. //<>//位图文件头
  34.         BITMAPFILEHEADER bfh;                                                               
  35.         bfh.bfReserved1 = bfh.bfReserved2 = 0;
  36.         bfh.bfType      = ((WORD)('M'<< 8)|'B');
  37.         bfh.bfSize      = 54+size;
  38.         bfh.bfOffBits   = 54;
复制代码
  1. //<>保存位图
  2.         CFile file;
  3.         if(file.Open(sBitmapName,CFile::modeCreate|CFile::modeWrite))//创建位图文件
  4.         {
  5.                 file.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));        //写入位图文件头
  6.                 file.WriteHuge(pBInfo,sizeof(BITMAPINFOHEADER));//写入文件头
  7.                 file.WriteHuge(lpData,size);                                        //写入数据
  8.                 file.Close();                                                                        //关闭文件
  9.         }
  10. }
复制代码
我们来实现整个功能实现 过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:204.上位机VC MFC使用热键抓取桌面图片.rar 
文件大小:155.25 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!



回复

使用道具 举报

快速回复 返回列表 客服中心 搜索