Что нового

Перемещение контрола чужого окна мышкой

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Почему не получается, где ошибка или что не дописал, задача вроде не сложная?!

Код:
#Include <WinAPI.au3>
#Include <Misc.au3>

While 1
	$tPoint = _WinAPI_GetMousePos()
    $hWnd = _WinAPI_WindowFromPoint($tPoint)
	If _IsPressed("11") Then MoveControl($hWnd)
Wend	

Func MoveControl($hWnd)
	$hPos = MouseGetPos()
	ControlMove($hWnd, "", _WinAPI_GetClassName($hWnd) , $hPos[0], $hPos[1], 200, 200)
	ConsoleWrite(_WinAPI_GetClassName($hWnd) & @CRLF)
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703,
Посмотрите в справке третий параметр у функции ControlMove().
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Там пишется контрол который нам нужен
Когда я навожу мышь на контрол в чужом окне, то прописывается его класс у меня в консоле, сейчас попробывал $hWnd прописать вручную и заработала, значит я не получаю $hWnd или можно просто определить по окну которое в данный момент активно?!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703 [?]
Там пишется контрол который нам нужен
На калькуляторе (у меня) 27 элементов с классом Button. Как Ваш скрипт должен узнать к какой из этих кнопок обращаться?
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Хорошо, как тогда решить подобную задачу?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703 [?]
как тогда решить подобную задачу?
Попробуйте так:
Код:
#include <Array.au3>
#include <WinAPIEx.au3>

$sClass = 'Button'
$j = 0

Run(@SystemDir & '\calc.exe')
$hWin = WinWait('[Class:SciCalc]', '', 3)
If Not $hWin Then Exit
$aData = _WinAPI_EnumChildWindows($hWin, 0)
If @error Then Exit
Dim $aResult[$aData[0][0] + 1][6]
For $i = 1 To $aData[0][0]
	If $aData[$i][1] == $sClass Then
		$j += 1
		$aResult[$j][0] = '[CLASS:' & $aData[$i][1] & '; INSTANCE:' & $j & ']'
		$aResult[$j][1] = $aData[$i][0]
		$aResult[$j][2] = _WinAPI_GetDlgCtrlID($aData[$i][0])
		$aTemp = ControlGetPos($hWin, '', $aData[$i][0])
		If Not @error Then
			For $q = 0 To 1
				$aResult[$j][$q + 3] = $aTemp[$q]
			Next
		EndIf
		$aResult[$j][5] = ControlGetText($hWin, '', $aResult[$j][1])
	EndIf
Next
ReDim $aResult[$j + 1][6]
$aResult[0][0] = 'Class name + INSTANCE'
$aResult[0][1] = 'Handle'
$aResult[0][2] = 'ID'
$aResult[0][3] = 'X'
$aResult[0][4] = 'Y'
$aResult[0][5] = 'Text'
_ArrayDisplay($aResult, $sClass)
;3-ий параметр функции ControlMove():
If WinExists($hWin) Then
	For $i = 1 To $j
		ControlMove($hWin, '', $aResult[$i][1], $aResult[$j - ($i - 1)][3], $aResult[$j - ($i - 1)][4]);Handle
	Next
	_WinAPI_RedrawWindow($hWin)
	MsgBox(64, 'Info', 'Используем Handle')
EndIf
If WinExists($hWin) Then
	For $i = 1 To $j
		ControlMove($hWin, '', $aResult[$i][2], $aResult[$i][3], $aResult[$i][4]);ID
	Next
	_WinAPI_RedrawWindow($hWin)
	MsgBox(64, 'Info', 'Используем ID')
EndIf
If WinExists($hWin) Then
	For $i = 1 To $j
		ControlMove($hWin, '', $aResult[$i][0], $aResult[$j - ($i - 1)][3], $aResult[$j - ($i - 1)][4]);[CLASS:Button; INSTANCE:n]
	Next
	_WinAPI_RedrawWindow($hWin)
	MsgBox(64, 'Info', 'Используем [CLASS:Button; INSTANCE:n]')
EndIf
If WinExists($hWin) Then
	$iR = Random(0, 2, 1)
	For $i = 1 To $j
		ControlMove($hWin, '', $aResult[$i][$iR], $aResult[$i][3], $aResult[$i][4]);???
	Next
	_WinAPI_RedrawWindow($hWin)
	MsgBox(64, 'Info', 'Вернули все на место :)')
