1 (изменено: Mikki, 2013-04-22 15:20:21)

Тема: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Добрый день, знающие.
Попытаюсь сформулировать вопрос попонятнее.

Есть Программа, одной из возможностей которой является рисование графиков. Но, выбор свойств графика реализован не удачно - надо нажать левой клавишей мыши на любой оси (толщина которых довольно-таки мала), тогда появляется окно "Редактор осей", как видно из скриншота.
http://i.imgur.com/GZ2Kb4M.png
Я пол года назад делал скрипт который отсылал клики мышкой в эту Программу, и за секунду выбирал нужные опции, вводил нужные значения в Edit-ах, жал на нужные кнопки. Но, флешка "полетела" и скрипт пропал. Теперь я опять хочу попытаться написать аналогичный скрипт, но на этот раз через использование PostMessage.

Вопросы:
1. Можно ли через PostMessage управлять окном (в моем случае) "Редактор осей", и если "нет", то что нужно для того чтобы "да"?

2....Самый сложный вопрос - если по первому пункту "да", то кто нибудь возьмется показать на примерах (отослать к примерам) как с помощью PostMessage изменять значения в полях Edit, нажимать кнопки, выбирать чекбоксы, выбирать Tab(закладки), перечислить тут Msg которые нужно отснифить (я пользуюсь Spy++)


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

Спасибо.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

2

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Окна управляются через сообщения, так что всё возможно. Но не все сообщения предназначены для PostMessage, некоторые для SendMessage. Нужно смотреть в описании сообщения. Что касается того, какие сообщения вам нужны, то это можно посмотреть в документации Майкрософт на MSDN — для каждого их стандартного контрола имеется набор сообщений, и они там описаны — как их посылать, какие параметры и т.д.

3

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Не пойму, зачем управлять контролами с помощью сообщений, когда для этого в AHK есть команды?

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

4

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Полагаю, для того, чтобы почувствовать себя более крутым программером. Команды — это для нубов.

5

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe



WM_SETTEXT := 0x000C, BM_CLICK := 0x00F5, TCM_SETCURSEL := 0x1330
Gui, Add, Tab, h122 w122, one|two
Gui, Tab, 1
Gui, Add, CheckBox, gCheck, CheckBox 
Gui, Add, Button, gCheck wp, Button
Gui, Add, Edit, wp
Gui, Show, , WinTitle
Return

1:: PostMessage, BM_CLICK,,, Button1, WinTitle

2:: PostMessage, BM_CLICK, , , Button2, WinTitle  

3:: SendMessage, WM_SETTEXT,, "Message", Edit1, WinTitle
 
4:: PostMessage, TCM_SETCURSEL, % T := !T,, SysTabControl321, WinTitle

Check:
    Text := A_GuiControl
    SendMessage, WM_SETTEXT,, &Text, Edit1, WinTitle
    Return

Конечно для ваших целей лучше пользовать команду "Control", но если захочется чего-то ещё добавить, тут коды команд.

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

6 (изменено: Mikki, 2013-04-16 15:05:29)

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Спасибо за "макание" в "более крутого программера" и за понятный пример. Пошел попробовать

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

7

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Есть контрал который в WindowSpy определяется как TToolBox1 (это вот эти 4-е картинки графиков по середине)
http://i.imgur.com/mApUMRU.png
Пытаюсь получить от него обратную связь через ControlGet, но пока безрезультатно. Может уважаемые знатоки подскажут как добиться от него информации "какая кнопочка у тебя сейчас нажата"?

Спасибо.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

8

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

А ControlGetFocus что возвращает?

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

9 (изменено: Mikki, 2013-04-16 22:43:52)

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Возвращает Errorlevel = 1

Команда ControlGet, E11, Tab, , TToolbar1, ahk_class TAxis_Dlg - вернула 1 в Е11

off: ушел домой. отвечу только завтра.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

10

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Так TToolBox1 или TToolbar1?
Проще, выложите программу.

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

11

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Извиняюсь за ошибку - TToolbar1 у меня. А программу выкладывать не вижу смысла пока, т.к. кода отвечающего за обращение к TToolbar1 вообще нету.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

12

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Все гениальное просто - поборол TToolbar1 через ControlClick.

В целом доволен работой скрипта и благодарю всех за их примеры с этого форума, но без пары вопросов не уйду

