C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Скриншот формы  (Прочитано 8578 раз)
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Скриншот формы
« : 27 Август 2013, 10:51:21 »

Подскажите оптимальный алгоритм решения следующей задачи:
Допустим, открыто несколько приложений:
1. Блокнот.
2. Калькулятор.
3. Мое приложение.
4. Приложение, которое мне нужно.
5. Word.
6. и т.д.
Некоторые могут быть свернуты в трей.
Как из моей программы найти нужную мне программу, сделать скриншот ее главного окна и сохранить этот скриншот в файл?
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Скриншот формы
« Ответ #1 : 27 Август 2013, 14:18:39 »

http://www.codeproject.com/Articles/20651/Capturing-Minimized-Window-A-Kid-s-Trick
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Скриншот формы
« Ответ #2 : 27 Август 2013, 15:11:39 »

Можно попытаться просто при помощи WinAPI:
Код
void DoScreen(const String& WinText, const String& Filename) {
// Найти нужное окно по заголовку
HWND hWin = FindWindowEx(NULL, NULL, NULL, WinText.w_str());
if (!hWin) {
ShowMessage("Не найдено окно с заголовком '" + WinText + "'!");
return;
}
 
// Развернуть окно
if(!SetForegroundWindow(hWin)) { // на передний план
ShowMessage("Не могу вывести окно на передний план");
return;
}
if(!ShowWindow(hWin, 3)) { // развернуть
ShowMessage("Не могу развернуть окно");
return;
}
 
// Сделать скриншот окна
HDC hdc = GetDC(hWin);
if(!hdc) {
ShowMessage("Не могу получить контекст окна");
return;
}
 
try {
try {
RECT Rect;
if(!GetWindowRect(hWin, &Rect)) throw Exception("Не могу получить область окна");
std::unique_ptrGraphics::TBitmap> bmp(new Graphics::TBitmap());
bmp->SetSize(Rect.right - Rect.left, Rect.bottom - Rect.top);
if(!BitBlt(bmp->Canvas->Handle, 0, 0, bmp->Width, bmp->Height, hdc, 0, 0, SRCCOPY)) throw Exception("Не могу скопировать область окна");
std::unique_ptrTJPEGImage> jpg(new TJPEGImage());
jpg->Assign(bmp.get());
jpg->CompressionQuality = 90;
jpg->SaveToFile(Filename);
}
catch(Exception& err) { Application->ShowException(&err); }
}
__finally {
ReleaseDC(hdc);
}
}
 

PS. Писать в блокноте, не проверял...
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #3 : 27 Август 2013, 22:50:14 »

Спасибо, буду пробовать.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Скриншот формы
« Ответ #4 : 28 Август 2013, 10:45:03 »

Прилагаю проект + исполняемую программу
Работает 100% на XE3. Комменты в сорсах.
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #5 : 28 Август 2013, 11:44:26 »

Спасибо!
P.S.
У меня не работает как надо. Запускаю любую программу, например VLC медиа плеер. Сворачиваю ее в трей. Пытаюсь получить снимок. Вместо полного окна получаю в программе только заголовок. Рис.
Win 7(64).
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Скриншот формы
« Ответ #6 : 28 Август 2013, 13:34:31 »

Цитата: SilverFish от 28 Август 2013, 11:44:26
Спасибо!
P.S.
У меня не работает как надо. Запускаю любую программу, например VLC медиа плеер. Сворачиваю ее в трей. Пытаюсь получить снимок. Вместо полного окна получаю в программе только заголовок.

Попробуй поиграть другими флагами при разворачивании окна вместо 5, например 3 (SW_SHOWMAXIMIZED):
Код
if(!::ShowWindow(hWin, 3)) {
ShowMessage("Не могу развернуть окно");
return;
}
 
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Скриншот формы
« Ответ #7 : 28 Август 2013, 13:39:15 »

PS. Захватить видео из проигрывателя таким способом не удастся, т.к. там отрисовка идет через DirectX. Нужно захватывать также при помощи DirectX (есть примеры использования через COM интерфейс).
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #8 : 28 Август 2013, 17:09:54 »

Цитата: S0mbre от 28 Август 2013, 13:39:15
PS. Захватить видео из проигрывателя таким способом не удастся, т.к. там отрисовка идет через DirectX. Нужно захватывать также при помощи DirectX (есть примеры использования через COM интерфейс).

