Что нового

Скриншот определенной области окна программы, включая области прокрутки

Сообщения
34
Репутация
0
Здравствуйте, уважаемые форумчане.
Помогите решить непростой вопрос.

Есть окно программы - Диспетчер задач.
И в этом окне есть область, которая не умещается целиком на окне, а прокручивается бегунком.
АвтоитИнфо - выдает название этой области - как SysListView32

Подскажите - как получить скриншот этой области целиком, зная название программы "Диспетчер задач" и название области "SysListView32" ?
А сам скриншот - сохранить в ту же папку, где сам скрипт.
 

Вложения

  • Внутренняя область - SysListView32.jpg
    Внутренняя область - SysListView32.jpg
    140.1 КБ · Просмотры: 12

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Сделать-то можно. Непонятен смысл :scratch:

Перед запуском лучше избавиться от горизонтальной полосы прокрутки - увеличить ширину окна или уменьшить/убрать колонки
Код:
#AutoIt3Wrapper_UseX64=Y
#RequireAdmin

#include <GuiHeader.au3>
#include <GuiListView.au3>
#include <ScreenCapture.au3>

$hWnd = WinActivate("Диспетчер задач Windows")
If Not $hWnd Then Exit MsgBox(0, "", "Окно не найдено")
$hHead = ControlGetHandle($hWnd, "", "SysHeader321")
$hList = ControlGetHandle($hWnd, "", "SysListView321")
If Not ControlCommand($hWnd, "", $hList, "IsVisible") Then Exit MsgBox(0, "", "Список не виден")
Sleep(555)

$aPosHead = _GUICtrlHeader_GetItemRect($hHead, 0)
$iHead = $aPosHead[3] - $aPosHead[1]
$aPosList = _GUICtrlListView_GetItemRect($hList, 0)
$iItem = $aPosList[3] - $aPosList[1]
$iCount = _GUICtrlListView_GetItemCount($hList)

_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0($aPosList[2] - $aPosList[0], $iHead + $iItem * $iCount)
$hGraph = _GDIPlus_ImageGetGraphicsContext($hImage)

$hBmp = _ScreenCapture_CaptureWnd("", $hList, $aPosHead[0], $aPosHead[1], $aPosList[2], $aPosHead[3], False)
$hImg = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
_GDIPlus_GraphicsDrawImage($hGraph, $hImg, 0, 0)
_GDIPlus_BitmapDispose($hImg)
_WinAPI_DeleteObject($hBmp)

For $i = 0 To $iCount - 1
  _GUICtrlListView_EnsureVisible($hList, $i)
  $aPos = _GUICtrlListView_GetItemRect($hList, $i)
  $hBmp = _ScreenCapture_CaptureWnd("", $hList, $aPos[0], $aPos[1], $aPos[2], $aPos[3], False)
  $hImg = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
  _GDIPlus_GraphicsDrawImage($hGraph, $hImg, 0, $iHead + $i * $iItem)
  _GDIPlus_BitmapDispose($hImg)
  _WinAPI_DeleteObject($hBmp)
Next

_GDIPlus_ImageSaveToFile($hImage, "ListView.png")
_GDIPlus_ImageDispose($hImage)
_GDIPlus_GraphicsDispose($hGraph)
_GDIPlus_Shutdown()
 
Автор
В
Сообщения
34
Репутация
0
Все работает.

Подскажите - а для программы Paint - как такое же решение применить ?

Добавляю названия компонентов программы Пайнт - в код....
И уже - не работает.
Код:
#AutoIt3Wrapper_UseX64=Y
#RequireAdmin

#include <GuiHeader.au3>
#include <GuiListView.au3>
#include <ScreenCapture.au3>

$hWnd = WinActivate("Безымянный - Paint")
If Not $hWnd Then Exit MsgBox(0, "", "Окно не найдено")
$hHead = ControlGetHandle($hWnd, "", "NetUIHWND1")
$hList = ControlGetHandle($hWnd, "", "Afx:00000000FF940000:81")
If Not ControlCommand($hWnd, "", $hList, "IsVisible") Then Exit MsgBox(0, "", "Список не виден")
Sleep(555)

$aPosHead = _GUICtrlHeader_GetItemRect($hHead, 0)
$iHead = $aPosHead[3] - $aPosHead[1]
$aPosList = _GUICtrlListView_GetItemRect($hList, 0)
$iItem = $aPosList[3] - $aPosList[1]
$iCount = _GUICtrlListView_GetItemCount($hList)

_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0($aPosList[2] - $aPosList[0], $iHead + $iItem * $iCount)
$hGraph = _GDIPlus_ImageGetGraphicsContext($hImage)

$hBmp = _ScreenCapture_CaptureWnd("", $hList, $aPosHead[0], $aPosHead[1], $aPosList[2], $aPosHead[3], False)
$hImg = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
_GDIPlus_GraphicsDrawImage($hGraph, $hImg, 0, 0)
_GDIPlus_BitmapDispose($hImg)
_WinAPI_DeleteObject($hBmp)

For $i = 0 To $iCount - 1
  _GUICtrlListView_EnsureVisible($hList, $i)
  $aPos = _GUICtrlListView_GetItemRect($hList, $i)
  $hBmp = _ScreenCapture_CaptureWnd("", $hList, $aPos[0], $aPos[1], $aPos[2], $aPos[3], False)
  $hImg = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
  _GDIPlus_GraphicsDrawImage($hGraph, $hImg, 0, $iHead + $i * $iItem)
  _GDIPlus_BitmapDispose($hImg)
  _WinAPI_DeleteObject($hBmp)
Next

_GDIPlus_ImageSaveToFile($hImage, "ListView.png")
_GDIPlus_ImageDispose($hImage)
_GDIPlus_GraphicsDispose($hGraph)
_GDIPlus_Shutdown()
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Василиса Лукьянчикова [?]
Добавляю названия компонентов программы Пайнт - в код....
И уже - не работает.
Вы спрашивали про окно диспетчера задач и элемент SysListView32. При чём тут Paint?
 
Верх