Постараюсь описать понятно.
-  я отсылаю команды через Control, ControlSetText, ControlClick. Иногда, если быстро нажать клавишу в моем GUIокне чекбокс и двинуть мышку, то чекбокс нажимается, но в целевом окне не происходит изменений. Борюсь с этим плавными движениями мышки ...Но хотелось бы подойти к вопросу с "научной стороны".

- Второй вопрос позаковыристей - (в качестве предисловия - при нажатии на кнопку на панели TToolbar1 изменения на графике происходят сразу, но если после этого нажать на кнопку "отмена" в окне "Редактор осей", то изменения отменяются. Если нажать на кнопку "ОК" то все изменения сохраняются) Если я работаю через свое GUIокно, через ControlClick, TToolbar1, ahk_class TAxis_Dlg, , , , X280 Y30 то изменения в целевом окне тоже происходят сразу, однако, целевое окно не сохраняет значения чекбоксов.
К примеру - на осях I(U) я убрал галочку Lg (все отображается, все хорошо), после этого перехожу на оси U(I), а оно мне опять включает логарифмическую шкалу. Может я как-то не так посылаю Control, ControlSetText, ControlClick ???


#Singleinstance force
SetTitleMatchMode 2
DetectHiddenWindows On

SetControlDelay 10
SetMouseDelay 20
xChoice := "+3000|+2000|+1000|+800|+700|+600|+500|+400|+300|+200|+100|0000|-100|-200|-300|-400|-500|-600|-700|-800|-1000|-1500"
yChoice := "+10000|+2000|+800|+500|+300|+100|+10.0|+1.00|0.001|0.0001|0000|-10.0|-20"
ShowHide:=1

Menu, Tray, add, ShowHide, ShowHide
Menu, Tray, Default, ShowHide
Menu, tray, NoStandard 
Menu, tray, Standard 
Menu, Tray, Click, 1

/*
    ;TFloatEdit4 - ось х, минимум
    ;TFloatEdit3 - ось х, максимум
    ;TFloatEdit2 - ось y, минимум
    ;TFloatEdit1 - ось y, максимум
E4 - xMin
E3 - xMin
E2 - yMin
E1 - yMin
E5 - Масштаб
E6 - Дополнит. сетка
E10 - Lg
*/


ControlGet, E5, Checked, , Автомасштаб, ahk_class TAxis_Dlg
ControlGet, E6, Checked, , Дополнит. сетка, ahk_class TAxis_Dlg
ControlGet, E10, Checked, , Lg I, ahk_class TAxis_Dlg


Gui, +AlwaysOnTop +LastFound -Caption +Toolwindow -E0x08000000 hwndhGUI1 ; окно поверх всего, без рамок,границ,заголовия
Gui, Margin, 4, 2        
Gui, Add, Text, w30 gGetCoord Border Center, xMin
Gui, Add, ComboBox, x+ w70 gXMinChange vE4, %xChoice%
Gui, Add, Text, x+10 w30 ,yMin
Gui, Add, ComboBox, x+ w70 gyMinChange vE2 section, %yChoice%
Gui, Add, Text, x4 w30 ,xMax
Gui, Add, ComboBox, x+ w70 gXMaxChange vE3, %xChoice%
Gui, Add, Text, x+10 w30 ,yMax
Gui, Add, ComboBox, x+ w70 gyMaxChange vE1, %yChoice%

Gui, Add, Checkbox, x10 y+10 vE5 gAutoChange, Масштаб
Gui, Add, Checkbox, x+6 w50 vE6 gGridChange, Сетка
Gui, Add, Checkbox, x+10 w50 vE10 gLgChange, Lg ;= %E10%

Gui, Font, bold
Gui, Color, silver
Gui, Add, Button, vE7 gAxisUT w50 ys x+23 hwndhButton1, U(T)
Gui, Add, Button, vE8 gAxisIU w50 hwndhButton2, I(U)
Gui, Add, Button, vE9 gAxisUI w50 hwndhButton3, U(I)

Gui, Show, % "xCenter y10" ;WorkAreaRight-20

GoSub, GetCoord
;SetTimer, IPCcheck, 1000
;SetTimer, WatchCursor, 500
Return ;=======================================================================================================================

LgChange: 
    GuiControlGet, E10,
    Control, % E10 ? "Check" : "UnCheck",, Lg I, ahk_class TAxis_Dlg
    Sleep, 100
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    GoSub, GetCoord
    return
