получение скриншота

Обсуждение программ nnCron и nnCron LITE

получение скриншота

Postby AlikasS » Sun, 12 Jun 2011, 17:17

некоторые старые решения пользователеей с форума...
Code: Select all
#( получение_скриншота
NoLog
NoActive
WINAPI: CreateEnhMetaFileA gdi32.dll
WINAPI: CloseEnhMetaFile gdi32.dll
WINAPI: DeleteEnhMetaFile gdi32.dll
WINAPI: BitBlt gdi32.dll
WINAPI: GetDeviceCaps gdi32.dll
: SCREENSHOT  ( a u -- )  { \ mdc sdc --}
\ HDC mdc, sdc;
\ sdc = GetWindowDC(GetDesktopWindow());
  GetDesktopWindow GetWindowDC TO sdc
\ mdc = CreateEnhMetaFile(sdc, "c:\\screenshot.emf", NULL, NULL);
  0 0 2SWAP S" .emf" S+ S>ZALLOC sdc CreateEnhMetaFileA TO mdc
\ BitBlt(mdc, 0, 0, GetDeviceCaps(sdc, DESKTOPHORZRES), GetDeviceCaps(sdc, DESKTOPVERTRES), sdc, 0, 0, SRCCOPY);
  13369376 0 0 sdc 10 sdc GetDeviceCaps 8 sdc GetDeviceCaps 0 0 mdc BitBlt DROP
\ ReleaseDC(GetDesktopWindow(), sdc);
  sdc GetDesktopWindow ReleaseDC DROP
\ DeleteEnhMetaFile(CloseEnhMetaFile(mdc));
  mdc CloseEnhMetaFile DeleteEnhMetaFile DROP ;
Action:
S" C:\скриншот" SCREENSHOT
)#
User avatar
AlikasS
 
Posts: 1440
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: получение скриншота

Postby Aveiro » Sun, 03 Jul 2011, 02:12

Спасибо,пригодится....а вот как быть ,если мониторов несколько и нужно снять скриншо скажем к примеру с 3-его монитора ?
nncron.exe v 1.93b15 Build 1177 08.02.2016
tm.exe v 1.93b15 Build 604 08.02.2016
Aveiro
 
Posts: 222
Joined: Tue, 06 Jul 2010, 21:19

Re: получение скриншота

Postby AlikasS » Tue, 05 Jul 2011, 11:30

Aveiro wrote:Спасибо,пригодится....а вот как быть ,если мониторов несколько и нужно снять скриншо скажем к примеру с 3-его монитора ?
можно почитать про используемые функции из winapi и переделать
User avatar
AlikasS
 
Posts: 1440
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: получение скриншота

Postby Yury Zhukov » Wed, 06 Jul 2011, 08:08

Узнаю код...
По поводу монитора могу дать подсказку, куда копать, реализовывать это мне сейчас некогда.
Функция BitBlt принимает на вход прямоугольник, который надо захватить. В данном примере передается полный десктоп, но никто не мешает передать любой монитор. Т.е. если знаете что именно надо скопировать, можно просто задать прямоугольник. Кстати, точно так же можно снять скриншот окна (с помощью WIN-RECT по хендлу нужного окна легко получить все необходимые значения). Возвращаясь к мониторам, если хочется универсальности, то с помощью функции EnumDisplayMonitors можно получить список всех мониторов. А потом уже с помощью GetMonitorInfo получить координаты экрана для выбранного монитора.
Нас невозможно сбить с пути,
Нам пофигу куда идти.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Re: получение скриншота

Postby samarian » Tue, 12 Jun 2018, 20:01

AlikasS wrote:некоторые старые решения пользователеей с форума...
Code: Select all
#( получение_скриншота
NoLog
NoActive
WINAPI: CreateEnhMetaFileA gdi32.dll
WINAPI: CloseEnhMetaFile gdi32.dll
WINAPI: DeleteEnhMetaFile gdi32.dll
WINAPI: BitBlt gdi32.dll
WINAPI: GetDeviceCaps gdi32.dll
: SCREENSHOT  ( a u -- )  { \ mdc sdc --}
\ HDC mdc, sdc;
\ sdc = GetWindowDC(GetDesktopWindow());
  GetDesktopWindow GetWindowDC TO sdc
\ mdc = CreateEnhMetaFile(sdc, "c:\\screenshot.emf", NULL, NULL);
  0 0 2SWAP S" .emf" S+ S>ZALLOC sdc CreateEnhMetaFileA TO mdc
\ BitBlt(mdc, 0, 0, GetDeviceCaps(sdc, DESKTOPHORZRES), GetDeviceCaps(sdc, DESKTOPVERTRES), sdc, 0, 0, SRCCOPY);
  13369376 0 0 sdc 10 sdc GetDeviceCaps 8 sdc GetDeviceCaps 0 0 mdc BitBlt DROP
\ ReleaseDC(GetDesktopWindow(), sdc);
  sdc GetDesktopWindow ReleaseDC DROP
\ DeleteEnhMetaFile(CloseEnhMetaFile(mdc));
  mdc CloseEnhMetaFile DeleteEnhMetaFile DROP ;
Action:
S" C:\скриншот" SCREENSHOT
)#


Скажите, плиз, какие плагины нужно качнуть?
-
Разобрался - osd.spf (http://www.nncron.ru/download/plugins/osd.spf)
Работает, великовать файл, правда.
НО всё равно лучше, чем вот такое cmd-shell`ное (батником; долго грузится первый раз в сессии (без кэша же), а мне как раз нужно всего 1 раз перед перезагрузкой/выкл. ОС, и тут - 5 сек ждать, лол)):
Code: Select all
<# :
  @echo off
    powershell /nop /ex bypass^
    "&{[ScriptBlock]::Create((gc '%~f0') -join [Char]10).Invoke()}"
  exit /b
#>
(New-Object -ComObject Shell.Application)
Add-Type -AssemblyName System.Windows.Forms
$scr = [Windows.Forms.SystemInformation]::VirtualScreen
$bmp = New-Object Drawing.Bitmap $scr.Width, $scr.Height
$gfx = [Drawing.Graphics]::FromImage($bmp)
$gfx.CopyFromScreen($scr.Location, [Drawing.Point]::Empty, $scr.Size)
$gfx.Dispose()
$bmp.Save("c:\screens\$((Get-Date).ToString('yyyy-MM-dd hh-mm-ss')).png")
$bmp.Dispose()
samarian
 
Posts: 6
Joined: Sat, 14 Jan 2017, 19:56

Re: получение скриншота

Postby elos » Wed, 13 Jun 2018, 09:57

NirCmd и команды "savescreenshot/savescreenshotfull/savescreenshotwin"
"Везение" - это результат тщательной подготовки, "невезение" - следствие разболтанности и лени. - Роберт Хайнлайн
Хорошо сформулированный вопрос отпадает сам собой.
elos
 
Posts: 670
Joined: Tue, 25 Apr 2006, 11:15


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Google [Bot] and 4 guests