Почему CopyFromScreen дает разные результаты для полноэкранной игры на разных машинах? - PullRequest
1 голос
/ 20 января 2012

Я использую код ниже, чтобы сделать скриншот всех активных дисплеев вместе взятых.

Rectangle totalSize = Rectangle.Empty;

foreach (Screen s in Screen.AllScreens)
    totalSize = Rectangle.Union(totalSize, s.Bounds);

Bitmap screenShotBMP = new Bitmap(
    totalSize.Width, totalSize.Height,
    PixelFormat.Format32bppArgb);

Graphics screenShotGraphics = Graphics.FromImage(
    screenShotBMP);

screenShotGraphics.CopyFromScreen(
    totalSize.Location.X,
    totalSize.Location.Y,
    0, 0, totalSize.Size,
    CopyPixelOperation.SourceCopy);

До сих пор я проверял это на двух разных машинах, и когда World of Warcraft работает в полноэкранном режиме, одна машина делает снимок экрана WoW, а другая - изображение рабочего стола. Я бы не удивился, если бы этот код никогда не работал, чтобы сделать скриншот WoW, потому что (я полагаю) он использует DirectX для записи непосредственно на видеокарту. Однако, поскольку он работает в одном случае, я хотел бы знать, могу ли я что-то изменить в коде и / или конфигурации компьютера, чтобы он работал во всех случаях. (По крайней мере, для WoW. Я понимаю, что, вероятно, есть много других игр, которые не будут работать.) Кажется, это не проблема версии фреймворка, так как я скомпилировал свой код для разных версий, и поведение не изменилось. .

Машина № 1 с изображением WoW работает под управлением 64-разрядной версии Win7 Professional и имеет версии .NET Framework версии 2.0 - 4.0.

Машина # 2, которая делает снимок с рабочего стола, работает под управлением 32-разрядной версии Win7 Home Premium SP1 с установленными версиями .NET Framework от 1.0 до 4.0.

Отредактировано, чтобы добавить: Другой момент данных заключается в том, что если я переключу Machine # 2 с темы рабочего стола Win7 Aero на «классическую» тему, я начну получать изображения WoW вместо изображений рабочего стола.

1 Ответ

1 голос
/ 20 января 2012

Я добавил вызов:

DwmEnableComposition(DWM_EC_DISABLECOMPOSITION); 

согласно ответу на Включение / отключение Aero из службы Windows , и это устраняет проблему.Однако я не очень понимаю, почему.

...