AutoChange:
    GuiControlGet, E5,
    Control, % E5 ? "Check" : "UnCheck",, Автомасштаб, ahk_class TAxis_Dlg
    Sleep, 100
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    GoSub, GetCoord
    return

GridChange:
    GuiControlGet, E6,
    Control, % E6 ? "Check" : "UnCheck",, Дополнит. сетка, ahk_class TAxis_Dlg
    Sleep, 100
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    GoSub, GetCoord
    return

xMinChange:
XMaxChange:
yMinChange:
yMaxChange:
    Index:= % SubStr(A_GuiControl, 0)
    GuiControlGet, E%Index%,
    ControlSetText, TFloatEdit%Index%, % E%Index% , ahk_class TAxis_Dlg
    Sleep, 100
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    return

GetCoord:
;    ww:= WinExist("ahk_class TAxis_Dlg") ? "-Disabled" : "+Disabled"
;    Gui, %hGUI1%: %ww% 
    ControlGet, TabActive, Tab, , TPageControl1, ahk_class TAxis_Dlg
    loop, 4 
        {
        ControlGetText, E%A_Index%,  % "TFloatEdit" A_Index+2-TabActive , ahk_class TAxis_Dlg
        GuiControl, Text, E%A_Index%, % E%A_Index%
        ControlGet, Z%A_Index%, Enabled, , % "TFloatEdit" A_Index+2-TabActive , ahk_class TAxis_Dlg
        GuiControl, % Z%A_Index% ? "Enable" : "Disable" , E%A_Index%
        }
    ControlGet, E5, Checked, , Автомасштаб, ahk_class TAxis_Dlg
    ControlGet, E6, Checked, , Дополнит. сетка, ahk_class TAxis_Dlg
    ControlGet, E10, Checked, , Lg I, ahk_class TAxis_Dlg
    GuiControl, , E5, % E5 ? 1 : 0
    GuiControl, , E6, % E6 ? 1 : 0
    GuiControl, , E10, % E10 ? 1 : 0
        ControlGet, Z, Enabled, , Автомасштаб, ahk_class TAxis_Dlg
        GuiControl, % Z ? "Enable" : "Disable" , E5
        ControlGet, Z, Enabled, , Дополнит. сетка, ahk_class TAxis_Dlg
        GuiControl, % Z ? "Enable" : "Disable" , E6
        ControlGet, Z, Enabled, , Lg I, ahk_class TAxis_Dlg
        GuiControl, % Z ? "Enable" : "Disable" , E10
    return


ShowHide:
    Gui, % (ShowHide:=1-ShowHide) ? "Show":"Hide"
    Return
AxisUT:
    ControlClick, TToolbar1, ahk_class TAxis_Dlg, , , , X130 Y30
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    GoSub, GetCoord
    return
AxisIU:
    ControlClick, TToolbar1, ahk_class TAxis_Dlg, , , , X200 Y30
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    GoSub, GetCoord
    return
AxisUI:
    ControlClick, TToolbar1, ahk_class TAxis_Dlg, , , , X280 Y30
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    GoSub, GetCoord
    return
            
Return
Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

13 (изменено: creature.ws, 2013-04-17 23:03:43)

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Попробуйте устанавливать значения чекбоксов при помощи ControlClick, а не Control.

Control, % E5 ? "Check" : "UnCheck",, Автомасштаб, ahk_class TAxis_Dlg

— отправляет чекбоксу сообщение, «уведомляющее его» отобразить/не отображать отметку. Отправленный клик может обрабатываться окном иначе.

14

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Пытаюсь получить от него обратную связь через ControlGet, но пока безрезультатно.

Все гениальное просто - поборол TToolbar1 через ControlClick.

Извчение данных и нажатие... Одно и тоже?

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

SetControlDelay и BlockInput в помощь.
Ну и чтоб наверняка, извлекать данные из контрола для проверки, и нажимать заново если не ГУД.

Если я работаю через свое GUIокно... то изменения в целевом окне тоже происходят сразу, однако, целевое окно не сохраняет значения чекбоксов.

Можно пример кода покороче, и с хоткеем.

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

15

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

  • конфликт с задержкой поборол чтением мануала и, как следствие, выставлением SetControlDelay -1

  • обратная связь от TToolbar1 перестала быть нужной когда я осознал "что мне таки от него надо"

  • извлекать данные из контрола для проверки, и нажимать заново если не ГУД - большое спасибо! Именно так и сделал.

Приведу код, "для отчетности" так сказать, хоть скрипт ни для кого кроме меня не имеет полезности в плане использования:

