原来是用bitblt截图的,但是这个方法截不到非当前窗口的图,后来找到了一种调用win32api的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);
PrintWindow(hWnd, hmemdc, 0);
Bitmap bmp = Bitmap.FromHbitmap(hbitmap);
DeleteDC(hscrdc);//删除用过的对象
DeleteDC(hmemdc);//删除用过的对象进行控件截图,只需要传一个hwnd进去就可以了,现在问题是只能截到程序窗口能看到的部分,看不到的部分就截不到,大家有什么办法?看不到的部分是指:例如你的winform程序窗口很小,只有400*300这么大,但是一个控件放在了380*280的这个位置,但是这个控件长有200,宽有200,也就是说,在这个winform窗口中,这个控件只能显示一小部分出来,这时调用截图,他只能截到这一小部分出来,其他部分全是黑的,想截到全部图象,必须把这个控件移到中间让它全部显示出来才行。大家有什么办法没有呢。
Control control = Control.FromHandle(hWnd);
IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, control.Width, control.Height);
IntPtr hmemdc = CreateCompatibleDC(hscrdc);
SelectObject(hmemdc, hbitmap);
PrintWindow(hWnd, hmemdc, 0);
Bitmap bmp = Bitmap.FromHbitmap(hbitmap);
DeleteDC(hscrdc);//删除用过的对象
DeleteDC(hmemdc);//删除用过的对象进行控件截图,只需要传一个hwnd进去就可以了,现在问题是只能截到程序窗口能看到的部分,看不到的部分就截不到,大家有什么办法?看不到的部分是指:例如你的winform程序窗口很小,只有400*300这么大,但是一个控件放在了380*280的这个位置,但是这个控件长有200,宽有200,也就是说,在这个winform窗口中,这个控件只能显示一小部分出来,这时调用截图,他只能截到这一小部分出来,其他部分全是黑的,想截到全部图象,必须把这个控件移到中间让它全部显示出来才行。大家有什么办法没有呢。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货