Что нового

[Окна, Диалоги] Как нажать кнопку не имеющую ID

lvlaksim

Новичок
Сообщения
7
Репутация
0
Есть программка ammyy_admin.
http://ifolder.ru/18869139

в ней, при открытии, нужно нажать кнопку "Ammyy" в верхнем меню, там выбрать "Контактная книга", в открывшемся окне нажать "добавить", вписать ID и имя (любые), ОК,

Буду благодарен даже за частичное решение.

застрял на первой стадии - не могу нажать кнопку в верхнем меню. В самой программе всё ок - нажимается, а в меню - никак.

делал так

Код:
Run("ammyy_admin.exe") 
WinWaitActive("Ammyy Admin v2.13")
ControlFocus("Ammyy Admin v2.13", "Ammyy", "Ammyy")

ControlClick ( "Ammyy Admin v2.13", "Ammyy", "[TEXT:Ammyy]" )
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Потому что, это не кнопка, а меню!

Код:
_WinAPI_PostMessage(WinGetHandle('Ammyy Admin v2.13'), $WM_COMMAND, -32643, 0)



Добавлено:
Сообщение автоматически объединено:

Ну так и что? Тема решена или нет?
 
Автор
L

lvlaksim

Новичок
Сообщения
7
Репутация
0
да вот думаю что ответить чтобы совсем уж идиотом не выглядеть ))

1) как я понял, чтобы работала _WinAPI_PostMessage, в начало скрипта нужно добавить #Include <WinAPI.au3> и скопировать этот файл в папку с скриптом? (это я сделал)
2) попытался разобраться что означает представленная Вами строка

_WinAPI_PostMessage - помещает сообщение в очередь и возвращает его потом....не совсем понял что это значит )

WinGetHandle('Ammyy Admin v2.13') - получаем хэндл основного окна программы...как я понял хэндл это вообще основной параметр окна. в данном случае он будет идентификатором рабочего окна?

$WM_COMMAND - это по идее должно быть тем самым "сообщением в очереди", но на деле как я понял это указатель на работу с верхним меню?

-32643, 0 - загадочные параметры сообщения...совсем не понял откуда они...


В ИТОГЕ:

при запуске этого:

Код:
#Include <WinAPI.au3>

;ПЕРВЫЙ ЗАПУСК И НАСТРОЙКА
Run("ammyy_admin.exe") 
WinWaitActive("Ammyy Admin v2.13")


_WinAPI_PostMessage(WinGetHandle('Ammyy Admin v2.13'), $WM_COMMAND, -32643, 0)


выдаёт ошибку


жду разжевывания, если не трудно )
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
lvlaksim
Попробуйте так:
Код:
#include <WindowsConstants.au3>
#Include <WinAPI.au3>

Opt("WinTextMatchMode", 2)

$sTitle = 'Ammyy'
$sID = 1234567
$sName = 'Вася Пупкин'

Run(@ScriptDir & '\ammyy_admin.exe')
WinWait($sTitle)
If Not WinActive($sTitle) Then WinActivate($sTitle)
WinWaitActive($sTitle)
$hWnd = WinGetHandle($sTitle)
_WinAPI_PostMessage($hWnd, $WM_COMMAND, 32893, 0)
Sleep(500)
WinWait($sTitle, 'Добавить')
If Not WinActive($sTitle, 'Добавить') Then WinActivate($sTitle, 'Добавить')
ControlClick($sTitle, 'Добавить', '[CLASS:Button; INSTANCE:1]')
Sleep(500)
WinWait($sTitle, 'Name')
If Not WinActive($sTitle, 'Name') Then WinActivate($sTitle, 'Name')
ControlSetText($sTitle, 'Name', '[CLASS:Edit; INSTANCE:1]', $sID)
ControlSetText($sTitle, 'Name', '[CLASS:Edit; INSTANCE:2]', $sName)
ControlClick($sTitle, 'Name', '[CLASS:Button; INSTANCE:1]')

В Вашем варианте не хватает #include <WindowsConstants.au3>.
Файлы #include <Файл.au3> в папку со скриптом добавлять не надо, если они есть в папке C:\Program Files\AutoIt3\Include.
Число 32893 я получил с помощью ResHacker.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Код:
#Include <WinAPI.au3>
#Include <WindowsConstants.au3>

