У меня есть consoleapp, который делает скриншоты двух windows, принадлежащих стороннему программному обеспечению каждую секунду, чтобы создать историю. Консольное приложение было написано на компьютере с windows 10, где оно работает должным образом.
Проблема в том, что на целевой машине, на которой установлен windows xp, снимки экрана выполняются с рабочего стола, а не с этих windows.
Так как эти windows часто скрыты другими windows и находятся друг на друге, скриншот рабочего стола неправильный.
Существует способ заставить работать также на windows xp? Проект выполняется с использованием. net framework 4.0, поскольку на целевой машине установлен пакет обновления 2, и он не может использовать более обновленную платформу.
Вот код, который делает снимок экрана:
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
private static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
public static Bitmap TakeScreenshot(IntPtr windowHandle, CopyPixelOperation copyPixelOperation = CopyPixelOperation.SourceCopy)
{
//this get the client rectangle of the window
var rect = ClientRectangle(windowHandle);
Bitmap bmp = new Bitmap(rect.Width, rect.Height);
using (Graphics gdest = Graphics.FromImage(bmp))
{
using (Graphics gsrc = Graphics.FromHwnd(windowHandle))
{
IntPtr hSrcDC = gsrc.GetHdc();
IntPtr hDC = gdest.GetHdc();
BitBlt(hDC, 0, 0, rect.Width, rect.Height, hSrcDC, 0, 0, (int)copyPixelOperation);
gdest.ReleaseHdc();
gsrc.ReleaseHdc();
}
}
return bmp;
}