Что нового

Скриншот окна по нажатию клавиши

OlegSmirnov

Новичок
Сообщения
52
Репутация
0
Версия AutoIt: 3.3.14.2

Описание:
Здравствуйте, уважаемые знатоки autoit.
Помогите с решением вопроса.

Есть программа с текстовым фрагментом в Title : "Fceux 2"
Как скриптом - при нажатии клавиши "W" - создавать скриншот этого окна и размещать в той же папке, что и скрипт ?

Примечания:
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
OlegSmirnov сказал(а):
Есть программа с текстовым фрагментом в Title : "Fceux 2"
Как скриптом - при нажатии клавиши "W" - создавать скриншот этого окна и размещать в той же папке, что и скрипт ?

Код:
#include <ScreenCapture.au3>
Opt("TrayAutoPause", 0)
Opt("WinTitleMatchMode", -2)
HotKeySet("{ESC}", "_Exit")
HotKeySet("w", "_Screen")

While 1
	Sleep(10)
WEnd

Func _Screen()
	Local $hWnd = WinActive("Fceux 2")
	If $hWnd Then
		_ScreenCapture_CaptureWnd(@ScriptDir & "\Screen.jpg", $hWnd, 0, 0, -1, -1, False)
	Else
		TrayTip("Screen", "Окно не существует или не активно", 5)
	EndIf
EndFunc   ;==>_Screen

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Автор
O

OlegSmirnov

Новичок
Сообщения
52
Репутация
0
Tempo, не работает.
Жму на кнопку W - ничего не происходит.

Скриншотов в папке со скриптом - не появляется.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
OlegSmirnov сказал(а):
Tempo, да - окно активно.
А в трее нет всплывающей ошибки что окна не сущесвует?

Код:
#RequireAdmin
#include <ScreenCapture.au3>
Opt("TrayAutoPause", 0)
Opt("WinTitleMatchMode", -2)
HotKeySet("{ESC}", "_Exit")
HotKeySet("w", "_Screen")

While 1
    Sleep(10)
WEnd

Func _Screen()
    Local $hWnd = WinActive("Fceux 2")
    If $hWnd Then
        _ScreenCapture_CaptureWnd(@ScriptDir & "\Screen.jpg", $hWnd, 0, 0, -1, -1, False)
		ShellExecute(@ScriptDir & "\Screen.jpg")
    Else
        TrayTip("Screen", "Окно не существует или не активно", 10, 3)
    EndIf
EndFunc   ;==>_Screen

Func _Exit()
    Exit
EndFunc   ;==>_Exit



Добавлено:
Сообщение автоматически объединено:

Еще можете попробовать так не будет проверки активно ли окно

Код:
#RequireAdmin
#include <ScreenCapture.au3>
Opt("TrayAutoPause", 0)
Opt("WinTitleMatchMode", -2)
HotKeySet("{ESC}", "_Exit")
HotKeySet("w", "_Screen")

While 1
    Sleep(10)
WEnd

Func _Screen()
    Local $hWnd = WinGetHandle("Fceux 2")
    If $hWnd Then
        _ScreenCapture_CaptureWnd(@ScriptDir & "\Screen.jpg", $hWnd, 0, 0, -1, -1, False)
		ShellExecute(@ScriptDir & "\Screen.jpg")
    Else
        TrayTip("Screen", "Окно не существует", 10, 3)
    EndIf
EndFunc   ;==>_Screen

Func _Exit()
    Exit
EndFunc   ;==>_Exit
 
Автор
O

OlegSmirnov

Новичок
Сообщения
52
Репутация
0
Tempo , ни первый, ни второй скрипт - не работает.
Никаких ошибок не выдают.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
OlegSmirnov
Какая у вас в Windows раскладка клавиатуры по умолчанию? Если русская, то замените горячую клавишу "w" на "ц".
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Я и забыл

Код:
#RequireAdmin
#include <ScreenCapture.au3>
Opt("TrayAutoPause", 0)
Opt("WinTitleMatchMode", -2)
HotKeySet("{ESC}", "_Exit")
HotKeySet("w", "_Screen")
HotKeySet("ц", "_Screen")

While 1
    Sleep(10)
WEnd

