Помогите разобраться. почему не работает?
От: Lazyman Россия  
Дата: 14.09.07 23:11
Оценка:
Нужно сделать снимок невидимой формы.
делаю вот так:


   Bitmap ret = null;
   Bitmap bitmap = new Bitmap(1152, 864);
   Graphics graphics = Graphics.FromImage(bitmap);
   IntPtr memdc = graphics.GetHdc();
   IntPtr hbitmap = bitmap.GetHbitmap();
   Win32API.SelectObject(memdc, hbitmap);
   PRF flag = PRF.CLIENT| PRF.NONCLIENT;
   SendMessage((IntPtr)(0x00041540), (uint)0x0317, (uint)memdc, (uint)flag);
   ret = Bitmap.FromHbitmap(hbitmap);
   ret.Save("test.bmp");
   clsRet = System.Drawing.Image.FromHbitmap(hbitmap);
   Win32API.DeleteObject(hbitmap);
   graphics.ReleaseHdc(memdc);
   graphics.Dispose();
   bitmap.Dispose();


Импорт ДЛЛ из User32 и gdi32 — я тут не пишу..
В итоге — получается синий экран... (не синий экран смерти, а БМП-шка которая покрашена в синий цвет. при созднии — она белая)

0x0317 — это WM_PRINT
0x00041540 — это Window Handle который я получил с окна нужного Spy.(для простоты прям в исходник решил забить, что бы мнеьше кода было.)
1152, 864 — размер окна, с которого надо сделать снимок.

Пожалуйста, подскажите, что не так?
Re: Помогите разобраться. почему не работает?
От: MazurD  
Дата: 18.09.07 06:03
Оценка:
Здравствуйте, Lazyman, Вы писали:

Кто тебе сказал, что HWND окна все время постоянный ?

L>0x00041540 — это Window Handle который я получил с окна нужного Spy.(для простоты прям в исходник решил забить, что бы мнеьше кода было.)
Re[2]: Помогите разобраться. почему не работает?
От: Lazyman Россия  
Дата: 21.09.07 22:39
Оценка:
Здравствуйте, MazurD, Вы писали:

MD>Здравствуйте, Lazyman, Вы писали:


MD>Кто тебе сказал, что HWND окна все время постоянный ?


L>>0x00041540 — это Window Handle который я получил с окна нужного Spy.(для простоты прям в исходник решил забить, что бы мнеьше кода было.)


Ну ептыть... Ну понятно, что я просто это окно на время работы программы не закрывал... А если закрывал и открывал по новой снова смотрел, какой у него хендл и в исходнике его переписывал..
Re[3]: Помогите разобраться. почему не работает?
От: jenyavb  
Дата: 22.09.07 06:34
Оценка:
Здравствуйте, Lazyman, Вы писали:

L>Ну ептыть... Ну понятно, что я просто это окно на время работы программы не закрывал... А если закрывал и открывал по новой снова смотрел, какой у него хендл и в исходнике его переписывал..


Не проще ли его было туда записывать через свойство Handle?
... << RSDN@Home 1.2.0 alpha rev. 746>>
Re[4]: Помогите разобраться. почему не работает?
От: Lazyman Россия  
Дата: 23.09.07 21:51
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Здравствуйте, Lazyman, Вы писали:


L>>Ну ептыть... Ну понятно, что я просто это окно на время работы программы не закрывал... А если закрывал и открывал по новой снова смотрел, какой у него хендл и в исходнике его переписывал..


J>Не проще ли его было туда записывать через свойство Handle?



Да просто что бы строчек было меньше в коде.. Понятно, что если бы только что-то заработало бы я бы написал получение хендла. Вы не сбивайтесь на второстепенные вопросы...
Re: Помогите разобраться. почему не работает?
От: Soul Россия  
Дата: 24.09.07 13:10
Оценка:
Здравствуйте, Lazyman, Вы писали:

L>Нужно сделать снимок невидимой формы.

L>делаю вот так:

L>

L>   Bitmap ret = null;
L>   Bitmap bitmap = new Bitmap(1152, 864);
L>   Graphics graphics = Graphics.FromImage(bitmap);
 L>   IntPtr memdc = graphics.GetHdc();
L>   IntPtr hbitmap = bitmap.GetHbitmap();
L>   Win32API.SelectObject(memdc, hbitmap);
L>   PRF flag = PRF.CLIENT| PRF.NONCLIENT;
L>   SendMessage((IntPtr)(0x00041540), (uint)0x0317, (uint)memdc, (uint)flag);
L>   ret = Bitmap.FromHbitmap(hbitmap);
L>   ret.Save("test.bmp");
 L>   clsRet = System.Drawing.Image.FromHbitmap(hbitmap);
L>   Win32API.DeleteObject(hbitmap);
L>   graphics.ReleaseHdc(memdc);
L>   graphics.Dispose();
L>   bitmap.Dispose();

L>


L>Импорт ДЛЛ из User32 и gdi32 — я тут не пишу..

L>В итоге — получается синий экран... (не синий экран смерти, а БМП-шка которая покрашена в синий цвет. при созднии — она белая)

L>0x0317 — это WM_PRINT

L>0x00041540 — это Window Handle который я получил с окна нужного Spy.(для простоты прям в исходник решил забить, что бы мнеьше кода было.)
L>1152, 864 — размер окна, с которого надо сделать снимок.

L>Пожалуйста, подскажите, что не так?


Я делаю это так:
                        Application.DoEvents();

            Rectangle rect = GetWindowRectangle(hwnd);
            Bitmap ret = null;
            Bitmap bitmap = new Bitmap(rect.Width, rect.Height, PixelFormat.Format24bppRgb);
            Graphics graphics = Graphics.FromImage(bitmap);
            IntPtr memdc = graphics.GetHdc();
            IntPtr hbitmap = bitmap.GetHbitmap();
            SelectObject(memdc, hbitmap);
            try
            {
                PRF flag = PRF.CLIENT | PRF.NONCLIENT;
                if(includeChildren)
                {
                    flag |= PRF.CHILDREN;
                }

                Application.DoEvents();
                Thread.Sleep(500);

                SendMessage(hwnd, WM_PRINT, (uint)memdc, (uint)flag);
                Application.DoEvents();
                Thread.Sleep(500);

                // For index charts necessary to send message twice!!!
                SendMessage(hwnd, WM_PRINT, (uint)memdc, (uint)flag);
                Application.DoEvents();
                Thread.Sleep(500);

                ret = Bitmap.FromHbitmap(hbitmap);
            }
            finally
            {
                // Cleanup
                DeleteObject(hbitmap);
                graphics.ReleaseHdc(memdc);
                graphics.Dispose();
                bitmap.Dispose();
            }
Soul
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.