VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 628|回复: 5

[已解决]帮忙看段代码

[复制链接]
78_avatar_middle
最佳答案
0 
在线会员 发表于 2021-12-7 11:15:17 | 显示全部楼层 |阅读模式
  1. keybd_event(VK_SNAPSHOT,0,0,0);
  2.        

  3.         OpenClipboard(NULL);
  4.         HGLOBAL hglb=GetClipboardData(CF_TIFF);
  5.         if(hglb==0)
  6.         {
  7.                 MessageBox(NULL,"hglb失败","info",MB_OK);
  8.         }
  9.         LPSTR  lptstr =(char *)GlobalLock(hglb);
  10.         MessageBox(NULL,lptstr,"aaa",MB_OK);
复制代码


想利用prtsc按键,来做屏幕截图。但是一直不能成功。以上代码返回“hglb失败”。

当我把GetClipboardData(CF_TIFF)改成GetClipboardData(CF_TEXT)是可以获取到剪切板的文字内容的,但是这个截图却始终无法获取到。应该怎么改进,不准备换别的方式来实现。就想使用prtsc按键来实现。
最佳答案
00_avatar_small
2021-12-7 19:06:21
应该是成了
  1. #include <windows.h>

  2. int main()
  3. {
  4.         keybd_event(VK_SNAPSHOT, 0, 0, 0);
  5.         Sleep(20);
  6.         keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);
  7.         if (OpenClipboard(NULL))
  8.         {
  9.                 if (IsClipboardFormatAvailable(CF_BITMAP))
  10.                 {
  11.                     HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);
  12.                         if (handle)
  13.                         {
  14.                                 MessageBoxA(0, "发现了图片数据", "info", 0);
  15.                         }
  16.                         CloseClipboard();
  17.                 }
  18.                 return 0;
  19.         }
  20. }
复制代码







上一篇:新手提问,到时间为什么没有运行,谢谢
下一篇:各位大佬推荐下c++新手书籍无基础
00_avatar_middle
最佳答案
12 
在线会员 发表于 2021-12-7 19:06:21 | 显示全部楼层    本楼为最佳答案   
bestAnswer
应该是成了
  1. #include <windows.h>

  2. int main()
  3. {
  4.         keybd_event(VK_SNAPSHOT, 0, 0, 0);
  5.         Sleep(20);
  6.         keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);
  7.         if (OpenClipboard(NULL))
  8.         {
  9.                 if (IsClipboardFormatAvailable(CF_BITMAP))
  10.                 {
  11.                     HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);
  12.                         if (handle)
  13.                         {
  14.                                 MessageBoxA(0, "发现了图片数据", "info", 0);
  15.                         }
  16.                         CloseClipboard();
  17.                 }
  18.                 return 0;
  19.         }
  20. }
复制代码



360截图20211207190127727.jpg

111

111

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
31_avatar_small cpp2019 + 1 + 1 赞一个!

查看全部评分

00_avatar_middle
最佳答案
12 
在线会员 发表于 2021-12-7 12:32:05 | 显示全部楼层
直接写死用来测试

prtsc 按键码是44

keybd_event(44,0,0,0);
sleep(20);
keybd_event(44,0,KEYEVENTF_KEYUP,0);

帮忙看段代码
78_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-12-7 12:58:51 | 显示全部楼层
oyxbl 发表于 2021-12-7 12:32
直接写死用来测试

prtsc 按键码是44

keybd_event执行是没问题的。
GetClipboardData(CF_TIFF) 获取不到keybd_event执行后的内容。
78_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-12-8 12:36:27 | 显示全部楼层

