Что нового

Как нарисовать рамку вокгуг одного "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,322
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
 
Верх