Func _Screen()
    Local $hWnd = WinActive("Fceux 2")
    If $hWnd Then
        _ScreenCapture_CaptureWnd(@ScriptDir & "\Screen.jpg", $hWnd, 0, 0, -1, -1, False)
    Else
        TrayTip("Screen", "Окно не существует или не активно", 10, 3)
    EndIf
EndFunc   ;==>_Screen

Func _Exit()
    Exit
EndFunc   ;==>_Exit
 
Автор
O

OlegSmirnov

Новичок
Сообщения
52
Репутация
0
Tempo , а вот теперь стало выдавать сообщение - окна не существует.

( я имел ввиду - не точное название окна, а то что программа имеет текстовый фрагмент в Title : "Fceux 2" )
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
OlegSmirnov сказал(а):
Tempo , а вот теперь стало выдавать сообщение - окна не существует.

( я имел ввиду - не точное название окна, а то что программа имеет текстовый фрагмент в Title : "Fceux 2" )

В скрипте используется
Код:
Opt("WinTitleMatchMode", -2)

Соответствие любой подстроке в заголовке + принудительное сопоставление в нижнем регистре


Добавлено:
Сообщение автоматически объединено:

Попробуйте так

Код:
#RequireAdmin
#include <ScreenCapture.au3>
Opt("TrayAutoPause", 0)
Opt("WinTitleMatchMode", -2)
HotKeySet("{ESC}", "_Exit")
HotKeySet("w", "_Screen")
HotKeySet("ц", "_Screen")

While 1
    Sleep(10)
WEnd

Func _Screen()
    Local $hWnd = WinGetHandle("Fceux 2")
    If $hWnd Then
        _ScreenCapture_CaptureWnd(@ScriptDir & "\Screen.jpg", $hWnd, 0, 0, -1, -1, False)
    Else
        TrayTip("Screen", "Окно не существует", 10, 3)
    EndIf
EndFunc   ;==>_Screen

Func _Exit()
    Exit
EndFunc   ;==>_Exit
 
Автор
O

OlegSmirnov

Новичок
Сообщения
52
Репутация
0
Tempo , подскажите пожалуйста.
При каждом запуске данный скрипт - выдает окно - "Разрешить внесение изменений на данном компьютере...".

Как избавиться от этого сообщения?
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Уберите
Код:
#RequireAdmin


Или отключите UAC
 
Автор
O

OlegSmirnov

Новичок
Сообщения
52
Репутация
0
Tempo, еще такой вопрос.
Во время создания скриншота - все другие окна, которые стоят - поверх этого окна - также попадают в скриншот (например гаджет Windows - "Часы").

Можно как-то сделать скриншот - только одного окна, без посторонних элементов ?
Или это невозможно ?
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
OlegSmirnov сказал(а):
Можно как-то сделать скриншот - только одного окна, без посторонних элементов ?
Или это невозможно ?

Код:
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>
Opt("TrayAutoPause", 0)
Opt("WinTitleMatchMode", -2)
HotKeySet("{ESC}", "_Exit")
HotKeySet("w", "_Screen")
HotKeySet("ц", "_Screen")
OnAutoItExitRegister("_OnExit")
_GDIPlus_Startup()

While 1
	Sleep(10)
WEnd

Func _Screen()
	Local $hWnd = WinGetHandle("Fceux 2")
	If $hWnd Then
		Local $iW = _WinAPI_GetWindowWidth($hWnd), $iH = _WinAPI_GetWindowHeight($hWnd), $hDC, $hMemDC, $hHBitmap, $hObj, $hBitmap

		$hDC = _WinAPI_GetWindowDC($hWnd)
		$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
		$hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
		$hObj = _WinAPI_SelectObject($hMemDC, $hHBitmap)

		_WinAPI_PrintWindow($hWnd, $hMemDC)

		_WinAPI_SelectObject($hMemDC, $hObj)
		_WinAPI_DeleteDC($hMemDC)
		_WinAPI_ReleaseDC($hWnd, $hDC)

		$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
		_WinAPI_DeleteObject($hHBitmap)

		_GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\Screen.jpg")
		_GDIPlus_BitmapDispose($hBitmap)
	Else
		TrayTip("Screen", "Окно не существует", 10, 3)
	EndIf
EndFunc   ;==>_Screen

Func _OnExit()
	_GDIPlus_Shutdown()
EndFunc   ;==>_OnExit

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Верх