Ima*_*mac 24 c# windows windows-10
我正在使用此代码在后台捕获进程窗口:
IntPtr = Process.GetProcessByName("memu")[0].MainWindowHandle;
RECT rc;
GetClientRect(hwnd, out rc);
IntPtr hdcFrom = GetDC(hwnd);
IntPtr hdcTo = CreateCompatibleDC(hdcFrom);
int Width = rc.right;
int Height = rc.bottom;
Bitmap bmp = null;
IntPtr hBitmap = CreateCompatibleBitmap(hdcFrom, Width, Height);
if (hBitmap != IntPtr.Zero) {
IntPtr hLocalBitmap = SelectObject(hdcTo, hBitmap);
BitBlt(hdcTo, 0, 0, Width, Height, hdcFrom, 0, 0, CopyPixelOperation.SourceCopy);
SelectObject(hdcTo, hLocalBitmap);
DeleteDC(hdcTo);
ReleaseDC(hwnd, hdcFrom);
bmp = Image.FromHbitmap(hBitmap);
DeleteObject(hBitmap);
return bmp;
}
Run Code Online (Sandbox Code Playgroud)
这段代码捕获了一个名为MEmu的Android模拟器,它使用DirectX来呈现内容.但是这个代码在Windows 10更新到16299版之后停止工作(之前它正常工作),它仍然在启用了Aero模式的Windows 7上运行.
当我在Windows 10 Pro v16299.X中使用此方法时,它只返回一个白色图像,或者它返回模拟器"加载屏幕",而不是正在运行的内容.在Windows 7上,如果我删除Aero模式,它将采取相同的行动,捕获"加载屏幕",因此看起来像新的Windows 10专业版更新中的透明度工作方式.
我已经尝试了一切,尝试安装一些模块以强制Aero Mode在Windows 10上工作,尝试使用PrintWindow在后台捕获屏幕,但仍然是相同的.
有什么想法会发生什么?还是可能的解决方案?或者在最后一个可能破坏该代码的Windows 10 Pro版本中发生了哪些变化?
谢谢!
希望这能解决问题。.net 框架中内置了一种可能有效的捕获屏幕的方法。不确定它是否会捕获 DirectX 内容,但可能值得一试。
请注意,此解决方案捕获当前屏幕,但您可能可以修改它以仅捕获您感兴趣的区域。
我在这里找到了这个解决方案:https://www.c-sharpcorner.com/UploadFile/2d2d83/how-to-capture-a-screen-using-C-Sharp/
private void CaptureMyScreen()
{
try
{
//Creating a new Bitmap object
Bitmap captureBitmap = new Bitmap(1024, 768, PixelFormat.Format32bppArgb);
//Bitmap captureBitmap = new Bitmap(int width, int height, PixelFormat);
//Creating a Rectangle object which will
//capture our Current Screen
Rectangle captureRectangle = Screen.AllScreens[0].Bounds;
//Creating a New Graphics Object
Graphics captureGraphics = Graphics.FromImage(captureBitmap);
//Copying Image from The Screen
captureGraphics.CopyFromScreen(captureRectangle.Left,captureRectangle.Top,0,0,captureRectangle.Size);
//Saving the Image File (I am here Saving it in My E drive).
captureBitmap.Save(@"E:\Capture.jpg",ImageFormat.Jpeg);
//Displaying the Successfull Result
MessageBox.Show("Screen Captured");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1558 次 |
| 最近记录: |