Мне видео не нужно, просто VLC первым попался под руку для запуска на тестирование. Попробовала с программой FAR. Результат тот же. Рис.

Цитировать
Попробуй поиграть другими флагами при разворачивании окна вместо 5, например 3 (SW_SHOWMAXIMIZED):

Спасибо попробую, как только доберусь до студии.
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Скриншот формы
« Ответ #9 : 31 Август 2013, 20:10:03 »

Я бы, все-таки, поменял местами ShowWindow и SetForegroundWindow:
Код
        if(!ShowWindow(hWin, SW_RESTORE)) { // развернуть
ShowMessage(L"Не могу развернуть окно");
return;
}
if(!SetForegroundWindow(hWin)) { // на передний план
ShowMessage(L"Не могу вывести окно на передний план");
return;
}
 
, ну и ReleaseDC принимает 2 параметра, там понятно что нужно делать....
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Скриншот формы
« Ответ #10 : 02 Сентябрь 2013, 07:19:27 »

Цитата: volvo877 от 31 Август 2013, 20:10:03
ну и ReleaseDC принимает 2 параметра, там понятно что нужно делать....

Да, я увидел этот баг. Надо
Код
ReleaseDC(NULL /* или hWin */, hdc);
 
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #11 : 06 Сентябрь 2013, 23:03:58 »

Цитата: S0mbre от 28 Август 2013, 13:34:31
Попробуй поиграть другими флагами при разворачивании окна вместо 5, например 3 (SW_SHOWMAXIMIZED):
Код
if(!::ShowWindow(hWin, 3)) {
ShowMessage("Не могу развернуть окно");
return;
}
 


Если поставить цифру 3 то работает.  
В справочной системе нет описания что  SW_SHOWMAXIMIZED это цифра 3  
Цитировать
Syntax

BOOL ShowWindow(          HWND hWnd,
    int nCmdShow
);
Parameters

hWnd
[in] Handle to the window.
nCmdShow
[in] Specifies how the window is to be shown. This parameter is ignored the first time an application calls ShowWindow, if the program that launched the application provides a STARTUPINFO structure. Otherwise, the first time ShowWindow is called, the value should be the value obtained by the WinMain function in its nCmdShow parameter. In subsequent calls, this parameter can be one of the following values.
SW_FORCEMINIMIZE
Windows 2000/XP: Minimizes a window, even if the thread that owns the window is not responding. This flag should only be used when minimizing windows from a different thread.
SW_HIDE
Hides the window and activates another window.
SW_MAXIMIZE
Maximizes the specified window.
SW_MINIMIZE
Minimizes the specified window and activates the next top-level window in the Z order.
SW_RESTORE
Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window.
SW_SHOW
Activates the window and displays it in its current size and position.
SW_SHOWDEFAULT
Sets the show state based on the SW_ value specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application.
SW_SHOWMAXIMIZED
Activates the window and displays it as a maximized window.
SW_SHOWMINIMIZED
Activates the window and displays it as a minimized window.
SW_SHOWMINNOACTIVE
Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated.
SW_SHOWNA
Displays the window in its current size and position. This value is similar to SW_SHOW, except the window is not activated.
SW_SHOWNOACTIVATE
Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except the window is not actived.
SW_SHOWNORMAL
Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time.

Я вот так попробовала и тоже работает:
if(!::ShowWindow(hWin, SW_RESTORE))
 
« Последнее редактирование: 11 Сентябрь 2013, 10:50:41 от volvo877 » Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Скриншот формы
« Ответ #12 : 07 Сентябрь 2013, 02:47:29 »

Цитата: SilverFish от 06 Сентябрь 2013, 23:03:58
В справочной системе нет описания что  SW_SHOWMAXIMIZED это цифра 3
Зато в MSDN есть
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #13 : 08 Сентябрь 2013, 19:52:46 »

Приложение трансформировалось в web модуль IntraWEB. Теперь зайдя по IP адресу можно посмотреть скриншот программы в окне браузера. Весь код представлен ниже + картинка. Вопрос такой:
Почему при запуске в режиме debug все работает как надо, а при запуске в режиме релиз получаю исключение:
throw Exception("Не удалось развернуть окно программы Лифт-4 на сервере");
Код
//---------------------------------------------------------------------------
 
