不要写成静态方法,将方法内的变量抽出来。增加析构函数,在析构函数中将所有变量能调用Dispose();都调用一下,然后手工将值设置为null。最后加上
GC .Collect();
强制回收一下,如果不行请发整体代码上来,只能调试看一下是哪里的内存占用过高了。
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()
携程一个类,截图的时候调用,用完使用析构函数手动释放不可以么?
貌似都是封装的嘛
直接弄 C++ DLL调用看看
要求不高的话,或者使用 PrintWindow API看看