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); }}
if(!::ShowWindow(hWin, 3)) { ShowMessage("Не могу развернуть окно"); return;}
if(!ShowWindow(hWin, SW_RESTORE)) { // развернуть ShowMessage(L"Не могу развернуть окно"); return; } if(!SetForegroundWindow(hWin)) { // на передний план ShowMessage(L"Не могу вывести окно на передний план"); return; }
ReleaseDC(NULL /* или hWin */, hdc);
//--------------------------------------------------------------------------- #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(); //нажимаю тут кнопку}//---------------------------------------------------------------------------
// развернуть окно 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 на сервере"); } */
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 на сервере"); }
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);