HORRIBLE
25-06-2009, 20:42
Использую команду PixelChecksum(100,100,200,200), а можно каким нить способом очертить проверяемую область, да таким образом чтобы фон был прозрачным.
Спасибо.
банальные варианты
#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
Пользуюсь таким же методом, но у него есть один существенный минус, границы нарисованного квадрата являются как бы другим окном. Тоесть если я поверх одного окна, нарисую какие либо контуры для выделения нужных мне областей, а патом в попытке ткнуть на нужное мне место в фоновом окне, ткну на границу выделения, запрос до нужного окна не дойдет.
Можно ли с помощью автоит просто нарисовать какую либо фигуру, выделение, которое будет через себя пропускать нажатия мыши и клавиш в лежащее под ним окно?
Можно ли с помощью автоит просто нарисовать какую либо фигуру, выделение, которое будет через себя пропускать нажатия мыши и клавиш в лежащее под ним окно? »
Окно, да. На самом деле очень просто, сам бы не поверил. За это отвечает доп-стиль: $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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.