Size: a a a

2020 December 09

ED

Ed Doc in Delphi & Lazarus
Извиняюсь за "простыню", если нельзя, то больше так делать не буду 🙊
источник

RS

Renat Suleymanov in Delphi & Lazarus
Ed Doc
а вот в fpc, похоже,  нет. И судя по сорцам, там тоже есть алиасы (заимствованные из дельфей) для базовых типов

 { NativeInt and NativeUInt are Delphi compatibility types. Even though Delphi
   has IntPtr and UIntPtr, the Delphi documentation for NativeInt states that
   'The size of NativeInt is equivalent to the size of the pointer on the
   current platform'. Because of the misleading names, these types shouldn't be
   used in the FPC RTL. Note that on i8086 their size changes between 16-bit
   and 32-bit according to the memory model, so they're not really a 'native
   int' type there at all. }
 NativeInt  = Type PtrInt;
 NativeUInt = Type PtrUInt;

 Int8    = ShortInt;
 Int16   = SmallInt;
 Int32   = Longint;
 IntPtr  = PtrInt;
 UInt8   = Byte;
 UInt16  = Word;
 UInt32  = Cardinal;
 UIntPtr = PtrUInt;
Тут справа типы FPC с документированной разрядностью. Так что все норм.
источник

RS

Renat Suleymanov in Delphi & Lazarus
Как я могу сделать скриншот в Lazarus?
Вот есть такая процедура
procedure CreateScreenshot(aStream: TStream);
var
 MyBitmap: TBitmap;
 ScreenDC: HDC;
begin
 ScreenDC := GetDC(0);
 MyBitmap := TBitmap.Create;
 try
   MyBitmap.LoadFromDevice(ScreenDC);
   MyBitmap.SaveToStream(aStream);
 finally
   MyBitmap.Free;
   ReleaseDC(0,ScreenDC);
 end;
end;
Она работает по умолчании в GUI приложении и удалось добится этого в консольном приложении, если добавить в зависимости LCL...
Но вот в сервисном приложении (то есть демон), возвращается черный прямоугольник вместо скриншота
источник

I

Igor in Delphi & Lazarus
но ведь сервис не имеет доступа к GUI
источник

RS

Renat Suleymanov in Delphi & Lazarus
Igor
но ведь сервис не имеет доступа к GUI
Ok. Может в этом дело. А что можно сделать?
источник

RS

Renat Suleymanov in Delphi & Lazarus
Renat Suleymanov
Ok. Может в этом дело. А что можно сделать?
Да, в английском чате это же сказали (
источник

I

Igor in Delphi & Lazarus
есть какие-то хитрые способы разрешить сервису работать с десктопом, но я их не помню
источник

RS

Renat Suleymanov in Delphi & Lazarus
Кстати, понятно зачем так сделали ) Ради безопасности.
источник

AS

Alexey Shumkin in Delphi & Lazarus
Igor
есть какие-то хитрые способы разрешить сервису работать с десктопом, но я их не помню
запустить под определённым пользователем и поставить галку "разрешить взаимодействие с рабочим столом"
источник

AK

Alexey Kulakov in Delphi & Lazarus
а раньше просто читали бы напрямую видеопамять :(
источник

AS

Alexey Shumkin in Delphi & Lazarus
Alexey Kulakov
а раньше просто читали бы напрямую видеопамять :(
раньше на конях ездили
источник

AS

Alexey Shumkin in Delphi & Lazarus
по просёлочным дорогам
источник

AK

Alexey Kulakov in Delphi & Lazarus
ты как непонятно где живёшь, а то сейчас не ездят
источник

I

Igor in Delphi & Lazarus
Alexey Shumkin
запустить под определённым пользователем и поставить галку "разрешить взаимодействие с рабочим столом"
т.е. доступ будет к сессии именно этого пользователя, если он залогинен?
источник

AK

Alexey Kulakov in Delphi & Lazarus
в т.ч. и по городу
источник

АВ

Александр В... in Delphi & Lazarus
Renat Suleymanov
Как я могу сделать скриншот в Lazarus?
Вот есть такая процедура
procedure CreateScreenshot(aStream: TStream);
var
 MyBitmap: TBitmap;
 ScreenDC: HDC;
begin
 ScreenDC := GetDC(0);
 MyBitmap := TBitmap.Create;
 try
   MyBitmap.LoadFromDevice(ScreenDC);
   MyBitmap.SaveToStream(aStream);
 finally
   MyBitmap.Free;
   ReleaseDC(0,ScreenDC);
 end;
end;
Она работает по умолчании в GUI приложении и удалось добится этого в консольном приложении, если добавить в зависимости LCL...
Но вот в сервисном приложении (то есть демон), возвращается черный прямоугольник вместо скриншота
var
 hWinDC: THandle;
 w, h: integer;
begin
 GetTargetDimensions(w, h);
 hWinDC := GetWindowDC(TargetHandle);
 Bitmap.Width := w;
 Bitmap.Height := h;
 hWinDC := GetWindowDC(TargetHandle);
 BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, hWinDC, 0, 0, SRCCOPY);
 ReleaseDC(TargetHandle, hWinDC);
end;  например
источник

RS

Renat Suleymanov in Delphi & Lazarus
Alexey Shumkin
запустить под определённым пользователем и поставить галку "разрешить взаимодействие с рабочим столом"
Спасибо. Покопаю в эту сторону
источник

АВ

Александр В... in Delphi & Lazarus
Renat Suleymanov
Спасибо. Покопаю в эту сторону
Или как вариант через directx: https://pastebin.com/J93vByv4
источник

RS

Renat Suleymanov in Delphi & Lazarus
Александр В
var
 hWinDC: THandle;
 w, h: integer;
begin
 GetTargetDimensions(w, h);
 hWinDC := GetWindowDC(TargetHandle);
 Bitmap.Width := w;
 Bitmap.Height := h;
 hWinDC := GetWindowDC(TargetHandle);
 BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, hWinDC, 0, 0, SRCCOPY);
 ReleaseDC(TargetHandle, hWinDC);
end;  например
Тоже протестю
источник

AS

Alexey Shumkin in Delphi & Lazarus
Igor
т.е. доступ будет к сессии именно этого пользователя, если он залогинен?
источник