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

2025-02-25 07:21:48
推荐回答(5个)
回答1:

不要写成静态方法,将方法内的变量抽出来。增加析构函数,在析构函数中将所有变量能调用Dispose();都调用一下,然后手工将值设置为null。最后加上

GC .Collect();

强制回收一下,如果不行请发整体代码上来,只能调试看一下是哪里的内存占用过高了。

回答2:

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释放,否则也会造成内存泄漏。

回答3:

把所有引用设为null,清空剪切板,gc.collection()

回答4:

携程一个类,截图的时候调用,用完使用析构函数手动释放不可以么?

回答5:

貌似都是封装的嘛
直接弄 C++ DLL调用看看

要求不高的话,或者使用 PrintWindow API看看