johnnydp 20 Posted May 10, 2019 Hi, Looking for some realiable method of making screenshot BitBlt give sometimes blank screen of desktop Can anyone post working code of other method Speed is also important, I realize it might be little slower Share this post Link to post
Larry Hengen 39 Posted May 10, 2019 The TForm method GetFormImage might be what you are looking for. Share this post Link to post
M.Joos 30 Posted May 10, 2019 In modern Windows (I think they started with Win7) you could use the Windows Desktop Duplication API. A delphi wrapper can be found here https://github.com/tothpaul/Delphi/tree/master/DesktopDuplicationAPI Share this post Link to post
johnnydp 20 Posted May 10, 2019 @Larry Hengen This does not work with full desktop and form independent @M.JoosThis could work, one disadvantage: Really modern only, for me wored from 8.1 (not 7) Thanks for input guys. Share this post Link to post
PeterBelow 238 Posted May 10, 2019 8 hours ago, johnnydp said: Hi, Looking for some realiable method of making screenshot BitBlt give sometimes blank screen of desktop Can anyone post working code of other method Speed is also important, I realize it might be little slower One way that is fairly reliable is to fake a press of the print screen key. The main problem is that you have to get the image from the clipboard, and that of course overwrites any previous content. procedure TForm1.Button1Click(Sender: TObject); begin Clipboard.Clear; PostKeyEx32(VK_SNAPSHOT, [], false); Application.ProcessMessages; // 'ware timers! if Clipboard.HasFormat(CF_BITMAP) then image1.Picture.Bitmap.Assign(Clipboard) else label1.Caption := 'No image!'; end; {! <summary> PostKeyEx32 uses keybd_event to manufacture a series of key events matching the passed parameters.</summary> <param name="key"> is the virtual keycode of the key to send. For printable keys this is simply the ANSI code (Ord(character)). </param> <param name="shift"> encodes the state of the modifier keys. This is a set, so you can set several of these keys (shift, control, alt, mouse buttons) in tandem. The TShiftState type is declared in the Classes unit.</param> <param name="specialkey"> normally this should be False. Set it to True to pecify a key on the numeric keypad, for example.</param> <remarks> The events go to the control with focus, even if it is part of another process. Note that for characters key is always the upper-case version of the character. Sending without any modifier keys will result in a lower-case character, sending it with [ssShift] will result in an upper-case character! </remarks> } procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean); type TShiftKeyInfo = record shift: Byte; vkey: Byte; end; byteset = set of 0..7; const shiftkeys: array[1..3] of TShiftKeyInfo = ((shift: Ord(ssCtrl); vkey: VK_CONTROL), (shift: Ord(ssShift); vkey: VK_SHIFT), (shift: Ord(ssAlt); vkey: VK_MENU)); var flag: DWORD; bShift: ByteSet absolute shift; i: Integer; begin for i := 1 to 3 do begin if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0); end; { For } if specialkey then flag := KEYEVENTF_EXTENDEDKEY else flag := 0; keybd_event(key, MapvirtualKey(key, 0), flag, 0); flag := flag or KEYEVENTF_KEYUP; keybd_event(key, MapvirtualKey(key, 0), flag, 0); for i := 3 downto 1 do begin if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), KEYEVENTF_KEYUP, 0); end; { For } end; { PostKeyEx32 } Share this post Link to post
Remy Lebeau 1394 Posted May 10, 2019 4 hours ago, M.Joos said: In modern Windows (I think they started with Win7) you could use the Windows Desktop Duplication API. A delphi wrapper can be found here https://github.com/tothpaul/Delphi/tree/master/DesktopDuplicationAPI The Desktop Duplication API was actually introduced in Windows 8. In Windows Vista and Windows 7, you can use the Magnification API instead (but with some restrictions). Windows 10 build 1803 introduces a new Screen Capture API. Share this post Link to post
johnnydp 20 Posted May 15, 2019 Thanks for all, @PeterBelow this method is preety cool but with big problem it will overwrite current potenrial image in clipboard... Share this post Link to post