Что нового

Как нарисовать рамку вокгуг одного "Control"ера зная его Handle?!

Bad-Boy

Новичок
Сообщения
2
Репутация
0
Добрый день,

пишу одного бота для одной браузерной игры.
Принцип такой: мышка наводиться на окно игры и при помоши горячих клавишь "Strg+A" захватываеться Handle игры. Через Handle уже определяеться размеры окна игры.
Код:
Func _StartPunkt()
	$Game[4] = MouseGetPos(0)
	$Game[5] = MouseGetPos(1)
	$Game[6] = Hex(PixelGetColor($Game[4], $Game[5]), 6)
	DllStructSetData($Struct, "x", MouseGetPos(0))
	DllStructSetData($Struct, "y", MouseGetPos(1))
	GUICtrlSetData($StPktLabX, $Game[4])
	GUICtrlSetData($StPktLabY, $Game[5])
	GUICtrlSetData($StPktLabC, $Game[6])
	$Game[0] = _WinAPI_WindowFromPoint($Struct)
	$size = WinGetPos($Game[0])
	$Game[2] = $size[0]
	$Game[3] = $size[1]
	If $size[2] = 760 And $size[3] = 630 Then
		GUICtrlSetData($GameStatus, "Игра найдена ;-)")
		GameStatusSetColor (0x00ff00)
		$Game[1] = 1
	Else
		GUICtrlSetData($GameStatus, "Игра не найдена!")
		GameStatusSetColor (0xff0000)
		If GUICtrlGetState($F9Button) = $GUI_DISABLE Then
			GUICtrlSetState($F9Button, $GUI_DISABLE)
		EndIf
		$Game[1] = 0
	EndIf
EndFunc   ;==>_StartPunkt


Со временем возникают проблемы с "нахождением" игры так как размеры окна разработчиками меняються. Вот я и решил процедуру захвата Handle игры маленько переделать.
Переделка заключаеться в том, чтоб игра опозновалась не по размерам окна игры, а при помощи моргаюшей рамки вокруг окна пользователем бота.
Вот теперь какой день голову ломаю как эту пределку осушествить!!!
Буду рад каждой подсказке!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Bad-Boy,
Попробуйте так:
Код:
#include <WinAPIEx.au3>
#include <Misc.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

Opt('TrayMenuMode', 1)
Opt('MustDeclareVars', 1)

Global $tStruct, $hHandle, $hWin, $tWINDOWINFO, $hGUI, $nLeft, $nTop, $nRight, $nBottom, $aPosOld[4], $fShou

HotKeySet('{ESC}', '_Exit')

$tStruct = DllStructCreate($tagPoint)
$hGUI = GUICreate('Test', @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
GUISetBkColor(0xFFFFFF)
$nLeft = GUICtrlCreateLabel('', 0, 0)
$nTop = GUICtrlCreateLabel('', 0, 0)
$nRight = GUICtrlCreateLabel('', 0, 0)
$nBottom = GUICtrlCreateLabel('', 0, 0)
For $i = $nLeft To $nBottom
	GUICtrlSetBkColor($i, 0xFF0000)
	GUICtrlSetState($i, $GUI_HIDE)
Next
GUISetState()
_WinAPI_SetLayeredWindowAttributes($hGUI, 0xFFFFFF, 0, $LWA_COLORKEY)
_WinAPI_EmptyWorkingSet()

While 1
	If _IsPressed('01') Then ;левая кнопка мыши
		While _IsPressed('01')
			Sleep(10)
		WEnd
		_Get_Pos()
		$hHandle = _WinAPI_WindowFromPoint($tStruct)
		$hWin = _WinAPI_GetAncestor($hHandle, $GA_ROOT)
		$tWINDOWINFO = _WinAPI_GetWindowInfo($hWin)
		_DrawWindow()
	EndIf
	Sleep(50)
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func _Get_Pos()
	DllStructSetData($tStruct, 'x', MouseGetPos(0))
	DllStructSetData($tStruct, 'y', MouseGetPos(1))
EndFunc   ;==>_Get_Pos

Func _DrawWindow()
	Local $X, $Y, $W, $H
	AdlibUnRegister('_Blink')
	$X = DllStructGetData($tWINDOWINFO, 'rWindow', 1)
	$Y = DllStructGetData($tWINDOWINFO, 'rWindow', 2)
	$W = DllStructGetData($tWINDOWINFO, 'rWindow', 3) - $X
	$H = DllStructGetData($tWINDOWINFO, 'rWindow', 4) - $Y
	For $i = $nLeft To $nBottom
		GUICtrlSetState($i, $GUI_HIDE)
	Next
	GUICtrlSetPos($nLeft, $X, $Y, 3, $H)
	GUICtrlSetPos($nTop, $X, $Y, $W, 3)
	GUICtrlSetPos($nRight, $X + $W, $Y, 3, $H)
	GUICtrlSetPos($nBottom, $X, $Y + $H, $W + 3, 3)
	For $i = $nLeft To $nBottom
		GUICtrlSetState($i, $GUI_SHOW)
	Next
	WinSetOnTop($hGUI, '', 1)
	AdlibRegister('_Blink', 300)
EndFunc   ;==>_DrawWindow

Func _Blink()
	Local $s_State = $GUI_HIDE
	$fShou = Not $fShou
	If $fShou Then $s_State = $GUI_SHOW
	For $i = $nLeft To $nBottom
		GUICtrlSetState($i, $s_State)
	Next
EndFunc   ;==>_Blink
 
Автор
B

Bad-Boy

Новичок
Сообщения
2
Репутация
0
Добрый день,

@madmasles спасибо за код - работает на ура правдо с маленькими пределками (в Вашем коде - моргало рамка вокруг окошка браузера а не самой игры ;))

