Что нового

[Мышь, клавиатура] Клик в окне по координатам неизвестной кнопки

fanlik

Новичок
Сообщения
7
Репутация
0
Есть координаты кнопки, относительно края окна.
Нужен клик по кнопке без использования мыши.

Быть может кто подскажет, возможно ли внутри скрипта узнать класс кнопки по её координатам.
Либо как-то заставить ControlClick кликать подобным образом?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
fanlik

Можно ссылаться на координаты и размер элемента

http://autoit-script.ru/autoit3_docs/intro/controls.htm

Как-то так:
Код:
$sTitle = 'Мое окно'
$iX = 116
$iY = 89
ControlClick($sTitle, '', '[X:' & $iX & '; Y:' & $iY & ']')
 
Автор
F

fanlik

Новичок
Сообщения
7
Репутация
0
[Мышь, клавиатура] Re: [Мышь, клавиатура] Клик в окне по координатам неизвестной кнопки

WSWR
Код:
ControlClick ( $Titles, "","[X:131; Y:103]")
MouseClick("left","131", "103",1,1)

Пробую, даже без переменных. MouseClick работает а ControlClick возвращает 0
Заголовок окна с самого окна беру.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
fanlik [?]
узнать класс кнопки по её координатам
Какую информацию по данной кнопке выдаёт AutoIt Window Info? Возможно эта "кнопка" нарисована и у неё нет класса...
 
Автор
F

fanlik

Новичок
Сообщения
7
Репутация
0
InnI
Все там есть - [CLASS:Button; INSTANCE:1]
Но проблема в том что кнопка, её положение и само окно изменяется.
И известны лишь координаты для клика.

Быть может есть способ узнать по этим координатам узнать класс кнопки?
Либо может в самом формате ошибка?!?!
Код:
ControlClick ( $Titles, "","[X:131; Y:103]")

Или координаты не от угла окна измеряются в ControlClick?!?
Код:
ControlClick ( '[ACTIVE]', "","[X:131; Y:103]")

Даже так не хочет.
 
Автор
F

fanlik

Новичок
Сообщения
7
Репутация
0
InnI
Не все так просто)
Стал бы я заморачиватся с координатам ;D
Там очень много кнопок, очень)
Код:
ControlClick ($Titles, "", "Button1")

Да эта команда работает, но нереально каждую кнопку вручную смотреть.

Может по координатам кто нибудь знает как получить тогда ClassnameNN внутри самого кода?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
fanlik
Вот пример получения текста элемента под курсором.
Тут функция, которая получает хэндл элемента по его координатам

Код:
#include <WinAPI.au3>

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

While 1
    ToolTip(_WinAPI_GetWindowText(GetHoveredHwnd(MouseGetPos(0), MouseGetPos(1))))
Sleep(100)
WEnd

Func GetHoveredHwnd($i_xpos, $i_ypos)
    Local $iRet = DllCall("user32.dll", "int", "WindowFromPoint", "long", $i_xpos, "long", $i_ypos)
    If IsArray($iRet) Then
        Return HWnd($iRet[0])
    Else
        Return SetError(1, 0, 0)
    EndIf
EndFunc

Func _Exit()
    Exit
EndFunc


Можно и все кнопки перебрать
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
fanlik [?]
как получить тогда ClassnameNN
Координаты - экранные
Код:
#include <WinAPIEx.au3>

Run("calc.exe")
$wnd = WinWaitActive("[class:CalcFrame]")
MsgBox(0, "", GetClassNameNN($wnd, 797, 458))

Func GetClassNameNN($ParentWnd, $X, $Y)
  Local $Control, $Class, $Wins, $Inst = 0
  If Not IsHWnd($ParentWnd) Then Return ""
  Local $Point = DllStructCreate($tagPoint)
  DllStructSetData($Point, "x", $X)
  DllStructSetData($Point, "y", $Y)
  $Control = _WinAPI_WindowFromPoint($Point)
  If Not $Control Then Return ""
  $Class = _WinAPI_GetClassName($Control)
  If @error Then Return ""
  $Wins = _WinAPI_EnumChildWindows($ParentWnd, True)
  If IsArray($Wins) Then
    For $i = 1 To $Wins[0][0]
      If $Wins[$i][1] = $Class Then $Inst += 1
      If $Wins[$i][0] = $Control Then Return $Class & $Inst
    Next
  EndIf
  Return ""
EndFunc
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Мой вариант, может кому пригодится:

Код:
#include <WinAPIEx.au3>

$sTitle = 'Окно'

$aData = _WinAPI_EnumChildWindows(WinGetHandle($sTitle, ''), 0)

$iX = 436
$iY = 65

For $i = 1 To $aData[0][0]

	If $aData[$i][1] = 'Button' Then
		$aPos = ControlGetPos($sTitle, '', $aData[$i][0])
		If $iX >= $aPos[0] And $iX <= $aPos[0] + $aPos[2] And $iY >= $aPos[1] And $iY <= $aPos[1] + $aPos[3] Then
			ConsoleWrite(ControlGetText($sTitle, '', $aData[$i][0]) & ' ' & $aData[$i][0] & @LF)
			ControlClick($sTitle, '', $aData[$i][0])
		EndIf
	EndIf

Next
 
Автор
F

fanlik

Новичок
Сообщения
7
Репутация
0
Спасибо) Даже помогли в решении будущей задачи :smile:
Большое Спасибо WSWR и InnI :smile:
 

seed6

Новичок
Сообщения
14
Репутация
0
Мой вариант, может кому пригодится:

Код:
#include <WinAPIEx.au3>

$sTitle = 'Окно'

$aData = _WinAPI_EnumChildWindows(WinGetHandle($sTitle, ''), 0)

$iX = 436
$iY = 65

For $i = 1 To $aData[0][0]

    If $aData[$i][1] = 'Button' Then
        $aPos = ControlGetPos($sTitle, '', $aData[$i][0])
        If $iX >= $aPos[0] And $iX <= $aPos[0] + $aPos[2] And $iY >= $aPos[1] And $iY <= $aPos[1] + $aPos[3] Then
            ConsoleWrite(ControlGetText($sTitle, '', $aData[$i][0]) & ' ' & $aData[$i][0] & @LF)
            ControlClick($sTitle, '', $aData[$i][0])
        EndIf
    EndIf

Next


А в какие строчки надо подставить свои значения?????
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
If $iX >= $aPos[0] And $iX <= $aPos[0] + $aPos[2] And $iY >= $aPos[1] And $iY <= $aPos[1] + $aPos[3] Then
А зачем эта строка? И вот эти координаты: $iX и $iY?
У меня без них работает в свернутом, неактивном положении, а сними нет. И на мой взгляд это логично.
 
Верх