#Singleinstance force
SetTitleMatchMode 2
DetectHiddenWindows On
SetControlDelay -1

xChoice := "+3000|+2000|+1000|+800|+700|+600|+500|+400|+300|+200|+100|0000|-100|-200|-300|-400|-500|-600|-700|-800|-1000|-1500"
yChoice := "+10000|+2000|+800|+500|+300|+100|+10.0|+1.00|0.001|0.0001|0000|-10.0|-20"
boxChoice:={5:"Автомасштаб", 6:"Дополнит. сетка", 0:"Lg I"}
ShowHide:=1

Menu, Tray, add, ShowHide, ShowHide
Menu, Tray, Default, ShowHide
Menu, tray, NoStandard 
Menu, tray, Standard 
Menu, Tray, Click, 1

/*
    ;TFloatEdit4 - ось х, минимум
    ;TFloatEdit3 - ось х, максимум
    ;TFloatEdit2 - ось y, минимум
    ;TFloatEdit1 - ось y, максимум
E4 - xMin
E3 - xMin
E2 - yMin
E1 - yMin
E5 - Масштаб
E6 - Дополнит. сетка
E0 - Lg
*/


ControlGet, E5, Checked, , Автомасштаб, ahk_class TAxis_Dlg
ControlGet, E6, Checked, , Дополнит. сетка, ahk_class TAxis_Dlg
ControlGet, E10, Checked, , Lg I, ahk_class TAxis_Dlg


Gui, +AlwaysOnTop +LastFound -Caption +Toolwindow +Border -E0x08000000 hwndhGUI1 ; окно поверх всего, без рамок,границ,заголовия
Gui, Margin, 4, 4        
Gui, Font, underline
Gui, Add, Text, w30 y6 gGo Center cBlue, xMin ;
Gui, Font, norm
Gui, Add, ComboBox, x+ yp-4 w70 gGo vE4, %xChoice%
Gui, Add, Text, x+10 y6 w30 ,yMin
Gui, Add, ComboBox, x+ yp-4 w70 gGo vE2 section, %yChoice%
Gui, Add, Text, x4 y+5 w30 ,xMax
Gui, Add, ComboBox, x+ yp-4 w70 gGo vE3, %xChoice%
Gui, Add, Text, x+10 yp+5 w30 ,yMax
Gui, Add, ComboBox, x+ yp-4 w70 gGo vE1, %yChoice%

Gui, Add, Checkbox, x10 y+10 vE5 gGo, АвтоМасштаб
Gui, Add, Checkbox, x+6 w50 vE6 gGo, Сетка
Gui, Add, Checkbox, x+10 w50 vE0 gGo, Lg

Gui, Font, bold
Gui, Color, silver
Gui, Add, Button, vE7 gGo w50 ys x+0, U(T)
Gui, Add, Button, vE8 gGo w50, I(U)
Gui, Add, Button, vE9 gGo w50, U(I)

Gui, Show, % "xCenter y10"

GoSub, Go
Return ;=======================================================================================================================

ShowHide:
    Gui, % (ShowHide:=1-ShowHide) ? "Show":"Hide"

