Что нового

Скриншот окна - как bmp 16-ти цветный

Grell

Новичок
Сообщения
127
Репутация
0
Всем - программистский физкульт-привет.
Помогите со скриптом.

Имеется скрипт - делающий скриншот определенной программы - по нажатию определенной клавиши.
Скриншот сохраняется в формате bmp.
Но тут возникает вопрос.
Оказывается bmp - бывает разным. Есть монохромный bmp, bmp 16-ти цветный, а есть как у меня - bmp 24 разрядный.

Подскажите - как заставить сохранять скриншот окна -как bmp 16-ти цветный ?
Код:
#include <GdiPlus.au3>
#include <WindowsConstants.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("Total Commander")
    If Not $hWnd Then Return TrayTip("Screen", "Окно не существует", 10, 3)
    Local Static $i
    Local $iW = WinGetClientSize($hWnd)[0], $iH = WinGetClientSize($hWnd)[1], $hDC, $hMemDC, $hHBitmap, $hObj, $hBitmap
    $hDC = _WinAPI_GetDC($hWnd)
    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
    $hObj = _WinAPI_SelectObject($hMemDC, $hHBitmap)
    _WinAPI_BitBlt($hMemDC, 0, 0, $iW, $iH, $hDC, 0, 0, $SRCCOPY)
    _WinAPI_SelectObject($hMemDC, $hObj)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_ReleaseDC($hWnd, $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
 

Вложения

  • файл.au3
    1.2 КБ · Просмотры: 1

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Grell [?]
Подскажите - как заставить сохранять скриншот окна -как bmp 16-ти цветный ?
Подсказываю. Используйте функцию копирования
Код:
_GDIPlus_BitmapCloneArea()
В справке перечислены возможные варианты "16-ти цветного bmp" (параметр $iFormat). Выберите подходящий под ваши требования.
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
InnI, добавил функцию _GDIPlus_BitmapCloneArea()

Код:
#include <GdiPlus.au3>
#include <WindowsConstants.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("Total Commander")
    If Not $hWnd Then Return TrayTip("Screen", "Окно не существует", 10, 3)
    Local Static $i
    Local $iW = WinGetClientSize($hWnd)[0], $iH = WinGetClientSize($hWnd)[1], $hDC, $hMemDC, $hHBitmap, $hObj, $hBitmap
	Local $hClone, $iX, $iY

    $hDC = _WinAPI_GetDC($hWnd)
    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
    $hObj = _WinAPI_SelectObject($hMemDC, $hHBitmap)
    _WinAPI_BitBlt($hMemDC, 0, 0, $iW, $iH, $hDC, 0, 0, $SRCCOPY)
    _WinAPI_SelectObject($hMemDC, $hObj)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    _GDIPlus_Startup()
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
	$hClone = _GDIPlus_BitmapCloneArea($hHBitmap, 0, 0, $iX, $iY, $GDIP_PXF16RGB555)
    _WinAPI_DeleteObject($hHBitmap)
    $i += 1


    _GDIPlus_ImageSaveToFile($hClone, @ScriptDir & "\Screen-" & $i & ".bmp")

    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
EndFunc   ;==>_Screen

Func _Exit()
    Exit
EndFunc   ;==>_Exit

Теперь почему-то вовсе перестало работать.
Подскажите - куда именно вставлять этот _GDIPlus_BitmapCloneArea() ?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
$hClone = _GDIPlus_BitmapCloneArea($hBitmap, 0, 0, $iW, $iH, $GDIP_PXF16RGB555)
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
InnI, так я же уже написал в предыдущем сообщении, что уже поставил эту строчку
Код:
$hClone = _GDIPlus_BitmapCloneArea($hBitmap, 0, 0, $iW, $iH, $GDIP_PXF16RGB555)


Но все равно - не работает.
 
Автор
G

Grell

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

Подскажите - в приведенной вами ссылке на справку - почему параметр $GDIP_PXF16GRAYSCALE не работает ?
Код:
#include <GdiPlus.au3>
#include <WindowsConstants.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("Total Commander")
    If Not $hWnd Then Return TrayTip("Screen", "Окно не существует", 10, 3)
    Local Static $i
    Local $iW = WinGetClientSize($hWnd)[0], $iH = WinGetClientSize($hWnd)[1], $hDC, $hMemDC, $hHBitmap, $hObj, $hBitmap
	Local $hClone

    $hDC = _WinAPI_GetDC($hWnd)
    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
    $hObj = _WinAPI_SelectObject($hMemDC, $hHBitmap)
    _WinAPI_BitBlt($hMemDC, 0, 0, $iW, $iH, $hDC, 0, 0, $SRCCOPY)
    _WinAPI_SelectObject($hMemDC, $hObj)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    _GDIPlus_Startup()
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)

    _WinAPI_DeleteObject($hHBitmap)
    $i += 1
	$hClone = _GDIPlus_BitmapCloneArea($hBitmap, 0, 0, $iW, $iH, $GDIP_PXF16GRAYSCALE)
    _GDIPlus_ImageSaveToFile($hClone, @ScriptDir & "\Screen-" & $i & ".bmp")

    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
EndFunc   ;==>_Screen

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

Grell

Новичок
Сообщения
127
Репутация
0
InnI , ладно - будем использовать то, что есть.
Спасибо за ответы.
 
Верх