Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Очертить область проверки PixelChecksum(x1,y1,x2,y2). (http://forum.oszone.net/showthread.php?t=143502)

HORRIBLE 25-06-2009 20:42 1151742

Очертить область проверки PixelChecksum(x1,y1,x2,y2).
 
Использую команду PixelChecksum(100,100,200,200), а можно каким нить способом очертить проверяемую область, да таким образом чтобы фон был прозрачным.

Спасибо.

proxy 26-06-2009 02:33 1151982

банальные варианты
Код:

#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 1152002

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

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

proxy 26-06-2009 05:53 1152016

Цитата:

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

Окно, да. На самом деле очень просто, сам бы не поверил. За это отвечает доп-стиль: $WS_EX_TRANSPARENT
Обновил пример.

Belfigor 26-06-2009 09:51 1152083

Спасибо, я даже и не думал что все так просто :)

Belfigor 01-08-2009 16:15 1183053

Нашел более интересный на мой взгляд вариант:
Код:

#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



Время: 13:53.

Время: 13:53.
© OSzone.net 2001-