Go:
;    ww:= WinExist("ahk_class TAxis_Dlg") ? "-Disabled" : "+Disabled"
;    Gui, %hGUI1%: %ww% 
    Index:= % SubStr(A_GuiControl, 0)
    if (index=1 || index=2 || index=3 || index=4) {
        GuiControlGet, E%Index%,
        ControlGet, TabActive, Tab, , TPageControl1, ahk_class TAxis_Dlg
        ControlSetText, % "TFloatEdit" Index+2-TabActive, % E%Index% , ahk_class TAxis_Dlg
    } 
    else if (index=5 || index=6 || index=0) {
        ControlClick, % boxChoice[index], ahk_class TAxis_Dlg
    }
    else if (index=7 || index=8 || index=9) {
        ControlClick, TToolbar1, ahk_class TAxis_Dlg, , , , % "X" (Index-7)*70+130 " Y30"
        ControlClick, TBitBtn2, ahk_class TAxis_Dlg
        GuiControlGet, E5
        GuiControlGet, E6
        GuiControlGet, E0
        Control, % E5 ? "Check" : "Uncheck",, Автомасштаб, ahk_class TAxis_Dlg
        Control, % E6 ? "Check" : "Uncheck",, Дополнит. сетка, ahk_class TAxis_Dlg
        Control, % E0 ? "Check" : "Uncheck",, Lg I, ahk_class TAxis_Dlg
    }
    
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    Sleep, 100
    ControlGet, TabActive, Tab, , TPageControl1, ahk_class TAxis_Dlg
    loop, 4 
        {
        ControlGetText, E%A_Index%,  % "TFloatEdit" A_Index+2-TabActive , ahk_class TAxis_Dlg
        GuiControl, Text, E%A_Index%, % E%A_Index%
        ControlGet, Z%A_Index%, Enabled, , % "TFloatEdit" A_Index+2-TabActive , ahk_class TAxis_Dlg
        GuiControl, % Z%A_Index% ? "Enable" : "Disable" , E%A_Index%
    }
    ControlGet, E5, Checked, , Автомасштаб, ahk_class TAxis_Dlg
    ControlGet, E6, Checked, , Дополнит. сетка, ahk_class TAxis_Dlg
    ControlGet, E0, Checked, , Lg I, ahk_class TAxis_Dlg
    GuiControl, , E5, % E5 ? 1 : 0
    GuiControl, , E6, % E6 ? 1 : 0
    GuiControl, , E0, % E0 ? 1 : 0
        ControlGet, Z, Enabled, , Автомасштаб, ahk_class TAxis_Dlg
        GuiControl, % Z ? "Enable" : "Disable" , E5
        ControlGet, Z, Enabled, , Дополнит. сетка, ahk_class TAxis_Dlg
        GuiControl, % Z ? "Enable" : "Disable" , E6
        ControlGet, Z, Enabled, , Lg I, ahk_class TAxis_Dlg
        GuiControl, % Z ? "Enable" : "Disable" , E0
    return
            
Return

...Не знаю - менять название темы или нет? Все таки она не отображает содержания.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

16

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

И еще вопрос по поводу дочерних окон.

Тогда, пол года назад, когда я писал первую программу для работы с дочерним окошком "Редактор осей" я через PixelSearch (по моему) искал ось на главном окне программы и скрипт жал в нее LButton-ом, и уж затем, в нем проводились все манипуляции.
Сейчас все работает и без вызова окна "Редактор осей", но - иногда надо его вызвать, чтобы оно обновило значения в полях. Есть ли возможность реализовать вызов окошка "Редактор осей" минуя процесс поиска пикселей? Я пытался отловить сообщения WM_ACTIVATE - я в правильном направлении думаю?

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

17

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Вы просто хотите регистрировать факты активации окна "Редактор осей" ?

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

18 (изменено: Mikki, 2013-04-22 16:54:20)

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Нет, я хочу его вызвать. (процедура вызова окна "Редактор осей" описана в первом посте, первый абзац)
Но, т.к. нет определенного контрала (кнопка, чекбокс итд) который его вызывает, то , раньше, мне приходилось искать попиксельно координаты оси  и жать по этим координатам мышкой. Теперь же хочу уйти от поиска. Знаю заголовок окна и его класс, пытаюсь его активировать командой.
По WinActivate окно не появляется.
По WinShow окно появляется, но оно не функцинально. Потом приходится перезапускать всю программу.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

19

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Знаю заголовок окна и его классNN

классNN окна?

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

20

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Имелось ввиду это - ahk_class TAxis_Dlg

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

21

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Пробуйте что-то из WinSet. Style на визибл, Redraw, может быть и WinMove.

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

22 (изменено: Mikki, 2013-04-23 12:38:26)

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

    Winset, Redraw, , ahk_class TAxis_Dlg
    WinMove, ahk_class TAxis_Dlg,
    WinActivate, ahk_class TAxis_Dlg

Вышеприведенный блок не дал ни каких результатов. По прежнему - пока "руками" не открою окно, данные полей не обновятся.

---
Экспериментально обнаружено - если не "открывать окно руками", а перезапустить скрипт - то в нем появятся новые, обновленные данные(!!!) *смайлик сильного удивления* ......У меня ступор. Подсобите пожалуйста.

+ открыть спойлер
#Singleinstance force
SetTitleMatchMode 2
DetectHiddenWindows On
SetControlDelay -1

global hGui1, moved, CROSS_CursorHandle, OCR_NORMAL

