zoukankan      html  css  js  c++  java
  • 关于屏幕截取

    有时候需要将一个窗口实时截取出窗口画面,常用的

    BitBlt

    可以将源设备区域像素拷贝到目标区域,而在窗口挡住或者隐藏的情况下就无能为力了,这个时候可以用

    PrintWindow

    不论是窗口被隐藏,或者被挡住都能截出想要的区域

    示例: 

        IntPtr hscrdc = GetWindowDC(hWnd);
                  Control control = Control.FromHandle(hWnd);
                  IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, control.Width, control.Height);
                  IntPtr hmemdc = CreateCompatibleDC(hscrdc);
                  SelectObject(hmemdc, hbitmap);
                  bool re= PrintWindow(hWnd, hmemdc, 0);
                  Bitmap bmp = null;
                  if(re)
                  {
                     bmp = Bitmap.FromHbitmap(hbitmap);                  
                  }

    更进一步,如果需要截一张两个窗口贴在一个资源窗口上的情况又当如何呢?当窗口都隐藏时又当如何呢?

    这个时候思路如下:

    1.用窗口DC创建两个内存兼容DC,使用CreateCompatibleDC;

    2.创建两个位图,使用CreateCompatibleBitmap,分别定向到这两个内存DC,使用selectbitmap;

    3.BitBlt到两个兼容DC的位图上,如果窗口隐藏、遮挡则使用PrintWindow,将窗口绘到重定向的DC的位图上;

    4.如果需要将一个窗口覆盖住另一个窗口的一部分,则使用StretchBlt将一个DC上的区域贴到另一个DC上即可。

    重点:

    StretchBlt需要在PrintWindow之后调用,否则由于PrintWindow最终使用WM_PAINT可能会在刷新窗口时将已经贴在上边的部分刷没掉。

    涉及到的DC和位图较多,不能用错。

  • 相关阅读:
    Android SDK 在线更新镜像服务器
    Android Studio (Gradle)编译错误
    java ZIP压缩文件
    java文件操作(输出目录、查看磁盘符)
    JXL读取写入excel表格数据
    Linux命令zip和unzip
    Linux查看系统基本信息
    Ubuntu C++环境支持
    Linux开机执行bash脚本
    ubuntu中磁盘挂载与卸载
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/11981046.html
Copyright © 2011-2022 走看看