#include
#pragma hdrstop
 
#include          // для ContainsText
#include
#include "Unit2.h"
#include "UserSessionUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
__fastcall TIWForm2::TIWForm2(TComponent* Owner)
       : TIWAppForm(Owner)
{
 
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
bool __stdcall EnumProc(HWND hndl, long lParam)
{
/*
 Callback процедура для EnumWindows:
 останавливает поиск окон при (частичном или полном) совпадении заголовка окна
 и сохраняет дескриптор найденного окна
 в hWin.
*/

 
if(hndl) {
 
TCHAR buffer[256];
// извлечь текст заголовка окна
::GetWindowText(hndl, buffer, sizeof(buffer));
String sTxt(buffer);
// при совпадении...
if (buffer && ::IsWindowVisible(hndl) && !::GetWindowLong(hndl, GWL_HWNDPARENT) &&
ContainsText(sTxt, "FAR") ) //FAR для теста
{
// сохранить дескриптор
UserSession()->hWin = hndl; // hWin объявлен в модуле TIWUserSession
// стоп поиска
return false;
}
 
}
// продолжить поиск
return true;
}
//---------------------------------------------------------------------------
void __fastcall TIWForm2::DoScreen()
{
  //Найти нужное окно по заголовку
  //HWND hWin = FindWindowEx(NULL, NULL, NULL, "FAR");
  // поиск окон (исп. callback процедура EnumProc)
::EnumWindows((WNDENUMPROC)EnumProc, 0);
 
if (!UserSession()->hWin) {
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Не найдено окно программы Лифт-4\nВозможно программа не запущена на сервере");
 
}
 
  // развернуть окно
if(!::ShowWindow(UserSession()->hWin, SW_RESTORE))
{
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Не удалось развернуть окно программы Лифт-4 на сервере");
}
Application->ProcessMessages();
 
// вывести окно на передний план
if(!::SetForegroundWindow(UserSession()->hWin))
{
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Не удалось вывести окно на передний план окно программы Лифт-4 на сервере");
}
 
    Application->ProcessMessages();
// Сделать скриншот окна
 
try {
// получаем область окна
RECT Rect;
if(!::GetWindowRect(UserSession()->hWin, &Rect))
{
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Не удалось получить область окна программы Лифт-4 на сервере");
}
// сохраняем размеры окна
const int W = Rect.right - Rect.left;
const int H = Rect.bottom - Rect.top;
// настраиваем размер изображения в Image1
//IWImage1->Picture->Bitmap = NULL;
IWImage1->Picture->Bitmap->SetSize(W, H);
// используем PrintWindow для копирования окна в Image1
if(!::PrintWindow(UserSession()->hWin, IWImage1->Picture->Bitmap->Canvas->Handle, 0))
{
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Не удалось скопировать область окна программы Лифт-4 на сервере");
}
 
IWLabelTime->Caption = TimeToStr(Now());
 
 
}
 catch(Exception& err)
  {
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Произошла ошибка: " + err.Message);
//Application->ShowException(&err);
  }
 
}
 
//---------------------------------------------------------------------------
 
void __fastcall TIWForm2::IWButton2Click(TObject *Sender)
{
WebApplication->TerminateAndRedirect("http://www.yandex.ru");
}
//---------------------------------------------------------------------------
 
void __fastcall TIWForm2::IWTimer1Timer(TObject *Sender)
{
DoScreen();
}
//---------------------------------------------------------------------------
 
void __fastcall TIWForm2::IWCheckBox1Change(TObject *Sender)
{
if(IWCheckBox1->Checked)
 {
  int sec = StrToInt(Trim(IWComboBox1->Text));
  IWTimer1->Interval = sec * 1000;
  IWTimer1->Enabled = true;
 }
 else
{
 IWTimer1->Enabled = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TIWForm2::IWCheckBox1Click(TObject *Sender)
{
//не удалять!
}
//---------------------------------------------------------------------------
void __fastcall TIWForm2::IWComboBox1Change(TObject *Sender)
{
  int sec = StrToInt(Trim(IWComboBox1->Text));
  IWTimer1->Interval = sec * 1000;
}
//---------------------------------------------------------------------------
void __fastcall TIWForm2::IWButton1Click(TObject *Sender)
{
DoScreen(); //нажимаю тут кнопку
}
//---------------------------------------------------------------------------
 
 
« Последнее редактирование: 08 Сентябрь 2013, 19:58:02 от SilverFish » Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #14 : 08 Сентябрь 2013, 21:17:02 »

Вроде так заработало:
Код
// развернуть окно
if(!::ShowWindow(UserSession()->hWin, SW_SHOWMAXIMIZED))//
{
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Не удалось развернуть окно программы Лифт-4 на сервере");
}
 
//если не закомментировать то выдает throw Exception
/*
// вывести окно на передний план
    if(!::SetForegroundWindow(UserSession()->hWin))
{
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Не удалось вывести окно на передний план окно программы Лифт-4 на сервере");
}
 
   */

 

Почему работает после удаления SetForegroundWindow?
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Скриншот формы
« Ответ #15 : 09 Сентябрь 2013, 00:29:06 »

Цитировать
а при запуске в режиме релиз получаю исключение:
throw Exception("Не удалось развернуть окно программы Лифт-4 на сервере");
Не воспроизводится... Что в Дебаге, что в Релизе - работает абсолютно одинаково...
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #16 : 09 Сентябрь 2013, 01:22:59 »

Цитата: volvo877 от 09 Сентябрь 2013, 00:29:06
Цитировать
а при запуске в режиме релиз получаю исключение:
throw Exception("Не удалось развернуть окно программы Лифт-4 на сервере");
Не воспроизводится... Что в Дебаге, что в Релизе - работает абсолютно одинаково...

Спасибо, что проверили.
Окончательный вариант, который как мне кажется работает нормально у меня такой:
Код
void __fastcall TIWForm2::DoScreen()
{
  //Найти нужное окно по заголовку
  //HWND hWin = FindWindowEx(NULL, NULL, NULL, "FAR");
  // поиск окон (исп. callback процедура EnumProc)
::EnumWindows((WNDENUMPROC)EnumProc, 0);
 
if (!UserSession()->hWin) {
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
//IWImage1->Picture->Bitmap = NULL;
throw Exception("Не найдено окно программы Лифт-4\nВозможно программа не запущена на сервере");
 
}
 
 
// развернуть окно
if(!::ShowWindow(UserSession()->hWin, SW_SHOWNORMAL)) //
{
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
UserSession()->hWin = NULL;
//IWImage1->Picture->Bitmap = NULL;
throw Exception("Не удалось развернуть окно программы Лифт-4 на сервере");
}
 
// Сделать скриншот окна
 
try {
// получаем область окна
RECT Rect;
if(!::GetWindowRect(UserSession()->hWin, &Rect))
{
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Не удалось получить область окна программы Лифт-4 на сервере");
}
// сохраняем размеры окна
const int W = Rect.right - Rect.left;
const int H = Rect.bottom - Rect.top;
// настраиваем размер изображения в Image1
//IWImage1->Picture->Bitmap = NULL;
IWImage1->Picture->Bitmap->SetSize(W, H);
// используем PrintWindow для копирования окна в Image1
if(!::PrintWindow(UserSession()->hWin, IWImage1->Picture->Bitmap->Canvas->Handle, 0))
{
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Не удалось скопировать область окна программы Лифт-4 на сервере");
}
 
   IWLabelTime->Caption = TimeToStr(Now());
 
 
}
 catch(Exception& err)
  {
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Произошла ошибка: " + err.Message);
//Application->ShowException(&err);
  }
 
}
//---------------------------------------------------------------------------
 

Единственный недостаток, выявленный при экспериментах - можно добиться что копируется окно программы, а сама копируемая программа не получила фокуса, поэтому верхняя строка окна (где кнопки закрыть открыть) получается бледной т.к. нет фокуса. Причем добавление в код строк:
Код
if(!::SetForegroundWindow(UserSession()->hWin))
{
IWCheckBox1->Checked = false;
IWTimer1->Enabled = false;
throw Exception("Не удалось вывести окно на передний план окно программы Лифт-4 на сервере");
}
ситуацию не исправляет...
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #17 : 11 Сентябрь 2013, 15:44:01 »

Подскажите, пожалуйста, какие еще есть альтернативы функции копирования:
if(!::PrintWindow(UserSession()->hWin, IWImage1->Picture->Bitmap->Canvas->Handle, 0))
?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Скриншот формы
« Ответ #18 : 11 Сентябрь 2013, 20:20:55 »

Цитата: SilverFish от 11 Сентябрь 2013, 15:44:01
Подскажите, пожалуйста, какие еще есть альтернативы функции копирования:
if(!::PrintWindow(UserSession()->hWin, IWImage1->Picture->Bitmap->Canvas->Handle, 0))
?

BitBlt... но для окон лучше PrintWindow. Чем-то не устраивает?
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #19 : 11 Сентябрь 2013, 20:26:57 »

Цитата: S0mbre от 11 Сентябрь 2013, 20:20:55
Цитата: SilverFish от 11 Сентябрь 2013, 15:44:01
Подскажите, пожалуйста, какие еще есть альтернативы функции копирования:
if(!::PrintWindow(UserSession()->hWin, IWImage1->Picture->Bitmap->Canvas->Handle, 0))
?

BitBlt... но для окон лучше PrintWindow. Чем-то не устраивает?

В образовательных целях интересно.
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #20 : 12 Сентябрь 2013, 13:49:43 »

Подскажите, почему так не работает копирование?

RECT Rect;
if(!::GetWindowRect(hWin, &Rect)) throw Exception("Не могу получить область окна");
TCanvas * can = new TCanvas;
can->Handle = GetWindowDC(hWin);
Image1->Canvas->CopyRect(Rect, can, Rect);
ReleaseDC(hWin, can->Handle);
delete can;
« Последнее редактирование: 12 Сентябрь 2013, 15:14:29 от SilverFish » Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Скриншот формы
« Ответ #21 : 12 Сентябрь 2013, 16:29:20 »

Цитата: SilverFish от 12 Сентябрь 2013, 13:49:43
Подскажите, почему так не работает копирование?

RECT Rect;
if(!::GetWindowRect(hWin, &Rect)) throw Exception("Не могу получить область окна");
TCanvas * can = new TCanvas;
can->Handle = GetWindowDC(hWin);
Image1->Canvas->CopyRect(Rect, can, Rect);
ReleaseDC(hWin, can->Handle);
delete can;

Могу предположить, что канва перерисовывается при следующем же InvalidateRect, т.е. CopyRect, скорее всего, копирует область нормально, но она почти мгновенно перерисовывается.
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #22 : 12 Сентябрь 2013, 16:46:26 »

Похожий код, почему то работает: ссылка
 
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Скриншот формы
« Ответ #23 : 13 Сентябрь 2013, 19:58:08 »

Подскажите, пожалуйста, нет ли в этом коде утечки памяти?
Код
        if(!::GetWindowRect(hWin, &Rect)) throw Exception("Не могу получить область окна");
 
std::auto_ptrTCanvas> C (new TCanvas());
C->Handle = GetWindowDC(hWin);  //ReleaseDC?
const int W1 = Rect.right - Rect.left;
const int H1 = Rect.bottom - Rect.top;
Image1->Picture->Bitmap->SetSize(W1, H1);
RECT RectDist;
RectDist.left = 0;
RectDist.top = 0;
RectDist.right = W1;
RectDist.bottom = H1;
Image1->Picture->Bitmap->Canvas->CopyRect(RectDist,C.get(),RectDist);
 

Как лучше оформить этот код (try/catch)?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Скриншот формы
« Ответ #24 : 13 Сентябрь 2013, 20:27:42 »

Цитата: SilverFish от 12 Сентябрь 2013, 16:46:26
Похожий код, почему то работает: ссылка
 

Похожий, да не тот
В том коде CopyRect вызывается для канвы битмапа (например Image1->Picture->Bitmap), а в твоем - для новой канвы, которой присваивается дескриптор окна. Код по ссылке правильный )
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


« Ответ #25 : 17 Сентябрь 2013, 19:11:00 »

Подскажите, пожалуйста, а как будет выглядит снятие скриншота с помощью сообщений WM_PRINT/WM_PRINTCLIENT?
Так получается пустая картинка:
SendMessage(UserSession()->hWin, WM_PRINT,(WPARAM)IWImage1->Picture->Bitmap->Canvas->Handle, (LPARAM)PRF_NONCLIENT|PRF_CLIENT|PRF_ERASEBKGND);
« Последнее редактирование: 17 Сентябрь 2013, 19:23:39 от SilverFish » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.138 секунд. Запросов: 21.