Что нового

Скрипт для определения координат и цвета под курсором

scriptolog

Новичок
Сообщения
4
Репутация
0
Про AutoIt Window Info и аналоги знаю.
Этот вариант делал для себя. Все очень просто, но возможно бото-писателям будет полезно =)

- Показывает hWnd, координаты и цвет под курсором (активного окно)
- При постановке на паузу, копирует значения в буфер обмена. Т.е. в редакторе потом просто жмем ctrl+v и вставляем значения.
- Можно задать координаты для перехода курсора по ним.

Весь функционал описан при запуске скрипта.

Код:
; AutoIt Version: 3
; Language:       Russian
; Platform:       WinXP/Win7
; Author:         scriptolog
;=========================================================================================================================================
#include <GUIConstants.au3>
#include <WinAPI.au3>
#include <Array.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>

Global $hWnd,  $X, $Y, $Color
Global $BGR_Color ; цвет в формате BGR 
Global $Paused
HotKeySet("{PAUSE}", "TogglePause") ; При нажатии PAUSE на клавиатуре
HotKeySet("^{PAUSE}", "Terminate") ; При нажатии ctrl+ PAUSE на клавиатуре выходим из скрипта
HotKeySet("!{PAUSE}", "ShowMessage")  ;; При нажатии Alt+ PAUSE ввод координат


$coord_mode = 2 ; 1=absolute, 0=relative, 2=client.
Opt("PixelCoordMode", $coord_mode) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", $coord_mode) ;Отсчет координат мыши от левого верхнего угла клиентской части окна


_GO()

Func _GO()
While 1

_GetMouseCoordinates()
Sleep(150)

WEnd
EndFunc


Func _GetMouseCoordinates()
		 $pos = MouseGetPos()
		 $Color=PixelGetColor($pos[0],$pos[1])
		 $X = $pos[0]
		 $Y = $pos[1]
		 $hWnd=WinGetHandle('[ACTIVE]')
		 $BGR_Color = _ColorConvert($Color) ; конвертируем в BGR
#Region --- CodeWizard generated code Start ---
;ToolTip features: Text=Yes, X Coordinate=Yes, Y Coordinate=Yes, Title=Yes, Info icon
If Not IsDeclared("sToolTipAnswer") Then Local $sToolTipAnswer
$sToolTipAnswer = ToolTip(@LF _
						& "Активное окно hWnd - " & $hWnd & @LF _
						& "Координаты курсора :" & @LF _
						& "X = " & $X & @LF _
						& 'Y = ' & $Y  & @LF _
						& 'Цвет под курсором в RGB- ' & hex($Color,6) & ' или ' & $Color & @LF _
						& 'Цвет под курсором в BGR- ' & hex($BGR_Color,6) & ' или ' & $BGR_Color & @LF _
						& @LF _
						& "Pause - Пауза (копирует в буфер координаты и цвет в hex) " & @LF _
						& "alt+Pause - Ввести координаты для перемещения курсора " & @LF _
						& "ctrl+Pause - Выход" & @LF _
						& @LF _
						,Default,Default, 'ОПРЕДЕЛЕНИЕЕ КООРДИНАТ И ЦВЕТА под курсором',1,0)
#EndRegion --- CodeWizard generated code End ---

EndFunc


Func _ColorConvert($nColor);RGB to BGR or BGR to RGB
    Return _
        BitOR(BitShift(BitAND($nColor, 0x000000FF), -16), _
        BitAND($nColor, 0x0000FF00), _
        BitShift(BitAND($nColor, 0x00FF0000), 16))
EndFunc



Func TogglePause() ;Pause
	$Paused = NOT $Paused
	ClipPut ("RGB " & $X & " " & $Y & " " & hex($Color,6) & @LF _
			& @CRLF & "BGR " & $X & " " & $Y & " " & hex($BGR_Color,6)) ; копируем в буфер координаты x y и цвет в 2х форматах - RGB и BGR
	While $Paused
		sleep(100)
		ToolTip('Script is "Paused"',1,0)
	WEnd
	ToolTip("RUN",0,0)
