|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Скриншот свернутого приложения
Доброго времени суток!
Прошу вашей помощи. Мне необходима программа которая бы делала скрин свернутого окна. Нашел реализацию вот тут: http://stackoverflow.com/questions/2...nimized-window Там у него исправленный и рабочий пример(он так утверждает). Пытаюсь повторить тоже самое один в один, но меня 3 ошибки выскакивает Код:
Undeclare indentifier "GetWindowLongPtr" Undeclare indentifier "SetWindowLongPtr" Undeclare indentifier "LONG_PTR" Первые две решил, добавив в проект строки Код:
function GetWindowLongPtr(hWnd: HWND; nIndex: Integer): Longint; stdcall; external user32 name 'GetWindowLongPtrA'; function SetWindowLongPtr(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; stdcall; external user32 name 'SetWindowLongPtrA'; А как исправить ошибку Undeclare indentifier "LONG_PTR" ? Заранее спасибо за помощь! Вот весь мой код на Delphi7 Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; ListBox1: TListBox; Image1: TImage; Label1: TLabel; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; function GetWindowLongPtr(hWnd: HWND; nIndex: Integer): Longint; stdcall; external user32 name 'GetWindowLongPtrA'; function SetWindowLongPtr(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; stdcall; external user32 name 'SetWindowLongPtrA'; var Form1: TForm1; implementation {$R *.dfm} function WindowSnap(hWindow: HWND; bmp: TBitmap): boolean; var user32DLLHandle: THandle; printWindowAPI: function(sourceHandle: HWND; destinationHandle: HDC; nFlags: UINT): BOOL; stdcall; R: TRect; wp: WINDOWPLACEMENT; ai: ANIMATIONINFO; restoreAnimation: Boolean; ExStyle: LONG_PTR; begin Result := False; ExStyle := 0; user32DLLHandle := GetModuleHandle(user32) ; if user32DLLHandle <> 0 then begin @printWindowAPI := GetProcAddress(user32DLLHandle, 'PrintWindow') ; if @printWindowAPI <> nil then begin if not IsWindow(hWindow) then Exit; ZeroMemory(@wp, SizeOf(wp)); wp.length := SizeOf(wp); GetWindowPlacement(hWindow, @wp); ZeroMemory(@ai, SizeOf(ai)); restoreAnimation := False; if wp.showCmd = SW_SHOWMINIMIZED then begin ai.cbSize := SizeOf(ai); SystemParametersInfo(SPI_GETANIMATION, SizeOf(ai), @ai, 0); if ai.iMinAnimate <> 0 then begin ai.iMinAnimate := 0; SystemParametersInfo(SPI_SETANIMATION, SizeOf(ai), @ai, 0); restoreAnimation := True; end; ExStyle := GetWindowLongPtr(hWindow, GWL_EXSTYLE); if (ExStyle and WS_EX_LAYERED) <> WS_EX_LAYERED then begin SetWindowLongPtr(hWindow, GWL_EXSTYLE, ExStyle or WS_EX_LAYERED); end; SetLayeredWindowAttributes(hWindow, 0, 1, LWA_ALPHA); ShowWindow(hWindow, SW_SHOWNOACTIVATE); end; GetWindowRect(hWindow, R) ; bmp.Width := R.Right - R.Left; bmp.Height := R.Bottom - R.Top; bmp.Canvas.Lock; try Result := printWindowAPI(hWindow, bmp.Canvas.Handle, 0); finally bmp.Canvas.Unlock; if (wp.showCmd = SW_SHOWMINIMIZED) then begin SetWindowPlacement(hWindow, @wp); SetLayeredWindowAttributes(hWindow, 0, 255, LWA_ALPHA); if (ExStyle and WS_EX_LAYERED) <> WS_EX_LAYERED then begin SetWindowLongPtr(hWindow, GWL_EXSTYLE, ExStyle); end; if restoreAnimation then begin ai.iMinAnimate := 1; SystemParametersInfo(SPI_SETANIMATION, SizeOf(ANIMATIONINFO), @ai, 0); end; end; Result := True; end; end; end; end; function FindHandleByTitle(WindowTitle: string): Hwnd; var NextHandle: Hwnd; NextTitle: array[0..260] of char; begin NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST); while NextHandle > 0 do begin GetWindowText(NextHandle, NextTitle, 255); if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then begin Result := NextHandle; Exit; end else NextHandle := GetWindow(NextHandle, GW_HWNDNEXT); end; Result := 0; end; function EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall; export; var Title, ClassName: array[0..255] of char; begin Result := True; GetWindowText(wHandle, Title, 255); GetClassName(wHandle, ClassName, 255); if IsWindowVisible(wHandle) then lb.Items.Add('Title: '+string(Title) + ' - Class: ' + string(ClassName) + ' - Handle: ' + IntToStr(FindHandleByTitle(Title))); end; procedure TForm1.Button1Click(Sender: TObject); begin EnumWindows(@EnumWindowsProc, Integer(Listbox1)); end; procedure TForm1.Button2Click(Sender: TObject); var hWd: HWND; Bmp: TBitmap; begin hWd := HWND({$IFDEF WIN64}StrToInt64{$ELSE}StrToInt{$ENDIF}(Edit1.Text)); Bmp := TBitmap.Create; try if WindowSnap(hWd, bmp) then Image1.Picture.Assign(bmp); Image1.Refresh; finally bmp.Free; end; end; end. |
#2
|
|||
|
|||
Для Win32
Код:
type LONG_PTR = Integer; |
#3
|
|||
|
|||
Спасибо огромное. Запустилось.
Но теперь сразу после запуска, вылетает ошибка: Точка входа в процедуру SetWindowLongPtrA не найдена в библиотеки DLL user32.dll. Последний раз редактировалось Creator13, 12.01.2017 в 18:08. |
#4
|
|||
|
|||
Все разобрался. Спасибо за помощь
|