Тема: AHK: Выбор нужного контрола
Вопрос такой: "Есть много контролов Edit1, как обратиться к необходимому?". Заранее спасибо!
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Вопрос такой: "Есть много контролов Edit1, как обратиться к необходимому?". Заранее спасибо!
Насколько я знаю, в одном окне не может быть нескольких контролов одного класса с одинаковым номером. Где они у вас находятся?
В настройках программы WinRar.
На самом деле нет. Откройте окно настроек и запустите такой код:
WinWait, ahk_class #32770 ahk_exe WinRAR.exe
WinGet, List1, ControlList
WinGet, List2, ControlListHwnd
arr1 := StrSplit(List1, "`n", "`r")
arr2 := StrSplit(List2, "`n", "`r")
Loop % arr1.MaxIndex()
if InStr(arr1[A_Index], "Edit")
str .= arr1[A_Index] . A_Tab . arr2[A_Index] . "`n"
MsgBox, % str
Потом откройте по очереди все вкладки окна и снова запустите.
teadrinker, как я могу узнать необходимый хэдл, не переходя к нужной вкладке? Нашел, что ID в этих контролов всегда одинаковый (определил с помощью AutoIt Window Info), может, с помощью его можно обратиться к контролу, только у меня не выходит. Мой вопрос: "Я хочу обратиться к необходимому контролу Edit1, не переходя к нужной вкладке". Такое можно сделать, например, с помощью хэдла или текста нужного буттона.
Так можно определить hwnd, если известен ID:
EditID := 110 ; записать определённый ID
WinExist("ahk_class #32770 ahk_exe WinRAR.exe")
WinGet, List1, ControlListHwnd
Loop, parse, List1, `n, `r
if DllCall("GetDlgCtrlID", Ptr, A_LoopField) = EditID && hwnd := A_LoopField
break
MsgBox, % "hwnd = " . hwnd
Только проблема в том, что пока вкладка, в которой контрол находится, не открыта, он и не существует, у меня, по-крайней мере, так. То есть сначала все вкладки нужно вручную прощёлкать.
svoboden, а зачем вам это надо?
Через командную строку нельзя решить?
А если так уж нужны настройки, то их можно импортировать из файла, либо напрямую править реестр.
Malcev, может, можно, но не у всех же программах есть такое, и пока разберешься в этих командных строках. Насчет перезаписи файлов, это я знаю, но программу нужно перезапускать тогда.
teadrinker, почти то, что надо, но как же так не может определить хэдл сразу, ID же вроде есть.
Насчет перезаписи файлов, это я знаю, но программу нужно перезапускать тогда.
Импортирйте реестр-файл напрямую в winrar и ничего перезапускать не придётся.
teadrinker, почти то, что надо, но как же так не может определить хэдл сразу, ID же вроде есть.
ID есть, а самого контрола ещё нету. Видимо, по соображениям экономии ресурсов создаётся только в момент обращения к соответствующей вкладке.
Первый раз сталкиваюсь с DlgCtrlID. Что они дают? По ClassNN находить не то же самое?
Или смысл в том что например во вкладках таба ClassNN могут повторятся, а ID внутри класса контролов - нет?
svoboden
Активируйте нужную вкладку и ищите.
Чтобы не перебирать вкладки, а выбрать нужную сразу по номеру, замените 5 в примере ниже числом на 1 меньшим нужного номера (0 выбирает первую и т.д.):
SendMessage, 0x130C, 5,, SysTabControl321, Установки ahk_class #32770 ahk_exe WinRAR.exe
Первый раз сталкиваюсь с DlgCtrlID. Что они дают? По ClassNN находить не то же самое?
Значения ClassNN там не постоянные, а ID всегда одинаковые.
Если смотреть список контролов, то да. А если посмотреть MouseGetPos, , , , ControlNN, то всегда одинаковый.
И для каких это контролов, я вижу что у кнопок DlgCtrlID повторяются в одном окне, это только для Edit?
При этом id кнопок может совпадать с id Edit, тогда в твоём коде надо проверять класс.
Я не изучал подробно. Действительно, повторяются, наверно разные только для одного класса.
EditID := 110 ; записать определённый ID
WinExist("ahk_class #32770 ahk_exe WinRAR.exe")
WinGet, List1, ControlListHwnd
Loop, parse, List1, `n, `r
{
WinGetClass, WinClass, % "ahk_id" A_LoopField
if DllCall("GetDlgCtrlID", Ptr, A_LoopField) = EditID && WinClass = "Edit" && hwnd := A_LoopField
break
}
MsgBox, % "hwnd = " . hwnd
И для каких это контролов, я вижу что у кнопок DlgCtrlID повторяются в одном окне, это только для Edit?
В классе кнопок повторяются.
А описание какое то совсем скудное.
Ну, надо проверять, одинаковые или разные у них родительские окна, может, от этого зависит ещё. Главное, что у одного и того же контрола постоянное ID. И, насколько я понимаю, его определяет разработчик, поэтому в принципе может хоть всем одинаковые раздать.
Нашел, что ID в этих контролов всегда одинаковый (определил с помощью AutoIt Window Info)
А AutoIt Window Info показывает это ID для всех контролов подряд?
Почти везде показывает.
Вы не подскажете, так работает для всех окон настроек, например, в настройках программы uTorrent такой вариант не работает:
SendMessage, 0x130C, 5,, SysTreeView321, Настройки ahk_class #32770 ahk_exe uTorrent.exe
А он там и не должен работать.
Сообщения разные. В винрар:
https://msdn.microsoft.com/en-us/librar … s.85).aspx
А в юторрент:
https://msdn.microsoft.com/en-us/librar … s.85).aspx
Вот так у меня выбирает дочерний третий подпункт:
n := 14
nChild := 3
f1::
SendMessage, TVM_GETNEXTITEM := 0x110A, TVGN_FIRSTVISIBLE := 0x5, 0, SysTreeView321, ahk_class #32770 ahk_exe uTorrent.exe
loop % n - 1
SendMessage, TVM_GETNEXTITEM := 0x110A, TVGN_NEXTVISIBLE := 0x6, ErrorLevel, SysTreeView321, ahk_class #32770 ahk_exe uTorrent.exe
SendMessage, TVM_GETNEXTITEM := 0x110A, TVGN_CHILD := 0x4, ErrorLevel, SysTreeView321, ahk_class #32770 ahk_exe uTorrent.exe
loop % nChild - 1
SendMessage, TVM_GETNEXTITEM := 0x110A, TVGN_NEXTVISIBLE := 0x6, ErrorLevel, SysTreeView321, ahk_class #32770 ahk_exe uTorrent.exe
SendMessage, TVM_SELECTITEM := 0x110B, TVGN_CARET := 0x9, ErrorLevel, SysTreeView321, ahk_class #32770 ahk_exe uTorrent.exe
return
Пытаюсь определить состояния флажков в настройках программы Winrar.
Так работает:
BM_GETCHECK := 0xF0
BST_CHECKED := 0x1
BST_INDETERMINATE := 0x2
BST_UNCHECKED := 0x0
SendMessage, BM_GETCHECK,0,0,, ahk_id 0x002206CC
If (errorLevel = BST_CHECKED)
msgbox found
else
msgbox not found
Так нет:
hDlg := "0x00AA05C2" ; ?
nIDButton := "102" ; ?
w := DllCall("IsDlgButtonChecked", "Ptr", hDlg, "int", nIDButton)
msgbox % w
https://docs.microsoft.com/ru-ru/window … tonchecked.
Кто знает, почему? Заранее спасибо!
Либо неправильно определяете родительское окно, либо айди кнопки.
Не понимаю, так я же указал hDlg и nIDButton. Я уже много разных вариантов подбирал вместо этих значений, ничего не работает.
Читайте GetParent, GetDlgCtrlID.
Ну да, работает! А я какие только значения не подбирал.
Чтобы не мучаться с подбором можно посмотреть составляющие окна с помощью Microsoft Spy++.
Это да, просто было сложно понять, какое именно значение нужно.
Так я методом подбора пользуюсь в таких случаях. Хотя знаю про Spy++ и подобные программ.
Спасибо, помогли.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться