Попробую описать проблему. Разрабатываю библиотеку(dll, c++), которая в процессе своей работы делает снимки окон процесса, в который она загружена.
Для получения снимков использую PrintWindow. Библиотека тестировалась в следующих ОС Windows 2003R2 x32, Windows 7 Professional x32, Windows 7 Professional x64.
В качестве подопытных приложений использовались: .Net (Frameworks 2 and 4), MFC-приложение. Не работает в некоторой ситуации. Вместо изображений элементов управлений отображаются черные прямоугольники.
Проблема возникает в следующей ситуации:
1. Win2003
2. .Net-приложение (в любом фреймворке)
3. Неактивный новый десктоп.
При замене любого условия, все работает нормально. Т.е., например, такие варианты работают как надо:
1. Win2003, MFC-приложение, неактиный десктоп.
2. Win7, .NET-приложение, неактиный десктоп.
3. Win7, MFC-приложение, неактиный десктоп.
Может кто подскажет в каком направлении двигаться?
Попробовал сделать скриншот окна на не активном десктопе непосредственно из .Net-приложения. Получил такие же результаты,
как и при использовании своей библиотеки.
Т.е. если на неактивном десктопе запустить программу, содержащую следующий код:
public partial class Form1 : Form
{
[DllImport("User32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
public Form1()
{
InitializeComponent();
timer1.Interval = 3000;
timer1.Tick += new System.EventHandler(TimerProc);
timer1.Start();
}
private void TimerProc(object sender, EventArgs e)
{
timer1.Stop();
UsePrintWindow();
}
private void UsePrintWindow()
{
Graphics g = CreateGraphics();
Bitmap bmp = new Bitmap(Size.Width, Size.Height, g);
Graphics memoryGraphics = Graphics.FromImage(bmp);
IntPtr dc = memoryGraphics.GetHdc();
bool success = PrintWindow(Handle, dc, 0);
memoryGraphics.ReleaseHdc(dc);
bmp.Save("c:\\Test\\UsePrintWindow.bmp");
}
}
На Win7 получаю:
На Win2003 получаю:
Естественно, если запускать на активном десктопе, то и на Win2003 все нормально отображается.