EndFunc

Func Terminate() ; CTRL+Pause
	Exit 0
EndFunc

Func ShowMessage() ; Alt+Pause
;$hWnd=WinGetHandle('[ACTIVE]')
ToolTip("")
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Координаты", 202, 110, 301, 216)
$X = GUICtrlCreateInput("0", 56, 24, 121, 21)
$Y = GUICtrlCreateInput("0", 56, 48, 121, 21)
$Label1 = GUICtrlCreateLabel("X", 8, 32, 11, 17)
$Label2 = GUICtrlCreateLabel("Y", 8, 48, 11, 17)
$OK = GUICtrlCreateButton("OK", 64, 80, 75, 25)
$Label3 = GUICtrlCreateLabel("Введите координаты", 48, 5, 110, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $OK
			$X =GUICtrlRead($X)
			$Y =GUICtrlRead($Y)
			GUISetState(@SW_HIDE)
			WinActivate($hWnd)
			WinWaitActive($hWnd)
			MouseMove($X,$Y)
			_GO()

	EndSwitch
WEnd
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
А экранная лупа? Как же без нее?
 
Автор
S

scriptolog

Новичок
Сообщения
4
Репутация
0
Взял из этой темы лупу http://autoit-script.ru/index.php?topic=10316.0

Добавил:
; По нажатию Pause, координаты и цвет пикселя копируются в буфер
; По нажатию alt+Pause, курсор перемещается на нулевые координаты

Пока не соображу как сюда прикрутить некоторые вещи, которые были в моем варианте. :scratch:

Может кто-нибудь подскажет..
1. Как, в этом случае, реализовать отсчет координат от клиентской части окна?
2. Как реализовать перемещение курсора, на заданные координаты?


Код в спойлере
Код:
; http://www.autoitscript.com/forum/topic/24154-au3-zoom/page__p__168674#entry168674
;
; Модификация AZJIO
; Добавил управление горячими клавишами
; Колёсико мыши - только регулировка увеличения
; Ctrl+Колёсико мыши - регулировка увеличения и размера лупы
; Shift+Колёсико мыши - только изменение размера лупы
; стрелки двигают курсор
; Добавил прицел, и отображение цвета
;
; Модификация scriptolog
; По нажатию Pause, координаты и цвет пикселя копируются в буфер
; По нажатию alt+Pause, курсор перемещается на нулевые координаты

#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>
#include <GUIConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
HotKeySet("{ESC}", "_Quit")
HotKeySet("{PAUSE}", "_Pause") ; При нажатии PAUSE на клавиатуре
HotKeySet("!{PAUSE}", "_GoPos")  ;; При нажатии Alt+ PAUSE ввод координат
GUIRegisterMsg($WM_MOUSEWHEEL, "WM_MOUSEWHEEL")
Opt("GUIResizeMode", 802)
Opt("GUIOnEventMode", 1)


; установка параметров
Global $Zoom = 4
Global $CaptureWidth = $Zoom * 10
Global $CaptureHeight = $Zoom * 10
Global $GuiWidth = $CaptureWidth * $Zoom
Global $GuiHeight = $CaptureHeight * $Zoom
Global $LastZoom, $Tr1 = 1
Global $Color
Global $Paused
; $d = Int($CaptureWidth/2 + 5)

; Global $SRCCOPY = 0x00CC0020
Global $dll[3], $DeskHDC, $hGuiHDC


$dll[1] = DllOpen("user32.dll")
$dll[2] = DllOpen("gdi32.dll")

Global $LastPos = MouseGetPos()
Sleep(10)

Global $hGui = GUICreate("Zoom", $CaptureWidth * $Zoom, $CaptureHeight * $Zoom, $LastPos[0], $LastPos[1], $WS_POPUP + $WS_BORDER, $WS_EX_TOPMOST, WinGetHandle(AutoItWinGetTitle()))

GUISetState(@SW_SHOW, $hGui)

Global $hGuiClr = GUICreate("c", 160, 19, $LastPos[0], $LastPos[1], $WS_POPUP + $WS_BORDER, -1, $hGui)
$iLbClr = GUICtrlCreateLabel('', -2, -2, 20, 20, $WS_BORDER)
$iStrClr = GUICtrlCreateLabel('', 17, -2, 142, 20, $SS_CENTERIMAGE + $SS_CENTER + $WS_BORDER)

$iL = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Arrow_Left")
$iR = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Arrow_Right")
$iT = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Arrow_Up")
$iB = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Arrow_Down")
Dim $AccelKeys[4][2] = [["{LEFT}", $iL],["{RIGHT}", $iR],["{UP}", $iT],["{DOWN}", $iB]]
GUISetAccelerators($AccelKeys)
GUISetState(@SW_SHOW, $hGuiClr)

Func _Arrow_Left()
    MouseMove($LastPos[0] - 1, $LastPos[1], 0)
EndFunc

Func _Arrow_Right()
    MouseMove($LastPos[0] + 1, $LastPos[1], 0)
EndFunc

Func _Arrow_Up()
    MouseMove($LastPos[0], $LastPos[1] - 1, 0)
EndFunc

Func _Arrow_Down()
    MouseMove($LastPos[0], $LastPos[1] + 1, 0)
EndFunc

$hPen = _WinAPI_CreatePen($PS_SOLID, 2, 0xFF) ; толщина и цвет (BGR) прицела


While 1
    $MousePos = MouseGetPos() ; получаем координаты мыши
    If $LastPos[0] <> $MousePos[0] Or $LastPos[1] <> $MousePos[1] Or $Tr1 = 1 Then ; если позиция мыши и зум изменилась, то выполняем перемещение
        WinMove($hGui, '', $MousePos[0] + $CaptureWidth / 2 + 5, $MousePos[1], $CaptureWidth * $Zoom, $CaptureHeight * $Zoom)
        WinMove($hGuiClr, '', $MousePos[0] + $CaptureWidth / 2 + 5, $MousePos[1], 160, 19)
        $LastPos[0] = $MousePos[0] ; и темпируем координаты и зум
        $LastPos[1] = $MousePos[1]
        $LastZoom = $Zoom
        $Tr1 = 0
        _gdi32_StretchBlt()
    EndIf
    Sleep(10)
WEnd



; $LastPos[0] + $CaptureWidth / 2 + 5 - X позиция окна
; $LastPos[1] - Y позиция окна

; $CaptureWidth * $Zoom - ширина окна
; $CaptureHeight * $Zoom - высота окна

; $LastPos[0] - $CaptureWidth / 2 - X фотографируемого участка
; $LastPos[1] - $CaptureHeight / 2 - Y фотографируемого участка

; $CaptureWidth - ширина участка
; $CaptureHeight - высота участка

Func _gdi32_StretchBlt()
    Local $DeskHDC, $hGuiHDC, $obj_orig, $x
    $DeskHDC = DllCall($dll[1], "int", "GetDC", "hwnd", 0)
    $hGuiHDC = DllCall($dll[1], "int", "GetDC", "hwnd", $hGui)
    If Not @error Then ; если без ошибок открыли DLL, то
        DllCall($dll[2], "int", "StretchBlt", "int", $hGuiHDC[0], "int", _
                0, "int", 0, "int", $CaptureWidth * $Zoom, "int", $CaptureHeight * $Zoom, "int", $DeskHDC[0], "int", _
                $LastPos[0] - Ceiling($CaptureWidth / 2), "int", $LastPos[1] - Ceiling($CaptureHeight / 2), "int", $CaptureWidth, "int", $CaptureHeight, _
                "long", $SRCCOPY)

        ; Создание прицела
        $obj_orig = _WinAPI_SelectObject($DeskHDC[0], $hPen)
        $x = $LastPos[0] + $CaptureWidth / 2 + 5 + (Ceiling($CaptureWidth / 2)+1) * $Zoom
        _WinAPI_DrawLine($DeskHDC[0], $x, $LastPos[1] + $CaptureHeight * $Zoom - 3, $x, _
        $LastPos[1] + (Ceiling($CaptureHeight / 2)+1) * $Zoom) ; вертикальная линия, прицел

        $Color = PixelGetColor($LastPos[0], $LastPos[1])
        GUICtrlSetData($iStrClr, Hex(Int($Color), 6)&', z'&$Zoom&', x'&$LastPos[0]&', y'&$LastPos[1])
        GUICtrlSetBkColor($iLbClr, $Color)

        DllCall($dll[1], "int", "ReleaseDC", "int", $DeskHDC[0], "hwnd", 0)
        DllCall($dll[1], "int", "ReleaseDC", "int", $hGuiHDC[0], "hwnd", $hGui)
    EndIf
EndFunc

Func WM_MOUSEWHEEL($hWndGui, $MsgId, $wParam, $lParam)
    Local $direction, $KeysHeld
    $KeysHeld = BitAND($wParam, 0xFFFF) ; нажатый модификатор
    $direction = BitShift($wParam, 16)
    ; $X = BitShift($lParam, 16) ; координаты мыши
    ; $Y = BitAND($lParam, 0xFFFF)

    If $direction > 0 Then
        $Zoom += 1
    Else
        $Zoom -= 1
    EndIf
    If $Zoom < 2 Then $Zoom = 2

    Switch $KeysHeld
        Case 0 ; ничего
            $CaptureWidth = $GuiWidth / $Zoom
            $CaptureHeight = $GuiHeight / $Zoom
        Case 4 ; Shift
            If $direction > 0 Then
                $GuiWidth = $CaptureWidth * $Zoom
                $GuiHeight = $CaptureHeight * $Zoom

                $Zoom -= 2

                $CaptureWidth = $GuiWidth / $Zoom
                $CaptureHeight = $GuiHeight / $Zoom
            Else
                $GuiWidth = $CaptureWidth * $Zoom
                $GuiHeight = $CaptureHeight * $Zoom

                $Zoom += 2

                $CaptureWidth = $GuiWidth / $Zoom
                $CaptureHeight = $GuiHeight / $Zoom
            EndIf
            $Zoom = $LastZoom
        Case 8 ; Ctrl
            $GuiWidth = $CaptureWidth * $Zoom
            $GuiHeight = $CaptureHeight * $Zoom
    EndSwitch
    $Tr1 = 1
EndFunc

Func _ColorConvert($nColor);RGB to BGR or BGR to RGB
    Return _
        BitOR(BitShift(BitAND($nColor, 0x000000FF), -16), _
        BitAND($nColor, 0x0000FF00), _
        BitShift(BitAND($nColor, 0x00FF0000), 16))
EndFunc

Func _Pause() ;Pause
    $Paused = NOT $Paused
    ClipPut ("RGB "  &$LastPos[0] & " " &$LastPos[1] & " " &Hex($Color,6) _
            & @CRLF &"BGR " &$LastPos[0] & " " &$LastPos[1] & " " &hex(_ColorConvert($Color),6)) ; копируем в буфер координаты x y и цвет в 2х форматах - RGB и BGR
    While $Paused
        sleep(100)
        ToolTip('Script is "Paused"',1,0)
    WEnd
	ToolTip('')
EndFunc

Func _GoPos() ; Alt+Pause
	MouseMove(0,0)
EndFunc

Func _Quit()
    DllClose($dll[1])
    DllClose($dll[2])
    Exit
EndFunc
 
Верх