当前位置:   article > 正文

句柄截屏实现_c# 句柄截图

c# 句柄截图

实现的关键主要有两部分:一是通过句柄后台获得截图,二是通过句柄后台对窗口发送鼠标点击消息或者按键消息

    关于通过窗口发送点击消息:

            可用如下函数    

  1.                         SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, RightPoint);
  2. SendMessage(hWnd, WM_LBUTTONUP, NULL, RightPoint);
                        LPARAM RightPoint = MAKELPARAM(627, 136); //x坐标,y坐标

其中hwnd是窗口句柄,RightPoint是以窗口左上角为(0,0)的坐标,注意按键都是配对的,先按下,再松开。

注意:大多系统需要管理员权限才能获取到截图

另外,貌似联想笔记本win7目前发现无法获取到截图,原因,我也不知道,哈哈!

20181202更新:(后面使用的opencv3,部分Mat的转换方式有所不同)

在  GetRegionMat  函数用于截图的部分,由于内存分配有opencv执行,需要手动释放内存,

其代码如下:

  1. Mat CWindowsScreenShotDlg::GetRegionMat(HWND hWnd)
  2. {
  3. extern int m_windowFlag;
  4. HDC hDC = ::GetWindowDC(hWnd);
  5. ASSERT(hDC);
  6. HDC hMemDC = ::CreateCompatibleDC(hDC);
  7. ASSERT(hMemDC);
  8. RECT rc;
  9. ::GetWindowRect(hWnd, &rc);
  10. BITMAP bitmap = { 0 };
  11. HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top);
  12. ASSERT(hBitmap);
  13. HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap);
  14. //::BitBlt(hMemDC,0,0,rc.right-rc.left,rc.bottom-rc.top,hDC,0,0,SRCCOPY);
  15. ::PrintWindow(hWnd, hMemDC, 0);//获取截图
  16. ::GetObject(hBitmap, sizeof(BITMAP), &bitmap);//猜测这个地方,图片已经赋值给bitmap完毕了
  17. /*将bitmap格式图片转换为IplImage,便于处理*/
  18. int depth = (bitmap.bmBitsPixel == 1) ? IPL_DEPTH_1U : IPL_DEPTH_8U;
  19. int nChannels = (bitmap.bmBitsPixel == 1) ? 1 : bitmap.bmBitsPixel / 8;
  20. IplImage* img = cvCreateImage(cvSize(bitmap.bmWidth, bitmap.bmHeight), depth, nChannels);
  21. BYTE *pBuffer = new BYTE[bitmap.bmHeight*bitmap.bmWidth*nChannels];
  22. GetBitmapBits(hBitmap, bitmap.bmHeight*bitmap.bmWidth*nChannels, pBuffer);
  23. memcpy(img->imageData, pBuffer, bitmap.bmHeight*bitmap.bmWidth*nChannels);
  24. delete[]pBuffer;
  25. IplImage *dst = cvCreateImage(cvGetSize(img), img->depth, 3);
  26. cvCvtColor(img, dst, CV_BGRA2BGR);
  27. cvReleaseImage(&img);
  28. ::SelectObject(hMemDC, hOldBmp);
  29. ::DeleteObject(hBitmap);
  30. ::DeleteObject(hMemDC);
  31. ::ReleaseDC(hWnd, hDC);
  32. if (1 == m_windowFlag)
  33. {
  34. Mat returnPic = cvarrToMat(dst, true)(Rect(0, 18, 856, 538));
  35. cvReleaseImage(&dst);
  36. return returnPic;
  37. }
  38. else
  39. {
  40. Mat returnPic = cvarrToMat(dst, true);
  41. cvReleaseImage(&dst);
  42. return returnPic;
  43. }
  44. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/489967
推荐阅读
相关标签
  

闽ICP备14008679号