当前位置: 首页 > 编程语言 > C#

在.NET中捕获包含半透明窗口的屏幕截图Share

时间:2023-04-11 10:52:10 C#

在.NET中捕获包含半透明窗口的屏幕截图例如,下面的屏幕截图不包括半透明窗口:.Opacity=0.5win2.Text="TranparentWindow"win2.Show()win2.Top=Top+50win2.Left=Left()+50DimboundsAsRectangle=System.Windows.Forms.Screen.GetBounds(Point.Empty)UsingbmpAsBitmap=NewBitmap(bounds.Width,bounds.Height)UsinggAsGraphics=Graphics.FromImage(bmp)g.CopyFromScreen(Point.Empty,Point.Empty,bounds.Size)结束使用bmp.Save("c:tempscn.gif")EndUsingProcess.Start(NewDiagnostics.ProcessStartInfo("c:tempscn.gif")With{.UseShellExecute=True})EndSubEndClass我的google-fu真烂,还是这个并不像听起来那么容易。我很清楚为什么会发生这种情况,因为视频驱动程序必须分离内存才能使其正常工作,但我不在乎为什么它不起作用,我只想在没有...*printscreen键的情况下进行hack*pg第3方软件*SDK功能还可以,但我会提升用户拥有的每个可以在纯框架中显示它的对象(开玩笑,但这会很好)。如果这是唯一的方法,我该如何在VB中执行此操作?1M谢谢设置了TransparencyKey或Opacity属性的窗体是所谓的分层窗口。它们使用视频适配器的“覆盖”功能显示。这使它们具有透明效果。捕获它们需要在接受CopyPixelOperation参数的CopyFromScreen重载中打开CopyPixelOperation.CaptureBlt选项。不幸的是,这个重载有一个严重的错误,阻止它工作。它没有正确验证值。在.NET4.0中仍未修复。没有其他好的解决方法,但回到使用P/Invoke进行屏幕截图。这是一个例子:usingSystem;使用系统绘图;使用System.Windows.Forms;使用System.Runtime.InteropServices;namespaceWindowsApplication1{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){Sizesz=Screen.PrimaryScreen.Bounds.Size;IntPtrhDesk=GetDesktopWindow();IntPtrhSrce=GetWindowDC(hDesk);IntPtrhDest=CreateCompatibleDC(hSrce);IntPtrhBmp=CreateCompatibleBitmap(hSrce,sz.Width,sz.Height);IntPtrhOldBmp=SelectObject(hDest,hBmp);boolb=BitBlt(hDest,0,0,sz.Width,sz.Height,hSrce,0,0,CopyPixelOperation.SourceCopy|CopyPixelOperation.CaptureBlt);位图bmp=Bitmap.FromHbitmap(hBmp);选择对象(hDest,hOldBmp);删除对象(hBmp);删除DC(hDest);ReleaseDC(hDesk,hSrce);bmp.Save(@"c:temptest.png");bmp.Dispose();}//P/调用声明[DllImport("gdi32.dll")]staticexternboolBitBlt(IntPtrhdcDest,intxDest,intyDest,intwDest,inthDest,IntPtrhdcSource,intxSrc,intySrc,CopyPixelOperationrop);[DllImport("user32.dll")]staticexternboolReleaseDC(IntPtrhWnd,IntPtrhDc);[DllImport("gdi32.dll")]staticexternIntPtrDeleteDC(IntPtrhDc);[DllImport("gdi32.dll")]staticexternIntPtrDeleteObject(IntPtrhDc);[DllImport("gdi32.dll")]staticexternIntPtrCreateCompatibleBitmap(IntPtrhdc,intnWidth,intnHeight);[DllImport("gdi32.dll")]staticexternIntPtrCreateCompatibleDC(IntPtrhdc);[DllImport("gdi32.dll")]staticexternIntPtrSelectObject(IntPtrhdc,IntPtrbmp);[DllImport("user32.dll")]publicstaticexternIntPtrGetDesktopWindow();[DllImport("user32.dll")]publicstaticexternIntPtrGetWindowDC(IntPtrptr);Fwiw,更高版本的Windows为这个错误提供了一个解决方法方法不完全确定,我认为是Win7SP1。如果您仅传递CopyPixelOperation.CaptureBlt选项,BitBlt()函数现在可以执行您想要的操作。但当然,此变通办法并未针对早期Windows版本进行逆向工程,因此您不能真正依赖它。以上就是C#学习教程:截屏包含了.NET中半透明窗口所共有的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