感谢,成功了。本来是准备利用prt sc来实现截屏,最后保存成一张图片。发现没那么简单。抄了一段别人的代码,成了。附上代码。
  1. #include <windows.h>

  2. BOOL SaveBmp(HBITMAP  hBitmap,  LPSTR  FileName);

  3. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  4. {
  5.         EmptyClipboard();
  6.         keybd_event(VK_SNAPSHOT,0,0,0);

  7.         OpenClipboard(NULL);

  8.         //OpenClipboard(NULL);
  9.         HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);
  10.         SaveBmp(handle,"d:\\aaa.bmp");

  11.         CloseClipboard();

  12.         return 0;
  13. }

  14. BOOL SaveBmp(HBITMAP  hBitmap,  LPSTR  FileName)
  15. {
  16.         HDC hDC;
  17.         int iBits;
  18.         WORD wBitCount;
  19.         DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
  20.         BITMAP     Bitmap;
  21.         BITMAPFILEHEADER     bmfHdr;
  22.         BITMAPINFOHEADER     bi;  
  23.         LPBITMAPINFOHEADER     lpbi;   
  24.         HANDLE     fh,   hDib,   hPal,hOldPal=NULL;
  25.         int aa = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 288 * 352 * 24 / 8;
  26.         hDC  = CreateDC("DISPLAY",   NULL,   NULL,   NULL);
  27.         iBits  = GetDeviceCaps(hDC,   BITSPIXEL)     *     GetDeviceCaps(hDC,   PLANES);   
  28.         DeleteDC(hDC);            
  29.         if(iBits <=  1)                                                   
  30.                 wBitCount = 1;            
  31.         else  if(iBits <=  4)                              
  32.                 wBitCount  = 4;            
  33.         else if(iBits <=  8)                              
  34.                 wBitCount  = 8;            
  35.         else                                                                                                                              
  36.                 wBitCount  = 24;            
  37.        
  38.         GetObject(hBitmap,   sizeof(Bitmap),   (LPSTR)&Bitmap);         
  39.         bi.biSize= sizeof(BITMAPINFOHEADER);         
  40.         bi.biWidth = Bitmap.bmWidth;         
  41.         bi.biHeight =  Bitmap.bmHeight;         
  42.         bi.biPlanes =  1;         
  43.         bi.biBitCount = wBitCount;         
  44.         bi.biCompression= BI_RGB;         
  45.         bi.biSizeImage = Bitmap.bmWidth * Bitmap.bmHeight * 3;         
  46.         bi.biXPelsPerMeter = 0;         
  47.         bi.biYPelsPerMeter = 0;         
  48.         bi.biClrImportant = 0;         
  49.         bi.biClrUsed =  0;         
  50.        
  51.         dwBmBitsSize  = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight;         
  52.        
  53.         //为位图内容分配内存            
  54.         hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));            
  55.         lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);            
  56.         *lpbi  = bi;            
  57.        
  58.         //     处理调色板                 
  59.         hPal  = GetStockObject(DEFAULT_PALETTE);            
  60.         if (hPal)            
  61.         {            
  62.                 hDC  = ::GetDC(NULL);            
  63.                 hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE);            
  64.                 RealizePalette(hDC);            
  65.         }         
  66.        
  67.         //     获取该调色板下新的像素值            
  68.         GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight,  
  69.                 (LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize,   
  70.                 (BITMAPINFO *)lpbi, DIB_RGB_COLORS);            
  71.        
  72.         //恢复调色板                 
  73.         if (hOldPal)            
  74.         {            
  75.                 ::SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);            
  76.                 RealizePalette(hDC);            
  77.                 ::ReleaseDC(NULL,   hDC);            
  78.         }            
  79.        
  80.         //创建位图文件                 
  81.         fh  = CreateFile(FileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,           
  82.                 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,   NULL);            
  83.        
  84.         if (fh     ==  INVALID_HANDLE_VALUE)         return     FALSE;            
  85.        
  86.         //     设置位图文件头            
  87.         bmfHdr.bfType  = 0x4D42;     //     "BM"            
  88.         dwDIBSize  = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;                 
  89.         bmfHdr.bfSize  = dwDIBSize;            
  90.         bmfHdr.bfReserved1  = 0;            
  91.         bmfHdr.bfReserved2  = 0;            
  92.         bmfHdr.bfOffBits  = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;            
  93.         //     写入位图文件头            
  94.         WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);            
  95.         //     写入位图文件其余内容            
  96.         WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize - 14,   &dwWritten,   NULL);            
  97.         //清除                 
  98.         GlobalUnlock(hDib);            
  99.         GlobalFree(hDib);            
  100.         CloseHandle(fh);            
  101.        
  102.         return TRUE;
  103. }
复制代码

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
00_avatar_small oyxbl + 1 + 1 感谢分享!

查看全部评分

78_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-12-8 14:11:18 | 显示全部楼层
反复测试,发现还有bug ,release下有时候生成的图片会大于20MB,无法查看,有时候是正常的。不知道是那里的问题。帮忙看段代码
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2022-12-7 11:16

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表