Снимок окна .Net-приложения на неактивном дектопе под Win2003.
От: Аноним  
Дата: 03.09.12 18:14
Оценка:
Попробую описать проблему. Разрабатываю библиотеку(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-приложение, неактиный десктоп.

Может кто подскажет в каком направлении двигаться?
Re: Снимок окна .Net-приложения на неактивном дектопе под Win2003.
От: aloch Россия  
Дата: 04.09.12 05:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Может кто подскажет в каком направлении двигаться?


Я бы посмотрел исходники фреймворка — для начала


Re: Снимок окна .Net-приложения на неактивном дектопе под Win2003.
От: newb  
Дата: 04.09.12 09:14
Оценка: 3 (1)
Попробовал сделать скриншот окна на не активном десктопе непосредственно из .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 все нормально отображается.
Re[2]: Снимок окна .Net-приложения на неактивном дектопе под Win2003.
От: newb  
Дата: 04.09.12 09:19
Оценка:
Здравствуйте, aloch, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>Может кто подскажет в каком направлении двигаться?


A>Я бы посмотрел исходники фреймворка — для начала

Честно говоря, я .Net-ом не очень пока дружу.
Где можно взять его исходники? Я так понимаю, мне нужен код обработки WM_PRINT внутри .Net?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.