Ну и вот сам переделаный код если кому надо и если madmasles не возражает. ;D

Код:
Func _GameWindow()
	Local $hHandle, $tWINDOWINFO, $hGUI, $nLeft, $nTop, $nRight, $nBottom
	$hGUI = GUICreate("Рамка", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
	GUISetBkColor(0xFFFFFF)
	$nLeft = GUICtrlCreateLabel('', 0, 0)
	$nTop = GUICtrlCreateLabel('', 0, 0)
	$nRight = GUICtrlCreateLabel('', 0, 0)
	$nBottom = GUICtrlCreateLabel('', 0, 0)

	For $i = $nLeft To $nBottom
		GUICtrlSetBkColor($i, 0xFF0000)
		GUICtrlSetState($i, $GUI_HIDE)
	Next

	GUISetState()
	_WinAPI_SetLayeredWindowAttributes($hGUI, 0xFFFFFF, 0, $LWA_COLORKEY)
	_WinAPI_EmptyWorkingSet()

	DllStructSetData($Struct, "x", MouseGetPos(0))
    DllStructSetData($Struct, "y", MouseGetPos(1))
	$hHandle = _WinAPI_WindowFromPoint($Struct)
	$tWINDOWINFO = WinGetPos ($hHandle)

	Local $X, $Y, $W, $H, $R = 5

	$X = $tWINDOWINFO[0]
    $Y = $tWINDOWINFO[1]
    $W = $tWINDOWINFO[2]
    $H = $tWINDOWINFO[3]

	For $i = $nLeft To $nBottom
        GUICtrlSetState($i, $GUI_HIDE)
    Next

	GUICtrlSetPos($nLeft, $X, $Y, $R, $H)
    GUICtrlSetPos($nTop, $X, $Y, $W, $R)
    GUICtrlSetPos($nRight, $X + $W-$R, $Y, $R, $H)
    GUICtrlSetPos($nBottom, $X, $Y + $H-$R, $W, $R)

    For $i = $nLeft To $nBottom
        GUICtrlSetState($i, $GUI_SHOW)
    Next
    WinSetOnTop($hGUI, '', 1)

	GUICtrlSetData($GameStatus, "Захват окна игры...")
	GameStatusSetColor (0x0000ff)

	For $blink=1 to 5
		For $i = $nLeft To $nBottom
			GUICtrlSetState($i, $GUI_SHOW)
		Next
		Sleep (300)

		For $i = $nLeft To $nBottom
			GUICtrlSetState($i, $GUI_HIDE)
		Next
		Sleep (300)
	Next
	GUIDelete($hGUI)
EndFunc
 
Верх