Что нового

Размышления на тему универсального скриншота экрана

Коршун

Новичок
Сообщения
58
Репутация
1
Как же получить скриншот блокировки экрана??
Код:
#Include <ClipBoard.au3>
#Include <GDIPlus.au3>
Global Const $DESKTOP_SWITCHDESKTOP = 0x0100
While 1
   If _IsWorkstationLocked() Then
	  _ScreenCapture(@ScriptDir & '\Screenshot.bmp')
	  Exit
   EndIf
   Sleep(10)
WEnd

Func _IsWorkstationLocked()
   Local $Result = False
   
   $hDesktop = DllCall('user32.dll', 'hwnd', 'OpenDesktop', 'str', 'Default', 'int', 0, 'int', 0, 'int', $DESKTOP_SWITCHDESKTOP)
   If Not @error Then
      $Result = DllCall('user32.dll', 'int', 'SwitchDesktop', 'hwnd', $hDesktop[0])
      $Result = Not $Result[0]
      DllCall('user32.dll', 'int', 'CloseDesktop', 'hwnd', $hDesktop[0])
   EndIf
   Return $Result
EndFunc   ;==>_IsWorkstationLocked

Func _ScreenCapture($sFile)

    Local $Result, $Timer, $hImage, $hBitmap = 0

    ClipPut('')
    Send('{PRINTSCREEN}')
    $Timer = TimerInit()
    While TimerDiff($Timer) < 1000
        _ClipBoard_Open(0)
        $hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
        _ClipBoard_Close()
        If $hBitmap Then
            ExitLoop
        EndIf
        Sleep(10)
    WEnd
    If Not $hBitmap Then
        Return 0
    EndIf
    _GDIPlus_Startup()
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    $Result = _GDIPlus_ImageSaveToFile($hImage, $sFile)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Return $Result
EndFunc
Код:
_ScreenCapture_Capture()
тоже не помогает((
 

alexnasa

Новичок
Сообщения
48
Репутация
0
функция _ScreenCapture_Capture() берет не все
Мужики, спасибо за ваш труд! Очень пригодилось мне, но, могу ли я вас попросить все же с _ScreenCapture_Capture версию прикинуть, но так, что бы скринило именно активное окно, как это сделано в ваших скриптах. А может _ScreenCapture_Capture и не умеет так? А ещё- полученный файл- скрин возможно ли подрезать (например правую его сторону на столько-то пиксел отрезать-откадрировать)?
 

InnI

AutoIT Гуру
Сообщения
4 247
Репутация
1 128
alexnasa
что бы скринило именно активное окно
Либо передавайте в функцию _ScreenCapture_Capture() координаты активного окна, либо используйте
Код:
_ScreenCapture_CaptureWnd()
 

alexnasa

Новичок
Сообщения
48
Репутация
0
координаты у меня изменчивы.. а взяв пример из хелпа к _ScreenCapture_CaptureWnd()

Код:
#include <ScreenCapture.au3>

_Main()

Func _Main()
    Local $hGUI

    ; Nicaa?o GUI
    $hGUI = GUICreate("Screen Capture", 400, 300)
    GUISetState()

    ; Caoaaouaaao ieii
    _ScreenCapture_CaptureWnd (@MyDocumentsDir & "\GDIPlus_Image.jpg", $hGUI)

EndFunc   ;==>_Main

получил скринфото пустого окна с заголовком.. Дилетатнт я тот ещё..
 

InnI

AutoIT Гуру
Сообщения
4 247
Репутация
1 128
alexnasa
В вашем примере окно не успевает нарисоваться. Перед снимком сделайте задержку в 300-500 мс.
 

alexnasa

Новичок
Сообщения
48
Репутация
0
Код:
#include <ScreenCapture.au3>

_Main()

Func _Main()
    Local $hGUI

    ;
    $hGUI = GUICreate("Screen Capture", 400, 300)
    GUISetState()

    ; 
	Sleep(9000) ; 9 seconds
    _ScreenCapture_CaptureWnd (@MyDocumentsDir & "\GDIPlus_Image.jpg", $hGUI)

EndFunc   ;==>_Main
сделал.. на 9 сек появляется серое пустое окно
 

InnI

AutoIT Гуру
Сообщения
4 247
Репутация
1 128
alexnasa
на 9 сек появляется серое пустое окно
Всё правильно. После чего снимок этого серого пустого окна будет сохранён в папке документов.
 

alexnasa

Новичок
Сообщения
48
Репутация
0
но мне нужна картинка, а не пустышка..
 

InnI

AutoIT Гуру
Сообщения
4 247
Репутация
1 128
alexnasa
но мне нужна картинка, а не пустышка
Какое окно создали, такое и сфоткали. При чём тут функция снятия скриншота? :stars:

Нужна картинка - сделайте картинку.
Код:
#include <ScreenCapture.au3>

$TempFile = @ScriptDir & "\TestScreenCaptureFile.jpg"
_ScreenCapture_Capture($TempFile, 0, 0, 400, 400)

$hGUI = GUICreate("Screen Capture")
GUICtrlCreatePic($TempFile, 0, 0, 0, 0)
FileDelete($TempFile)
GUISetState()
WinWaitActive($hGUI)
Sleep(100)

_ScreenCapture_CaptureWnd(@ScriptDir & "\ScreenShot.jpg", $hGUI)
ShellExecute(@ScriptDir & "\ScreenShot.jpg")
 

alexnasa

Новичок
Сообщения
48
Репутация
0
:laugh: Заработало! (Простите - я дилетант!). Но последнее осталось. При этом нужно, что бы это был снимок не области, а активного в данный момент окна GUI.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
alexnasa

Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Глобальный модератор.
 

alexnasa

Новичок
Сообщения
48
Репутация
0
Работает! Спасибо, добрый человек!!!!!! :IL_AutoIt_1:

Прошу прощения за доп.вопрос! А можно ли "сфотографировать", отдельно взятую, вот эту красную кнопку? День потратил, но у меня так и не вышло..
 

Вложения

alexnasa

Новичок
Сообщения
48
Репутация
0
Рррработаееет!!!!! Спасиибоо!!
Код:
_ScreenCapture_CaptureWnd(@ScriptDir & "\red-button.png", ControlGetHandle("GOALcity", "", "Button8"))
 

alexnasa

Новичок
Сообщения
48
Репутация
0
Странно .. Получилось делать снимки отдельных сегментов окна программы (!!!), но не получается в последнем примере сделать снимок часов стандартного трея Windows. Autoit window info не показывает заголовок трея.. А его ClassnameNN показывает (TrayClockWClass1).
Что указать в этой строке? Пока, что выкрутился указанием координат.
Код:
_ScreenCapture_CaptureWnd(@ScriptDir & "\red-button.png", ControlGetHandle("?_?_?", "", "TrayClockWClass1"))
 

alexnasa

Новичок
Сообщения
48
Репутация
0
Код:
#include <ScreenCapture.au3>
_ScreenCapture_CaptureWnd(@ScriptDir & "\red-button.png", ControlGetHandle("[class:Shell_TrayWnd]", "", "TrayClockWClass1"))


==> Error opening the file.: #include "GDIPlus.au3"
все, какие были версии подставлял.. ругается и всё тут..
 

Вложения

alexnasa

Новичок
Сообщения
48
Репутация
0
Код:
Рванул на другой комп! Работает на другом!!! (3.3.9.24 (Beta))
Ссспаасибищее!!! :laugh: (Извините за дилетантство)

Попутно пришла мысль, раз в час или 15 мин., все ПК локальной сети, могут отсылать в общую папку полезные (в т.ч. тревожные) скриншоты штатного трея. И для этого не нужно иметь соотв. настройки рассылки тревог, в ПО мониторинга здоровья ПК. И можно обойтись без Zabbix.
Тем самым строчка-скриншот покажет "нездоровье" одного из ПК. Например температуру и SMART жёстких дисков, температуру процессора, видеокарты и обороты (останов) вентиляторов, напряжения БП ПК и его ИБП!
Тогда даже малоквалифицированному дежурному оператору достаточно хотя бы раз в (..) поглядывать на thumbnails вьюера, типа "irfanview", замечая нестандарт в общей стройной картине таких вот сточек-полосок, общего листинга в окне-таблице (на отдельном мониторе).
Заметно будет сразу, если эти строки строго стандартизировать, не допуская разнобой. (см. примерное фото одной строки из многострочной "таблицы")
Ну, а если один из этих ПК, по объективным причинам, покинет сеть, то его часы в таблице остановятся "на самом интересном" для оператора месте со скриншотом проблем на момент краха.
Ну и общий список тегов вот такой у меня получился: TrayNotifyWnd1; ToolbarWindow321; ToolbarWindow322; Button1; CiceroUIWndFrame1; ReBarWindow321
 

Вложения

Верх