Ах, эти спойлеры, ненавижу, их не видно . Прошу прощения, если не ошибаюсь когда то мы пользовались этим , точнее уделили несколько часов тому чтобы потратить время на настройку этой UDF, но в итоге пришли к выводу что лучше использовать простые маузклики, поскольку для евы остальное - смертиподобно.r35p3ct сказал(а):Да вон она в спойлере...
Opt("MouseCoordMode", 0)
;===============================================================================
;
; Function Name: _MouseClickPlus()
; Version added: 0.1
; Description: Sends a click to window, not entirely accurate, but works
; minimized.
; Parameter(s): $WinTi = Title of the window to send click to
; $Button = "left" or "right" mouse button
; $X = X coordinate
; $Y = Y coordinate
; $Clicks = Number of clicks to send
; Remarks: You MUST be in "MouseCoordMode" 0 to use this without bugs.
; Author(s): Insolence <[email protected]>
;
;===============================================================================
$WinTi = "EVE"
_MouseOp($WinTi, "Click", "Left", 2, 773, 206-22)
Func _MouseOp($WinTi,$CType,$Button,$Clicks, $X1, $Y1 ,$X2=0 , $Y2=0)
Local $LB = 0x0001 ;LeftButton
Local $RB = 0x0002 ;RightButton
Local $LBDown = 0x0201 ;LB Down
Local $RBDown = 0x0204 ;RB Down
Local $LBUp = 0x0202 ;LB Up
Local $RBUp = 0x0205 ;RB Up
Local $MM = 0x0200 ;MouseMove
Local $i = 0
Select
Case $Button = "Left"
$Button = $LB
$ButtonDown = $LBDown
$ButtonUp = $LBUp
Case $Button = "Right"
$Button = $RB
$ButtonDown = $RBDown
$ButtonUp = $RBUp
EndSelect
Select
Case $CType = "Click"
For $i = 1 to $Clicks
DllCall("user32.dll","int","SendMessage","hwnd",WinGetHandle($WinTi),"int",$MM,"int",0,"long",_MakeLong($X1, $Y1))
Sleep(100)
DllCall("user32.dll","int","SendMessage","hwnd",WinGetHandle($WinTi ),"int",$ButtonDown,"int",$Button,"long",_MakeLong($X1, $Y1))
DllCall("user32.dll", "int", "SendMessage","hwnd",WinGetHandle( $WinTi ),"int",$ButtonUp,"int",$Button,"long",_MakeLong($X1, $Y1))
Next
Case $CType = "Drag"
DllCall("user32.dll","int","SendMessage","hwnd",WinGetHandle($WinTi),"int",$MM,"int",0,"long",_MakeLong($X1, $Y1))
DllCall("user32.dll","int","SendMessage","hwnd",WinGetHandle($WinTi ),"int",$ButtonDown,"int",$Button,"long",_MakeLong($X1, $Y1))
DllCall("user32.dll","int","SendMessage","hwnd",WinGetHandle($WinTi ),"int",$MM,"int",0,"long",_MakeLong($X2, $Y2))
DllCall("user32.dll", "int", "SendMessage","hwnd",WinGetHandle( $WinTi ),"int",$ButtonUp,"int",$Button,"long",_MakeLong($X2, $Y2))
EndSelect
EndFunc
Func _MakeLong($LoWord,$HiWord)
Return BitOR($HiWord*0x10000,BitAND($LoWord,0xFFFF))
EndFunc
;~ _MouseClickPlus($WinTi, "left", 773-3, 208-22, 1)
Func _MouseClickPlus($WinTi, $Button = "left", $X = "", $Y = "", $Clicks = 1)
Local $LB = 0x0001
Local $LBDown = 0x0201
Local $LBUp = 0x0202
Local $RB = 0x0002
Local $RBDown = 0x0204
Local $RBUp = 0x0205
Local $MM = 0x0200
Local $i = 0
Select
Case $Button = "left"
$Button = $LB
$ButtonDown = $LBDown
$ButtonUp = $LBUp
Case $Button = "right"
$Button = $RB
$ButtonDown = $RBDown
$ButtonUp = $RBUp
EndSelect
If $X = "" OR $Y = "" Then
$MouseCoord = MouseGetPos()
$X = $MouseCoord[0]
$Y = $MouseCoord[1]
EndIf
For $i = 1 to $Clicks
DllCall("user32.dll", "int", "SendMessage", _
"hwnd", WinGetHandle( $WinTi ), _
"int", $MM, _
"int", 0, _
"long", _MakeLong($X, $Y))
DllCall("user32.dll", "int", "SendMessage", _
"hwnd", WinGetHandle( $WinTi ), _
"int", $ButtonDown, _
"int", $Button, _
"long", _MakeLong($X, $Y))
DllCall("user32.dll", "int", "SendMessage", _
"hwnd", WinGetHandle( $WinTi ), _
"int", $ButtonUp, _
"int", $Button, _
"long", _MakeLong($X, $Y))
Next
EndFunc
;~ 22, 177-22 ; click
;~ 265-22, 548-3 ; drag
Поверь, двигает мышку и кликает эта UDF на ура и достаточно быстро, ее разве что надо доработать. Да и тем более мы же не для экшенов пишем ботов, а если учесть что бот должен работать в свернутом окне, дак там вобще не очень часто кликать нужно я думаю .Yashied сказал(а):AutoIt - это вам не C/C++. Здесь DllCall() будет работать как черепаха в сравнении с родными функциями AutoIt (по процессорным меркам). А у тебя там целых три DllCall(), т.е. как три черепахи.
Да вот как раз пытаюсь разобраться какие из них можно заюзать, прошу ткнуть пальцем, ибо известным мне командам нужен хендл контролла, а тут его нельзя никак получить(может я конечно не до конца разобрался...)Yashied сказал(а):Разве родных AutoIt функций не достаточно для этого?
Узко специализированная прога по работе) Написаная на делфи, поэтому и такие сложности с контроллами. Кнопка находится на TToolbar97, надписи на ней нет, поэтому не могу вытащить ее хендл...Belfigor сказал(а):Для какой игры кстати?
#Include <GUIToolbar.au3>
Global Const $sTitle = 'Super specific program that works with the server only'
Global Const $iButtonIndex = 0
$hWnd = ControlGetHandle(WinGetHandle($sTitle), '', '[CLASS:TToolbar97;INSTANCE:1]')
_GUICtrlToolbar_ClickIndex($hWnd, $iButtonIndex)
Это совет из раздела шоманства, собственно повторное перечитывание этой темы: http://www.autoitscript.com/forum/index.php?showtopic=7112&hl=EVE%20Online&st=0 показало что у половины пользователей эта UDF работает а у половины нет, даже в Паинте ее запустить смог всего один человек, и его пример не сработал у другихYashied сказал(а):UPD: Opt("MouseCoordMode", 0) здесь вообще не пришей к :Censored: рукав. Window Messages его в принципе никак не могут использовать.
Belfigor сказал(а):...даже в Паинте ее запустить смог всего один человек, и его пример не сработал у других...
#Include <WinAPI.au3>
Global Const $WM_LBUTTONDOWN = 0x0201
GUICreate('MyGUI', 400, 400)
GUIRegisterMsg($WM_LBUTTONDOWN, 'WM_LBUTTONDOWN')
GUISetState()
Do
Until GUIGetMsg() = -3
Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
Local $hDC = _WinAPI_GetDC($hWnd)
For $i = -3 To 3
For $j = -3 To 3
DllCall('gdi32.dll', 'int', 'SetPixelV', 'hwnd', $hDC, 'int', _WinAPI_LoWord($lParam) + $i, 'int', _WinAPI_HiWord($lParam) + $j, 'dword', 0x0000FF)
Next
Next
_WinAPI_ReleaseDC($hWnd, $hDC)
Return 0
EndFunc ;==>WM_LBUTTONDOWN
Belfigor сказал(а):Попробуй использовать опцию Opt("MouseCoordMode", 0) , в EVE по другому она тыкает не туда куда надо, да и туда куда надо она тыкает с погрешностью в 5-10 пикселей.
Yashied сказал(а):Попробуй так, потом отпишись, что получается.
Код:#Include <GUIToolbar.au3> Global Const $sTitle = 'Super specific program that works with the server only' Global Const $iButtonIndex = 0 $hWnd = ControlGetHandle(WinGetHandle($sTitle), '', '[CLASS:TToolbar97;INSTANCE:1]') _GUICtrlToolbar_ClickIndex($hWnd, $iButtonIndex)
Yashied сказал(а):Попробуй ради интереса функцию Belfigor'а, только вместо
WinGetHandle($sTitle)
напиши
ControlGetHandle(WinGetHandle($sTitle), '', '[CLASS:TToolbar97;INSTANCE:1]')
Возможно кликнет куда надо.
$hWnd1 = ControlGetHandle(WinGetHandle('Title'), '', '[CLASSNN:TButton3]')
WinSetState($hWnd1, '', @SW_DISABLE)
ControlClick($hWnd1, '', '[CLASSNN:TButton3]')
WinSetState($hWnd1, '', @SW_ENABLE)