Что нового

Ненадежное выполнение скриншота.

Snegovik

Новичок
Сообщения
47
Репутация
0
Здравствуйте.
Помогите.
Ума не приложу что не так.

Скрипт действует как аналог Fraps - должен делать скриншоты полноэкранного приложения RedFraction.exe
Но что-то все скриншоты - похожи один на другой - полностью идентичны.
Запускаю другое приложение - там вообще полностью черные скриншоты.
Третье приложение запускаю - там скриншоты нормальные делаются.

Ответьте - как снять скриншоты с полноэкранного приложения - надежно ?
Код:
#include <WinAPIProc.au3>
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>

Global $sProcess = 'soa.exe'

;HotKeySet('{ESC}', '_Exit')
HotKeySet('й', '_Screen')
HotKeySet('q', '_Screen')

While Sleep(200)
WEnd

Func _Screen()
    Local $iPID, $aWinArray, $aWinArray[1][0], $aClientSize, $hDC, $hMemDC, $hHBitmap, $hObj, $hBitmap
    Local Static $i

    $iPID = ProcessExists($sProcess)
    If Not $iPID Then Return TrayTip('Screen', 'Процесс "' & $sProcess & '" не найден.', 10, 3)
    $aWinArray = _WinAPI_EnumProcessWindows($iPID)
    If @error Then Return TrayTip('Screen', 'Окно не существует', 10, 3)

    ;_ArrayDisplay($aWinArray, '$aWinArray') ; <<<<<<<<<<<<<<<<<<<<<<<< П Р О В Е Р К А >>>>>>>>>>>>>>>>>>>>>>>>

    WinActivate($aWinArray[1][0])
    $aClientSize = WinGetClientSize($aWinArray[1][0])
    $hDC = _WinAPI_GetDC($aWinArray[1][0])
    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $aClientSize[0], $aClientSize[1])
    $hObj = _WinAPI_SelectObject($hMemDC, $hHBitmap)
    _WinAPI_BitBlt($hMemDC, 0, 0, $aClientSize[0], $aClientSize[1], $hDC, 0, 0, $SRCCOPY)
    _WinAPI_SelectObject($hMemDC, $hObj)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_ReleaseDC($aWinArray[1][0], $hDC)
    _GDIPlus_Startup()
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
    _WinAPI_DeleteObject($hHBitmap)
    $i += 1
    _GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & '\Screen-' & $i & '.bmp')
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
EndFunc   ;==>_Screen

Func _Exit()
    Exit
EndFunc   ;==>_Exit
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
скриншоты с полноэкранного приложения
Код:
#include <Clipboard.au3>
#include <ScreenCapture.au3>

HotKeySet('й', '_Screen')
HotKeySet('q', '_Screen')

While Sleep(200)
WEnd

Func _Screen()
  Local Static $i
  Send("{PRINTSCREEN}")
  Sleep(333)
  _ClipBoard_Open(0)
  $hBMP = _ClipBoard_GetDataEx($CF_BITMAP)
  _ClipBoard_Close()
  $i += 1
  _ScreenCapture_SaveImage(@ScriptDir & '\Screen-' & $i & '.bmp', $hBMP)
EndFunc
 
Автор
S

Snegovik

Новичок
Сообщения
47
Репутация
0
InnI
Спасибо.
Но не работает.

Запускаю скрипт, жму на клавишу.
И у меня - сворачивается полноэкранное приложение и появляется другая программа с изображением скриншота.
Да скриншот этот вдобавок включает - два других рабочих стола, которые к приложению никакого отношения не имеют.

Мне нужно - просто сохранить снимок этого полноэкранного приложения, не открывая никаких других сторонних программ.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Скрипт нажимает клавишу PrintScreen. Вероятно, у вас эта клавиша назначена на какую-то программу по созданию скриншотов.
 
Автор
S

Snegovik

Новичок
Сообщения
47
Репутация
0
Да, но скрипт из первого сообщения - на некоторых полноэкранных приложениях - все же делает именно нормальный скриншот приложения (не затрагивая другие рабочие столы) а также при его работе - никаких сторонних программ не открывается.

Вопрос в том, что на некоторых других приложениях - он работает плохо.
И я спрашивал - в чем тут может быть проблема и как ее можно поправить.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <ScreenCapture.au3>

HotKeySet('й', '_Screen')
HotKeySet('q', '_Screen')

While Sleep(200)
WEnd

Func _Screen()
  Local Static $i
  $i += 1
  _ScreenCapture_Capture(@ScriptDir & '\Screen-' & $i & '.bmp', 0, 0, -1, -1, False)
EndFunc
 
Верх