Показать сообщение отдельно
Старый 18.01.2022, 02:06   #50
sergio1982
Местный
 
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 481 раз(а) в 147 сообщениях
Вес репутации: 197
sergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царстве
По умолчанию

Вот рабочий пример. Переключает слои циклично.
Тут указан неизменный TSpTBXComboBox2.

На время теста лучше закомментировать это
Код:
	If Childs[Saveid] && WinExist("ahk_id " Childs[Saveid]) && DllCall("IsWindowVisible", "Ptr", Childs[Saveid])
		Return Childs[Saveid]
так как оно возвращает ранее найденный хэндл.
Станет работать медленнее, но при каждом нажатии будет искать именно TSpTBXComboBox2.

Но в режиме чертения, этот родительский контрол перестраивается, и ComboBox становится 3.


Скрытый текст

PHP код:
#SingleInstance Force
#Persistent
#NoEnv
#UseHook
SetBatchLines -1
ListLines Off 
#KeyHistory 0

#If WinActive("ahk_class TFormMain ahk_exe Bazis_.exe")    
^+Up:: Next_Layer(0)
^+
Down:: Next_Layer(1)
#If

Next_Layer(Next) {
    
hwnd := Control_Child("Next_Layer""TSpTBXToolbar""Слои""TSpTBXComboBox2"
    
SendMessage0x14700, , ahk_id %hwnd%   ; CB_GETCURSEL 
    SelPos 
:= ErrorLevel
    SelPos 
:= SelPos 0xffffffff || SelPos SelPos 1
    SendMessage
0x14600, , ahk_id %hwnd%   ; CB_GETCOUNT 
    COUNT 
:= ErrorLevel 
    
If Next
        NewPos 
:= SelPos COUNT || !SelPos SelPos 1
    
Else 
        
NewPos := SelPos <= COUNT SelPos 1
    Control
Choose, %NewPos%, , ahk_id %hwnd%
}

Control_Child(SaveidparentclassparenttextclassNN) {
    Static 
Childs := {} 
    If 
Childs[Saveid] && WinExist("ahk_id " Childs[Saveid]) && DllCall("IsWindowVisible""Ptr"Childs[Saveid])
        Return 
Childs[Saveid]
    If !
HWND := Control_Find(parentclassparenttext)
        Return 
0
    ControlGet
ChildHWND, , %classNN%, % "ahk_id " HWND
    
If !Child
        
Return 0
    
Return Childs[Saveid] := Child
}

Control_Find(class, textWin 0) {
    
Win := "ahk_id" (Win ?  Win WinExist("A"))
    
Loop
    
{
        
ControlGetHWNDHWND, , %class%%A_Index%, %Win%  
        If !
HWND
            
Return 
        
If !DllCall("IsWindowVisible""Ptr"HWND)
            Continue
        
ControlGetTextGetText, , % "ahk_id " HWND 
        
If (GetText != text)
            Continue
        Return 
HWND
    
}
    Return 


[свернуть]

Последний раз редактировалось sergio1982; 18.01.2022 в 03:11.
sergio1982 вне форума   Ответить с цитированием Вверх