PDA

Показать полную графическую версию : [решено] Очертить область проверки PixelChecksum(x1,y1,x2,y2).


HORRIBLE
25-06-2009, 20:42
Использую команду PixelChecksum(100,100,200,200), а можно каким нить способом очертить проверяемую область, да таким образом чтобы фон был прозрачным.

Спасибо.

proxy
26-06-2009, 02:33
банальные варианты
#region: - Options
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#endregion

#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#Include <WinAPI.au3>

HotKeySet('{ESC}', '_Pro_Exit')
Local $iCheckSum

$iCheckSum = _PixelChecksum1(200, 200, 200, 200)
MsgBox(64, 'Пример #1', 'GUI окна в виде линий')

$iCheckSum = _PixelChecksum2(200, 200, 200, 200, 100)
MsgBox(64, 'Пример #2', 'Прозрачное GUI окно')

_Pro_Exit()

#region: - Sleep, Exit, OnAutoItExit
While 1
Sleep(10)
WEnd

Func _Pro_Exit()
Exit
EndFunc
#endregion

Func _PixelChecksum1($iLeft, $iTop, $iRght, $iBottom, $iTrans=255, $iStep=1)
Local $hTop = GUICreate('Top', $iRght, 1, $iLeft, $iTop, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_TRANSPARENT))
Local $hBottom = GUICreate('Bottom', $iRght, 1, $iLeft, $iTop+$iBottom, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_TRANSPARENT))
Local $hLeft = GUICreate('Left', 1, $iBottom, $iLeft+$iRght, $iTop, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_TRANSPARENT))
Local $hRight = GUICreate('Right', 1, $iBottom, $iLeft, $iTop, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_TRANSPARENT))

WinSetTrans($hTop, '', $iTrans)
GUISetBkColor(0x000000, $hTop)
GUISetState(@SW_SHOW, $hTop)

WinSetTrans($hBottom, '', $iTrans)
GUISetBkColor(0x000000, $hBottom)
GUISetState(@SW_SHOW, $hBottom)

WinSetTrans($hLeft, '', $iTrans)
GUISetBkColor(0x000000, $hLeft)
GUISetState(@SW_SHOW, $hLeft)

WinSetTrans($hRight, '', $iTrans)
GUISetBkColor(0x000000, $hRight)
GUISetState(@SW_SHOW, $hRight)

Return PixelChecksum($iLeft, $iTop, $iRght, $iBottom, $iStep)
EndFunc

Func _PixelChecksum2($iLeft, $iTop, $iRght, $iBottom, $iTrans=255, $iStep=1)
Local $hWin = GUICreate('Win', $iTop, $iBottom, $iLeft, $iBottom, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_TRANSPARENT))

WinSetTrans($hWin, '', $iTrans)
GUISetBkColor(0xffffff, $hWin)
GUISetState(@SW_SHOW, $hWin)

Return PixelChecksum($iLeft, $iTop, $iRght, $iBottom, $iStep)
EndFunc

и конечно же можно рисовать с помощью: _WinAPI_DrawLine

Обновил со стилем $WS_EX_TRANSPARENT - окна пропускают клики, но всегда сверху.

Belfigor
26-06-2009, 04:19
Пользуюсь таким же методом, но у него есть один существенный минус, границы нарисованного квадрата являются как бы другим окном. Тоесть если я поверх одного окна, нарисую какие либо контуры для выделения нужных мне областей, а патом в попытке ткнуть на нужное мне место в фоновом окне, ткну на границу выделения, запрос до нужного окна не дойдет.

Можно ли с помощью автоит просто нарисовать какую либо фигуру, выделение, которое будет через себя пропускать нажатия мыши и клавиш в лежащее под ним окно?

proxy
26-06-2009, 05:53
Можно ли с помощью автоит просто нарисовать какую либо фигуру, выделение, которое будет через себя пропускать нажатия мыши и клавиш в лежащее под ним окно? »
Окно, да. На самом деле очень просто, сам бы не поверил. За это отвечает доп-стиль: $WS_EX_TRANSPARENT
Обновил пример (http://forum.oszone.net/post-1151982-2.html).

Belfigor
26-06-2009, 09:51
Спасибо, я даже и не думал что все так просто :)

Belfigor
01-08-2009, 16:15
Нашел более интересный на мой взгляд вариант:
#Include <WinAPI.au3>
_WinAPI_DrawLine($hDC, $iX1, $iY1, $iX2, $iY2)

Рабочий пример:
#include <WindowsConstants.au3>
#include <WinAPI.au3>

ShowCross(@DesktopWidth / 2, @DesktopHeight / 2, 20, 2, 0xFF, 3000)

Func ShowCross($start_x, $start_y, $length, $width, $color, $time)
Local $hDC, $hPen, $obj_orig

$hDC = _WinAPI_GetWindowDC(0) ; DC of entire screen (desktop)
$hPen = _WinAPI_CreatePen($PS_SOLID, $width, $color)
$obj_orig = _WinAPI_SelectObject($hDC, $hPen)

_WinAPI_DrawLine($hDC, $start_x - $length, $start_y, $start_x - 5, $start_y) ; horizontal left
_WinAPI_DrawLine($hDC, $start_x + $length, $start_y, $start_x + 5, $start_y) ; horizontal right
_WinAPI_DrawLine($hDC, $start_x, $start_y - $length, $start_x, $start_y - 5) ; vertical up
; _WinAPI_DrawLine($hDC, $start_x, $start_y + $length, $start_x, $start_y + 5) ; vertical down
_WinAPI_MoveTo($hDC, $start_x, $start_y + $length)
_WinAPI_LineTo($hDC, $start_x, $start_y + 5)

Sleep($time) ; show cross over screen for defined seconds

; refresh desktop (clear cross)
_WinAPI_RedrawWindow(_WinAPI_GetDesktopWindow(), 0, 0, $RDW_INVALIDATE + $RDW_ALLCHILDREN)

; clear resources
_WinAPI_SelectObject($hDC, $obj_orig)
_WinAPI_DeleteObject($hPen)
_WinAPI_ReleaseDC(0, $hDC)
EndFunc ;==>ShowCross




© OSzone.net 2001-2012