• 关于屏幕截取


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

    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和位图较多,不能用错。

  • 相关阅读:
    [设计模式] 10 外观模式 facade
    [设计模式] 11 享元模式 Flyweight
    [设计模式] 9 装饰者模式 Decorator
    [设计模式] 8 组合模式 Composite
    float2int
    《ASP.NET》数据绑定——GridView
    Android Studio左边栏Project不见了?
    Linux下的五种I/O模型
    Shell编程入门(第二版)(下)
    Android訪问网络,使用HttpURLConnection还是HttpClient?
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/11981046.html
Copyright © 2020-2023  润新知