永发信息网

求C#窗口截图不发生内存泄漏的代码

答案:5  悬赏:40  手机版
解决时间 2021-02-19 10:21
一项目中需要不停对多个窗口进行截图,用了如下代码:
public static Image CaptureWindow(IntPtr handle)
{
IntPtr hdcSrc = User32.GetWindowDC(handle);
User32.RECT windowRect = new User32.RECT();
User32.GetWindowRect(handle, ref windowRect);
int width = windowRect.right - windowRect.left;
int height = windowRect.bottom - windowRect.top;
IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
GDI32.SelectObject(hdcDest, hOld);
GDI32.DeleteDC(hdcDest);
User32.ReleaseDC(handle, hdcSrc);
Image img = Image.FromHbitmap(hBitmap);
GDI32.DeleteObject(hBitmap);
return img;
}
发现每调用一次内存就增大根本不能释放掉,如果你调用几百次占用的内存让你无法忍受.请问题有什么办法解决.(我已经有种解决方法就时专门弄个截图的进程,内存到一定的数量的时候再重启进程,但这样操作起来就非常复杂了.)请不要说自己百度,或者GOOGLE都搜了没有这方面相关的东西.
最佳答案
IntPtr hscrdc = GetWindowDC(hWnd);
            Control control = Control.FromHandle(hWnd);
            IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, control.Width, control.Height);
            IntPtr hmemdc = CreateCompatibleDC(hscrdc);
            DeleteObject(SelectObject(hmemdc, hbitmap));//必须Delete否则内存泄漏
            PrintWindow(hWnd, hmemdc, 0);
            Bitmap bmp = Bitmap.FromHbitmap(hbitmap);
            DeleteDC(hmemdc);
            ReleaseDC(hWnd, hscrdc);//Get要用Release释放
网上的造成泄漏的都是黑色标注部分的错误。
最后还要注意bmp用graphic.DrawImage复制一遍到新的Bitmap中,然后释放hbitmap,因为hbitmap是C++指针,必须用DeleteObject释放,否则也会造成内存泄漏。
全部回答
把所有引用设为null,清空剪切板,gc.collection()
携程一个类,截图的时候调用,用完使用析构函数手动释放不可以么? 再看看别人怎么说的。
不要写成静态方法,将方法内的变量抽出来。增加析构函数,在析构函数中将所有变量能调用Dispose();都调用一下,然后手工将值设置为null。最后加上 1 GC .Collect(); 强制回收一下,如果不行请发整体代码上来,只能调试看一下是哪里的内存占用过高了。
貌似都是封装的嘛 直接弄 C++ DLL调用看看 要求不高的话,或者使用 PrintWindow API看看
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
被称为液体面包的是
若直线l1:y=2x+3,直线l2与l1关于直线y=x对称.
焦作市建设投资(控股)公司地址在哪,我要去那
【图巴】求单手扫帚的动力臂和阻力臂 来个图
信鸽靠什么导航
扈三娘与矮脚虎王英 小李广花荣打一成语
龙的同音字
我是农村一个独生女,丈夫入赘生有一女,现和
蕲春县青石镇花桥村村民委员会地址有知道的么
迈锐宝2.0L和迈腾1.8T油耗对比?
男生看到女生受欺负,提出保护女生,女生默许
第一自然段在文中起到了什么作用?
长虹窗帘我想知道这个在什么地方
坊子区城管执法局黄旗堡城管执法中队地址在什
一亩地产多少斤芝麻,芝麻亩产量,芝麻亩产多
推荐资讯
报个英语培训班要多少钱?
昨天我去街上买衣服修指甲,俢指甲,不是俢指
填空题若函数y=lg(4-a?2x)的定义域为{x|x≤
如图3-390所示结构在均布扭矩作用下,下列扭
洪荒小说男主角是妖族集齐五行最后得炼妖壶成
绿箭侠中费利西蒂的母亲
啊甘正传 男主角的耐克鞋子
波西米亚是哪个国家
打忙在什么地方啊,我要过去处理事情
有一正弦交流电,它的电流瞬时值的表达式为i=
形容“平安出行”的成语有哪些?
电脑自动安装金山pdf转word,怎么解决
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?