1

Тема: AHK: Выбор нужного контрола

Вопрос такой: "Есть много контролов Edit1, как обратиться к необходимому?". Заранее спасибо!

2

Re: AHK: Выбор нужного контрола

Насколько я знаю, в одном окне не может быть нескольких контролов одного класса с одинаковым номером. Где они у вас находятся?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Выбор нужного контрола

В настройках программы WinRar.

4 (изменено: teadrinker, 2017-07-06 04:09:40)

Re: AHK: Выбор нужного контрола

На самом деле нет. Откройте окно настроек и запустите такой код:

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

Потом откройте по очереди все вкладки окна и снова запустите.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: svoboden, 2017-07-06 06:54:02)

Re: AHK: Выбор нужного контрола

teadrinker, как я могу узнать необходимый хэдл, не переходя к нужной вкладке? Нашел, что ID в этих контролов всегда одинаковый (определил с помощью AutoIt Window Info), может, с помощью его можно обратиться к контролу, только у меня не выходит. Мой вопрос: "Я хочу обратиться к необходимому контролу Edit1, не переходя к нужной вкладке". Такое можно сделать, например, с помощью хэдла или текста нужного буттона.

6 (изменено: teadrinker, 2017-07-06 07:33:22)

Re: AHK: Выбор нужного контрола

Так можно определить 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

Только проблема в том, что пока вкладка, в которой контрол находится, не открыта, он и не существует, у меня, по-крайней мере, так. То есть сначала все вкладки нужно вручную прощёлкать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Выбор нужного контрола

svoboden, а зачем вам это надо?
Через командную строку нельзя решить?

8

Re: AHK: Выбор нужного контрола

А если так уж нужны настройки, то их можно импортировать из файла, либо напрямую править реестр.

9 (изменено: svoboden, 2017-07-06 20:53:30)

Re: AHK: Выбор нужного контрола

Malcev, может, можно, но не у всех же программах есть такое, и пока разберешься в этих командных строках. Насчет перезаписи файлов, это я знаю, но программу нужно перезапускать тогда.

teadrinker, почти то, что надо, но как же так не может определить хэдл сразу, ID же вроде есть.

10

Re: AHK: Выбор нужного контрола

Насчет перезаписи файлов, это я знаю, но программу нужно перезапускать тогда.

Импортирйте реестр-файл напрямую в winrar и ничего перезапускать не придётся.

11

Re: AHK: Выбор нужного контрола

svoboden пишет:

teadrinker, почти то, что надо, но как же так не может определить хэдл сразу, ID же вроде есть.

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

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Выбор нужного контрола

Первый раз сталкиваюсь с DlgCtrlID. Что они дают? По ClassNN находить не то же самое?

Или смысл в том что например во вкладках таба ClassNN могут повторятся, а ID внутри класса контролов - нет?

svoboden
Активируйте нужную вкладку и ищите.

Чтобы не перебирать вкладки, а выбрать нужную сразу по номеру, замените 5 в примере ниже числом на 1 меньшим нужного номера (0 выбирает первую и т.д.):


SendMessage, 0x130C, 5,, SysTabControl321, Установки ahk_class #32770 ahk_exe WinRAR.exe
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Выбор нужного контрола

serzh82saratov пишет:

Первый раз сталкиваюсь с DlgCtrlID. Что они дают? По ClassNN находить не то же самое?

Значения ClassNN там не постоянные, а ID всегда одинаковые.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: Выбор нужного контрола

Если смотреть список контролов, то да. А если посмотреть MouseGetPos, , , , ControlNN, то всегда одинаковый.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Выбор нужного контрола

И для каких это контролов, я вижу что у кнопок DlgCtrlID повторяются в одном окне, это только для Edit?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Выбор нужного контрола

При этом id кнопок может совпадать с id Edit, тогда в твоём коде надо проверять класс.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Выбор нужного контрола

Я не изучал подробно. Действительно, повторяются, наверно разные только для одного класса.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK: Выбор нужного контрола

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
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: Выбор нужного контрола

serzh82saratov пишет:

И для каких это контролов, я вижу что у кнопок DlgCtrlID повторяются в одном окне, это только для Edit?

В классе кнопок повторяются.
А описание какое то совсем скудное.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

Re: AHK: Выбор нужного контрола

Ну, надо проверять, одинаковые или разные у них родительские окна, может, от этого зависит ещё. Главное, что у одного и того же контрола постоянное ID. И, насколько я понимаю, его определяет разработчик, поэтому в принципе может хоть всем одинаковые раздать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK: Выбор нужного контрола

svoboden пишет:

Нашел, что ID в этих контролов всегда одинаковый (определил с помощью AutoIt Window Info)

А AutoIt Window Info показывает это ID для всех контролов подряд?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22 (изменено: svoboden, 2017-10-11 20:22:05)

Re: AHK: Выбор нужного контрола

Почти везде показывает.

23 (изменено: svoboden, 2017-07-24 18:49:23)

Re: AHK: Выбор нужного контрола

Вы не подскажете, так работает для всех окон настроек, например, в настройках программы uTorrent такой вариант не работает:

SendMessage, 0x130C, 5,, SysTreeView321, Настройки ahk_class #32770 ahk_exe uTorrent.exe

24 (изменено: Malcev, 2017-07-07 03:53:34)

Re: AHK: Выбор нужного контрола

А он там и не должен работать.
Сообщения разные. В винрар:
https://msdn.microsoft.com/en-us/librar … s.85).aspx
А в юторрент:
https://msdn.microsoft.com/en-us/librar … s.85).aspx

25

Re: AHK: Выбор нужного контрола

Вот так у меня выбирает дочерний третий подпункт:

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

26 (изменено: svoboden, 2018-12-02 21:32:26)

Re: AHK: Выбор нужного контрола

Пытаюсь определить состояния флажков в настройках программы 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.

Кто знает, почему? Заранее спасибо!

27

Re: AHK: Выбор нужного контрола

Либо неправильно определяете родительское окно, либо айди кнопки.

28 (изменено: svoboden, 2018-12-02 21:19:51)

Re: AHK: Выбор нужного контрола

Не понимаю, так я же указал hDlg и nIDButton. Я уже много разных вариантов подбирал вместо этих значений, ничего не работает.

29

Re: AHK: Выбор нужного контрола

Читайте GetParent, GetDlgCtrlID.

30 (изменено: svoboden, 2018-12-02 19:23:41)

Re: AHK: Выбор нужного контрола

Ну да, работает! А я какие только значения не подбирал.

31

Re: AHK: Выбор нужного контрола

Чтобы не мучаться с подбором можно посмотреть составляющие окна с помощью Microsoft Spy++.

32 (изменено: svoboden, 2018-12-02 23:25:15)

Re: AHK: Выбор нужного контрола

Это да, просто было сложно понять, какое именно значение нужно.
Так я методом подбора пользуюсь в таких случаях. Хотя знаю про Spy++ и подобные программ.
Спасибо, помогли.