OCR_NORMAL := 32512    ; обычный курсор в виде стрелки
OCR_CROSS := 32646    ; курсор в виде креста
WM_ACTIVATE := 0x0006
NORMAL_CursorHandle := DllCall( "LoadCursor", Uint,0, Int, OCR_NORMAL) ; загрузить системный OCR_NORMAL-курсор
CROSS_CursorHandle  := DllCall( "LoadCursor", Uint,0, Int, OCR_CROSS)   ; загрузить системный OCR_CROSS-курсор

Choice1 := "+3000|+2000|+1000|+800|+700|+600|+500|+400|+300|+200|+100|0000"
Choice2 := "+3000|+2000|+1000|+800|+700|+600|+500|+400|+300|+200|+100|0000|-100|-200|-300|-400|-500|-600|-700|-800|-1000|-1500"
Choice3 := "+10000|+2000|+800|+500|+300|+100|+10.0|+1.00|0.001|0.0001|0000|-10.0|-20"
Choice4 := "+3000|+2000|+1000|+800|+700|+600|+500|+400|+300|+200|+100|0000|-100|-200|-300|-400|-500|-600|-700|-800|-1000|-1500"

boxChoice:={5:"Автомасштаб", 6:"Дополнит. сетка", 0:"Lg I"}
ShowHide:=1

Menu, Tray, add, ShowHide, ShowHide
Menu, Tray, Default, ShowHide
Menu, tray, NoStandard 
Menu, tray, Standard 
Menu, Tray, Click, 1

/*
    ;TFloatEdit4 - ось х, минимум
    ;TFloatEdit3 - ось х, максимум
    ;TFloatEdit2 - ось y, минимум
    ;TFloatEdit1 - ось y, максимум
E4 - xMin
E3 - xMin
E2 - yMin
E1 - yMin
E5 - Масштаб
E6 - Дополнит. сетка
E0 - Lg
E7 - график U(T) 
E8 - график I(U)
E9 - график U(I)
*/

Gui, +AlwaysOnTop +LastFound -Caption +Toolwindow +Border -E0x08000000 hwndhGUI1 ; окно поверх всего, без рамок,границ,заголовия
Gui, Margin, 4, 4        
Gui, Font, underline
;по клику на текст xMin происходит обновление значений всех полей в Gui.
Gui, Add, Text, w30 y6 gCheck Center cBlue, xMin 
Gui, Font, norm
Gui, Add, ComboBox, x+ yp-4 w70 gGo vE4, %Choice2%

Gui, Add, Text, x+10 y6 w30 ,yMin
Gui, Add, ComboBox, x+ yp-4 w70 gGo vE2 section, %Choice2%

Gui, Add, Text, x4 y+5 w30 ,xMax
Gui, Add, ComboBox, x+ yp-4 w70 gGo vE3, %Choice2%

Gui, Add, Text, x+10 yp+5 w30 ,yMax
Gui, Add, ComboBox, x+ yp-4 w70 gGo vE1, %Choice2%

Gui, Add, Checkbox, x10 y+10 vE5 gGo, АвтоМасштаб
Gui, Add, Checkbox, x+6 w50 vE6 gGo, Сетка
Gui, Add, Checkbox, x+10 w50 vE0 gGo, Lg

Gui, Font, bold
Gui, Color, silver
Gui, Add, Button, vE7 gGo w50 ys x+0, U(T)
Gui, Add, Button, vE8 gGo w50, I(U)
Gui, Add, Button, vE9 gGo w50, U(I)

Gui, Show, % "xCenter y10"

GoSub, Check
Return ;=======================================================================================================================

ShowHide:
    Gui, % (ShowHide:=1-ShowHide) ? "Show":"Hide"
Return