;ПЕРВЫЙ ЗАПУСК И НАСТРОЙКА
Run("ammyy_admin.exe")
WinWaitActive("Ammyy Admin v2.13")

_WinAPI_PostMessage(WinGetHandle('Ammyy Admin v2.13'), $WM_COMMAND, -32643, 0)


WinAPI.au3, как и WindowsConstants.au3 никуда копировать не нужно, они находятся в установочной директории AutoIt и являются его составной частью, так сказать.

lvlaksim сказал(а):
_WinAPI_PostMessage() - помещает сообщение в очередь и возвращает его потом....
Сразу видно, что читали описание в справке. _WinAPI_PostMessage() посылает окну с хендлом $hWnd (WinGetHandle()) сообщение с кодом 0x0111 ($WM_COMMAND) и передает еще два параметра: $wParam и $lParam. В данном случае первый параметр, это ID того самого пункта меню (-32643), который можно узнать, открыв программу в любом редакторе ресурсов. Второй параметр не используется и равен 0. Другими словами

Код:
_WinAPI_PostMessage(WinGetHandle('Ammyy Admin v2.13'), $WM_COMMAND, -32643, 0)


означает, что нужно послать сообщение WM_COMMAND окну с заголовком "Ammyy Admin v2.13" для "активации" пункта меню с ID = -32643.

_WinAPI_PostMessage(), этот тоже самое, что и _SendMessage(), но только не ждет ответа от окна.
 
Автор
L

lvlaksim

Новичок
Сообщения
7
Репутация
0
ну круто! спасибо всем за оперативность и терпение :smile:

ID меню я кстати пытался узнать с помощью штатной Автоит виндов инфо, но она ничего не показала, видимо не совершенна программка. скачаю ResHacker
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Yashied
OffTopic:
Интересно, Restorator выдает -32643, ResHacker выдает 32893. У меня работает с обеими числами.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
madmasles сказал(а):
Интересно, Restorator выдает -32643, ResHacker выдает 32893. У меня работает с обеими числами.
Это тоже самое.

Код:
ConsoleWrite(Dec(Hex(-32643, 4)) & @CR)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Yashied
Понял, спасибо. :smile:
 

CaHbka

Новичок
Сообщения
20
Репутация
0
Не люблю создавать новые темы, поэтому спрошу здесь. Да и тема подходящая))
Собственно захотел сделать что то вроде автологина к mmorpg Perfect World, т.к. надоело каждый раз нажимать enter, и вписывать логин и пароль.
Проблема возникла в самом начале, где нужно после загрузки и просмотра новости нажать кнопку "Подтвердить", но стандартная утилита не определяет ID этой кнопочки, а определяет ID всего окна((
На данный момент решение такое:
Код:
Sleep ( 12000 )
Send ("{ENTER}")

Пробовал
Код:
ControlClick

Ничего хорошего не получилось.
Каждый раз время загрузки разное, пусть не намного. Иногда окно с игрой не отвечает и проходит больше 12 сек, следовательно скрипт дальше не работает.
Собственно саму кнопку видно на скриншоте
Как можно начать кнопку "Подтвердить" когда загрузка прошла и появилось окно "Новости"?
 

CaHbka

Новичок
Сообщения
20
Репутация
0
Помогите пожалуйста с решением :smile:
 

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Ты обязан соблюдать правилу, установленные на форуме, следовательно новый вопрос - новая тема...
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
lvlaksim, не забывайте отмечать "тема решена", когда тема решена.
 

beaver

Новичок
Сообщения
58
Репутация
2
Сразу видно, что читали описание в справке. _WinAPI_PostMessage() посылает окну с хендлом $hWnd (WinGetHandle()) сообщение с кодом 0x0111 ($WM_COMMAND) и передает еще два параметра: $wParam и $lParam. В данном случае первый параметр, это ID того самого пункта меню (-32643), который можно узнать, открыв программу в любом редакторе ресурсов. Второй параметр не используется и равен 0
Подскажите пожалуйста, а вот этот вот ID = -32643 он характерен только для данной версии ПО? Предположим, что разработчики выпустят новую версию этого ПО, тогда ID изменится?
Просто логично цепляться за текстовое название пунктов меню, но этого почему то AutoIt делать не умеет :(
 
Верх