EndIf
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Что если по координатам?
Т.е. координатам, относительно родительского окна.
Хотя, что говорить. Смысл в чем? Если клик по кнопке, например, - имеет смысл.
Если чтение - нет.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Пример хороший но, мне нужно перетаскивать элементы окна мышкой при всё этом, окно может быть любым, то есть скрипт должен ещё и хэндл окна определить
 

madmasles

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

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

While 1
	If _IsPressed('04') Then;средняя кнопка мыши
		_Move_Control('Button')
	EndIf
	Sleep(50)
WEnd

Func _Move_Control($s_ClassName = -1)
	Local $t_Point, $h_Handle, $h_Win, $a_PosControl, $i_Xm, $i_Ym, $i_X, $i_Y, _
			$i_Xm_Old, $i_Ym_Old, $f_ClassName

	If $s_ClassName <> -1 Then $f_ClassName = True
	$t_Point = _WinAPI_GetMousePos()
	$h_Handle = _WinAPI_WindowFromPoint($t_Point)
	If $f_ClassName Then
		If _WinAPI_GetClassName($h_Handle) <> $s_ClassName Then Return
	EndIf
	$h_Win = _WinAPI_GetAncestor($h_Handle, $GA_ROOT)
	If Not $f_ClassName Then
		If $h_Handle = $h_Win Then Return
	EndIf
	$i_Xm = _WinAPI_GetMousePosX(True, $h_Win)
	$i_Ym = _WinAPI_GetMousePosY(True, $h_Win)
	$a_PosControl = ControlGetPos($h_Win, '', $h_Handle)
	$i_X = $i_Xm - $a_PosControl[0]
	$i_Y = $i_Ym - $a_PosControl[1]
	While _IsPressed('04');средняя кнопка мыши
		$i_Xm = _WinAPI_GetMousePosX(True, $h_Win)
		$i_Ym = _WinAPI_GetMousePosY(True, $h_Win)
		If $i_Xm_Old <> $i_Xm Or $i_Ym_Old <> $i_Ym Then
			$i_Xm_Old = $i_Xm
			$i_Ym_Old = $i_Ym
			ControlMove($h_Win, '', $h_Handle, $i_Xm_Old - $i_X, $i_Ym_Old - $i_Y)
		EndIf
		Sleep(10)
	WEnd
EndFunc   ;==>_Move_Control

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Viktor1703
Вот:
Код:
#include <Misc.au3>

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

While 1
	If _IsPressed(11) and _IsPressed(1) Then	;CTRL и левый клик мыши
		$cp = mousegetpos()
		$wp = ControlGetPos('[ACTIVE]', '', _CtrlGetClassNN_ByPos())
		while _IsPressed(11) and _IsPressed(1)	;пока зажаты CTRL и левый клик мыши
			$dp = mousegetpos()
			controlmove('[ACTIVE]',"", _CtrlGetClassNN_ByPos(),$wp[0] + $dp[0] - $cp[0],$wp[1] + $dp[1] - $cp[1])
		WEnd
	EndIf
WEnd

;Функция для получение контрола под курсором
Func _CtrlGetClassNN_ByPos()
    Local $hWin = WinGetHandle(''), $sCreateArray = '', $sClassList = WinGetClassList($hWin)
    Local $sSplitClass = StringSplit(StringTrimRight($sClassList, 1), @LF), $sReturn = ''

    $OptMCM = Opt('MouseCoordMode', 2)
    Local $aMPos = MouseGetPos()
    Opt('MouseCoordMode', $OptMCM)

    For $iCount = UBound($sSplitClass) - 1 To 1 Step - 1
        Local $nCount = 0
        While 1
            $nCount += 1
            Local $aCPos = ControlGetPos($hWin, '', $sSplitClass[$iCount] & $nCount)
            If @error Then ExitLoop
            If $aMPos[0] >= $aCPos[0] And $aMPos[0] <= ($aCPos[0] + $aCPos[2]) _
                And $aMPos[1] >= $aCPos[1] And $aMPos[1] <= ($aCPos[1] + $aCPos[3]) Then
                If $sSplitClass[$iCount] <> '' Then Return $sSplitClass[$iCount] & $nCount
            EndIf
        WEnd
    Next
    Return $sReturn
EndFunc

Func _ExitNow()
    Exit 0
EndFunc
 
Верх