Go:
    WinMove(WinID,A_GuiControl)
    if moved
        return

    ;определение номера активированного элемента Gui
    Index:= % SubStr(A_GuiControl, 0)
    ;из-за номера активной страницы TPage зависит номер элементов TFloatEdit
    ControlGet, TabActive, Tab, , TPageControl1, ahk_class TAxis_Dlg 
    ;отсылание команды в целевое окно согласно изменениям в активированном элементе
    if (index=1 || index=2 || index=3 || index=4) {
        GuiControlGet, E%Index%,
        ControlSetText, % "TFloatEdit" Index+2-TabActive, % E%Index% , ahk_class TAxis_Dlg
    } 
    else if (index=5 || index=6 || index=0) {
        ControlClick, % boxChoice[index], ahk_class TAxis_Dlg
    }
    else if (index=7|| index=8 || index=9) {
            ControlClick, TToolbar1, ahk_class TAxis_Dlg, , , , % "X" (Index-7)*70+130 " Y30"
            j:=index-6
            k:=index-5
            GuiControl, , E4, % "|" Choice%j%
            GuiControl, , E3, % "|" Choice%j%
            GuiControl, , E2, % "|" Choice%k%
            GuiControl, , E1, % "|" Choice%k%
            ControlClick, TBitBtn2, ahk_class TAxis_Dlg
            ;обновление значений чекбоксов, т.к. целевое окно почемуто не сохраняет их значений
            GuiControlGet, E5
            GuiControlGet, E6
            GuiControlGet, E0
            Control, % E5 ? "Check" : "Uncheck",, Автомасштаб, ahk_class TAxis_Dlg
            Control, % E6 ? "Check" : "Uncheck",, Дополнит. сетка, ahk_class TAxis_Dlg
            Control, % E0 ? "Check" : "Uncheck",, Lg I, ahk_class TAxis_Dlg
    }
    
;обновление значений в окне Gui согласно данным в целевом овне    
Check:
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg
    Sleep, 50
    ControlGet, TabActive, Tab, , TPageControl1, ahk_class TAxis_Dlg
    loop, 4 
        {
        ControlGetText, E%A_Index%,  % "TFloatEdit" A_Index+2-TabActive , ahk_class TAxis_Dlg
        GuiControl, Text, E%A_Index%, % E%A_Index%
        ControlGet, Z%A_Index%, Enabled, , % "TFloatEdit" A_Index+2-TabActive , ahk_class TAxis_Dlg
        GuiControl, % Z%A_Index% ? "Enable" : "Disable" , E%A_Index%
    }
    ControlGet, E5, Checked, , Автомасштаб, ahk_class TAxis_Dlg
    ControlGet, E6, Checked, , Дополнит. сетка, ahk_class TAxis_Dlg
    ControlGet, E0, Checked, , Lg I, ahk_class TAxis_Dlg
    GuiControl, , E5, % E5 ? 1 : 0
    GuiControl, , E6, % E6 ? 1 : 0
    GuiControl, , E0, % E0 ? 1 : 0
    ControlGet, Z, Enabled, , Автомасштаб, ahk_class TAxis_Dlg
    GuiControl, % Z ? "Enable" : "Disable" , E5
    ControlGet, Z, Enabled, , Дополнит. сетка, ahk_class TAxis_Dlg
    GuiControl, % Z ? "Enable" : "Disable" , E6
    ControlGet, Z, Enabled, , Lg I, ahk_class TAxis_Dlg
    GuiControl, % Z ? "Enable" : "Disable" , E0
return

;передвижение окна правой клавишей мышки 
~RButton::
    MouseGetPos,,, WinID, A_GC
    if (WinID = hGui1)
        WinMove(WinID, A_GC)
return
    
WinMove(WinID, A_GC)
{
    CoordMode, Mouse
    SetWinDelay, -1
    SetBatchLines, -1
    MouseGetPos, Start_X, Start_Y
    WinGetPos, X_Win, Y_Win,,, ahk_id %WinID%
    While GetKeyState("RButton", "P")
    {
        if !hand                                     ;изменение вида курсора при перетягивании окна
            DllCall("SetSystemCursor", UInt, CROSS_CursorHandle, Int, OCR_NORMAL) , hand:=1
        MouseGetPos, Current_X, Current_Y
        moved := (Current_X != Start_X || Current_Y != Start_Y) ? 1 : ""
        WinMove, ahk_id %WinID%,, X_Win + Current_X - Start_X, Y_Win + Current_Y - Start_Y
         Sleep, 10
    }
    if (hand)                                ;изменение вида курсора при окончании перетягивания окна
        DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS:=0x57, UInt, 0, UInt, 0, UInt, 0), hand:=""
}

Return

added: И еще обнаружено, что если в конце блока Check поставить MsgBox,, то обновление полей в Gui окне происходит...почему?

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

23

Re: AHK: отсылание комманд элементам дочернего окна программы IPC2000.exe

Проблемма решилась с помощью Активации материнского целевого окна:

...
Check:
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg ;если убрать эту строчку, то значения чекбоксов не сохраняются
    WinActivate, IPC ahk_class TMainForm ;активируется главное целевое окно
    ControlClick, TBitBtn2, ahk_class TAxis_Dlg ;еще раз идет подтверждение изменений в дочернем целевом окне
...
Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди