1

Тема: AHK: класс окна Afx:%x:%x:%x:%x:%x

Многие окна приложений винды имеют ahk_class вида  Afx:%x:%x:%x:%x:%x
например: Afx:0000000140000000:8:0000000000010003:0000000000000000:0000000011020B75
(нагугли что это структура MFC Window Class Names, насколько понял в х64 системах юзается наиболее активно)
При каждом перезапуске программы последний блок %x ее класса меняется.
Вопрос: насколько однозначно можно определить приложение по такой маске
Afx:%x:%x:%x:%x:.*

Вот например эти окна будут отличаться:
Afx:0000000140000000:b:0000000000010003:0000000000000006:0000000001090E59 ;ACDSee Pro 7
Afx:0000000140000000:8:0000000000010003:0000000000000000:0000000011020B75 ;Solidworks 2013

Короче пока писал понял что придется запустить все приложения и посмотреть самому ))
Но может кто-то даст теоретическое обоснование все таки. В доках написано что %x заполняется из WNDCLASS,
но синтаксиса этого заполнения я нигде не нашел. Что означает каждый блок %x непонятно в корне.

2 (изменено: Stepnoy, 2018-01-07 14:34:57)

Re: AHK: класс окна Afx:%x:%x:%x:%x:%x

Вадя пишет:

При каждом перезапуске программы последний блок %x ее класса меняется.
Вопрос: насколько однозначно можно определить приложение по такой маске
Afx:%x:%x:%x:%x:.*

У меня вопрос, по сути, такой же, только чуть измененно-дополненный). Можно ли по маске определить, существует ли конкретное окно (приложение определять не нужно)?
Что-то типа:

x := "Afx:0000000140000000:8:0000000000010003:0000000000000000:*" 
ControlGet, OutputVar, Visible, , % x, ahk_class класс любого окна

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

3

Re: AHK: класс окна Afx:%x:%x:%x:%x:%x

SetTitleMatchMode Regex
title := "^Afx:\d{8}:\S+"

4 (изменено: Stepnoy, 2018-01-07 14:35:53)

Re: AHK: класс окна Afx:%x:%x:%x:%x:%x

В общем, то ли, то ли, как говорится).
Уже все варианты перепробовал, ни в какую не находит через classnn.

SetTitleMatchMode Regex
ControlGet, OutputVar, Visible, , Internet Explorer_Server*, ahk_class IEFrame
ControlGet, OutputVar, Visible, , Internet Explorer_Server[0-9][{1}, ahk_class IEFrame

Там обычно в конце 1 или 8.
Это как пример. Вариантов много было, с разными приложениями, ни один не сработал.

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

WinGet, ControlList, ControlList, A

И потом с помощью парсинга проверить все строки переменной.

Но первый способ явно попроще будет, только почему-то не срабатывает.