1,301

Re: AHK: Замена "Window Spy"

Да, так определяет правильно!
Не понял разницу Real Object и Simple Element.
Container  это Acc.accChildCount = true
Simple Element это Acc.accChildCount = false
Real Object = ???

Malcev пишет:

Добавил бы информацию о хендле окна от которого идет отсчет, его мы получаем

Ещё бы добавить попутно контрол от которого идет отсчет. Вспомнил случаи, когда путь до контрола менялся даже в процессе работы приложения, а внутри контрола оставался неизменным.

Malcev пишет:

Также информация о родительских окнах, типа "Parent child count" мне кажется лишней.

Ну это мелочи, иногда интересно какая позиция у элемента в каком списке.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,302

Re: AHK: Замена "Window Spy"

Malcev пишет:

Добавил бы во время просчета вместо старого значения пути надпись calculated... с анимированными точками

Есть надпись "   Wait...  " при клике по кнопке, в режиме автоматического определения как бы по всему окну понятно что идёт обновление, и не хотел нагружать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,303 (изменено: Malcev, 2020-04-04 04:57:31)

Re: AHK: Замена "Window Spy"

Если есть Id, то Simple Element, если нету, то Real Object.
Чтобы получить все пути от всех контролов, надо после каждой итерации смотреть к какому окну данный путь относится, добавлять в  массив и выбирать самый длинный.
Например:
1-ая итерация - хендл 0x1, путь 4
2 - хендл 0x2, путь 3.4
3 - хендл 0x1, путь 1.3.4
Тогда по итогу выводить 2 пути:
хендл 0x1 - путь 1.3.4
хендл 0x2 - путь 3.4

serzh82saratov пишет:

в режиме автоматического определения как бы по всему окну понятно что идёт обновление,

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

1,304

Re: AHK: Замена "Window Spy"

У Real Object оставил Id, хотя он всегда ноль как я вижу, но в AccExplorer этот параметр активен в отличии от Children.

Malcev пишет:

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

Сделал наглядно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,305 (изменено: serzh82saratov, 2020-04-04 14:18:52)

Re: AHK: Замена "Window Spy"

Malcev пишет:

1-ая итерация - хендл 0x1, путь 4
2 - хендл 0x2, путь 3.4
3 - хендл 0x1, путь 1.3.4

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,306

Re: AHK: Замена "Window Spy"

Я помню, что встречал, но не помню где.
Там вообще всякие чудеса возможны...
Функцию GetEnumIndex лучше на такую заменить:

GetEnumIndex(Acc)
{
   For Each, child in Acc_Children(Acc_Parent(Acc))
      if IsObject(child) and (Acc_Location(child) = Acc_Location(Acc)) and (child.accChildCount = Acc.accChildCount) and (child.accDefaultAction(0) = Acc.accDefaultAction(0)) and (child.accDescription(0) = Acc.accDescription(0)) and (child.accHelp(0) = Acc.accHelp(0)) and (child.accKeyboardShortcut(0) = Acc.accKeyboardShortcut(0)) and (child.accName(0) = Acc.accName(0)) and (child.accRole(0) = Acc.accRole(0)) and (child.accState(0) = Acc.accState(0)) and (child.accValue(0) = Acc.accValue(0))
         return A_Index
}

1,307

Re: AHK: Замена "Window Spy"

У Container тоже можно id=0 оставить.
0 - значит CHILDID_SELF.

1,308

Re: AHK: Замена "Window Spy"

Malcev пишет:

У Container тоже можно id=0 оставить.
0 - значит CHILDID_SELF.

Чтобы это значило...

Malcev пишет:

Я помню, что встречал, но не помню где.
Там вообще всякие чудеса возможны...

В общем гарантий что путь будет всегда правильный нет. Acc_GetPath возможно как то поправить.

Malcev пишет:

Функцию GetEnumIndex лучше на такую заменить:

А для чего все эти сравнения, это же по сути должен быть просто перебор.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,309

Re: AHK: Замена "Window Spy"

CHILDID_SELF значит, что информация касается самого объекта, а не элемента.
У элемента нумерация начиная с единицы.

serzh82saratov пишет:

В общем гарантий что путь будет всегда правильный нет. Acc_GetPath возможно как то поправить.

100% нету. Но минимизировать процент можно функцией из 1306 поста.

serzh82saratov пишет:

А для чего все эти сравнения, это же по сути должен быть просто перебор.

Есть объект контейнер, в котором еще 2 контейнера в последнем 3 элемента.
Получается следующее дерево - 1 -> 1.1|1.2 -> 1.2.1|1.2.2|1.2.3.
Допустим нам надо узнать путь. последнего элемента, в данном случае 1.2.3
Апи для узнавания индекса нету, поэтому мы получаем родительский объект для 3 элемента и начинаем перебирать его детей и сравнивать свойства с нашим элементом.
Если они идентичны, то можно предположить, что на текущей итерации и есть наш искомый элемент.
jethrow, сравнивал только позицию, что менее точно, чем сравнивать все параметры.
Но даже сравнивая все параметры можно получить неверный путь.
Как вариант можно при нахождении идентичных свойств, не возвращать номер итерации, а проверять дальше и если найдется несколько, то выводить несколько.
Возможны еще варианты, что параметры детского окна отличаются от параметров детского окна полученных от родительского, но это уже не разгадать.
Еще интересна штука с хромом.
AccExplorer определяет путь от главного окна, а у нас определяется путь от контрола. Почему так - мне пока не понятно.

1,310 (изменено: serzh82saratov, 2020-04-04 18:48:07)

Re: AHK: Замена "Window Spy"

Да, не продумано. А нет какого то указателя на объект, чтобы их сравнить, или  Object.Equals не про то.
С хромом не понял, у меня пути совпадают. Отсчёт от окна.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,311

Re: AHK: Замена "Window Spy"

Нету, поэтому майкрософт заменили MSAA на UIA.
Но так как для автохотки не написали удобный враппер - никто им не пользуется, в отличии от автоит.
Там через UIA много чего автоматизировано.

serzh82saratov пишет:

С хромом не понял, у меня пути совпадают. Отсчёт от окна.

А какая версия хрома? И какой путь показывается  в http://7fw.de/ipraw.php чтобы в accName был твой айпи?
У меня 4.1.1
Хотя от окна должен 4.1.2.2.2.1.1

1,312

Re: AHK: Замена "Window Spy"

Версия 80.0.3987.163 (Официальная сборка), (64 бит)
Не могу добиться чтобы айпи был, наведя на на цифры выделяет весь контрол.
От окна:

4  ▪  0x0206B8  ▪  Chrome_WidgetWin_1  ▪  chrome.exe

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,313

Re: AHK: Замена "Window Spy"

Malcev пишет:

Но так как для автохотки не написали удобный враппер - никто им не пользуется

А что по твоему надо улучшить на примере той библиотеки что в AhkSpy?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,314

Re: AHK: Замена "Window Spy"

Хрому надо WM_GETOBJECT посылать, либо запускать с --force-renderer-accessibility.

serzh82saratov пишет:

А что по твоему надо улучшить на примере той библиотеки что в AhkSpy?

Для начала её закончить, после чего показать примеры использования.
Но jethrow точно заниматься этим не будет.

1,315

Re: AHK: Замена "Window Spy"

Malcev пишет:

либо запускать с --force-renderer-accessibility.

Запускаю, в итоге в AhkSpy

CommandLine "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --enable-audio-service-sandbox

Malcev пишет:

Хрому надо WM_GETOBJECT посылать

Добавил

WM_GETOBJECT := 0x003D
SendMessage, WM_GETOBJECT, 0, 1, , ahk_id %ControlID%

перед

oPubObj.AccObj := {AccObj:Acc, child:child, WinID:WinID, ControlID:ControlID}

также как у тебя.
Chrome_RenderWidgetHostHWND берётся из скрытого окна другого процесса. Window Detective показал.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,316 (изменено: serzh82saratov, 2020-04-04 21:43:52)

Re: AHK: Замена "Window Spy"


1.1.1.1.1  ▪  0x0206B8  ▪  Chrome_WidgetWin_1  ▪  chrome.exe         
↓    1.1.1  ▪  0x0507CA  ▪  Chrome_RenderWidgetHostHWND  ▪  chrome.exe 

Если закомментировать все проверки доходит до главного окна.


GetEnumIndex(Acc)
{
   For Each, child in Acc_Children(Acc_Parent(Acc))
      if IsObject(child)    ;  and (Acc_Location(child) = Acc_Location(Acc)) and (child.accChildCount = Acc.accChildCount) and (child.accDefaultAction(0) = Acc.accDefaultAction(0)) and (child.accDescription(0) = Acc.accDescription(0)) and (child.accHelp(0) = Acc.accHelp(0)) and (child.accKeyboardShortcut(0) = Acc.accKeyboardShortcut(0)) and (child.accName(0) = Acc.accName(0)) and (child.accRole(0) = Acc.accRole(0)) and (child.accState(0) = Acc.accState(0)) and (child.accValue(0) = Acc.accValue(0))
         return A_Index
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,317

Re: AHK: Замена "Window Spy"

Ты был прав - мелькание при загрузке только отвлекает. Я бы убрал.
Мне кажется происходит неверное определение при первой итерации родительского объекта.
Так как мы подаем Acc, полученное с AccessibleObjectFromPoint и оно с хендлом главного окна.
После этого мы получаем accParent и он уже с хендлом дочернего окна, а должен быть с хендлом главного.

1,318

Re: AHK: Замена "Window Spy"

Malcev пишет:

Ты был прав - мелькание при загрузке только отвлекает. Я бы убрал.

Ну вот, а мне теперь понравилось.

Malcev пишет:

Мне кажется происходит неверное определение при первой итерации родительского объекта.

Как быть?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,319

Re: AHK: Замена "Window Spy"

Есть вероятность того что AccExplorer добывает путь с помощью UIA?
Или может WM_GETOBJECT как то надо грамотно отправлять, у него параметры какие то очень замысловатые.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,320

Re: AHK: Замена "Window Spy"

serzh82saratov пишет:

Ну вот, а мне теперь понравилось.

А зачем он постоянно мелькает, я имел в виду мелькнул один раз пока не загрузился.
Сейчас не стираются пути, если объект не найден.
Как бороться с Хромом не знаю.

1,321

Re: AHK: Замена "Window Spy"

Malcev пишет:

А зачем он постоянно мелькает

А ты в каком режиме пользуешься? Я, в Spot only Shift+Tab, так не мелькает, и не нагружает. Когда надо в динамике смотреть, то удержание клавиш не плохо справляется.
Или

Также можно зажать левую кнопку мыши над прямоугольником (слева от Button), и отпустить в нужном месте для определения.

Malcev пишет:

Сейчас не стираются пути, если объект не найден.

Так и задумано.

Malcev пишет:

Как бороться с Хромом не знаю.

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,322

Re: AHK: Замена "Window Spy"

Я использую в реальном времени.
Может для него стоит отключить мелькания?

serzh82saratov пишет:

Так и задумано.

А зачем нужен путь не искомого объекта?

1,323

Re: AHK: Замена "Window Spy"

Malcev пишет:

отключить мелькания?

Мелькания это когда поле серым становится?

Malcev пишет:

А зачем нужен путь не искомого объекта?

Оставляю прежний, чтобы снова не искать, по всему видно что объекта уже нет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,324

Re: AHK: Замена "Window Spy"

Malcev пишет:

А какая версия хрома? И какой путь показывается  в http://7fw.de/ipraw.php чтобы в accName был твой айпи?
У меня 4.1.1
Хотя от окна должен 4.1.2.2.2.1.1

Путь в AhkSpy совпадает с AccExplorer

+ открыть спойлер

https://i.imgur.com/wgH6z2G.png

до того момента как ему надо подняться на уровень выше, и тут он уже меняет свой же путь, он просто ищет сверху.
Видимо придётся сделать опцию, искать сверху дереву.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,325 (изменено: serzh82saratov, 2020-04-05 11:46:48)

Re: AHK: Замена "Window Spy"

Да и потом, по данным из AhkSpy 4.1.1 и хендлу Acc_Get находит правильно и быстро, стоит ли парится.


#SingleInstance Force
#Persistent
#NoEnv
SetBatchLines -1 

ComObjError(0)

Escape:: ExitApp

1::
	CoordMode, Mouse, Screen
	MouseGetPos, mx, my, w, ControlID, 2
	WM_GETOBJECT := 0x003D
	SendMessage, WM_GETOBJECT, 0, 1, , ahk_id %ControlID%
	Acc := Acc_ObjectFromPoint(child, mx, my)
	
	If !IsObject(Acc)
		Return

	acc_path_value := GetAccPath(Acc, hWnd) 
	MsgBox % acc_path_value "`n" Acc.accName(child) "`n" Acc.accValue(child) "`n" Acc_GetRoleText(Acc.accRole(child)) 
  
	Object := Acc_Get("Object", acc_path_value, 0, "ahk_id " hWnd) 
	MsgBox % acc_path_value "`n" Object.accName(child) "`n" Object.accValue(child) "`n" Acc_GetRoleText(Object.accRole(child))
	Return

GetAccPath(Acc, byref hwnd = "") {
	path := Acc_GetPath(Acc, arr)
	if path =
		Return "object not found"
	for k, v in arr
	{ 
		hwnd := v.Hwnd
	}
	Return path  
} 

Acc_GetPath(Acc, byref arr) {
    static DesktopHwnd := DllCall("User32.dll\GetDesktopWindow", "ptr")
	Local
	arr := []
	While Hwnd := Acc_WindowFromObject(Parent := Acc_Parent(Acc)) {
		t1 := GetEnumIndex(Acc)  
		If (PrHwnd != "" && Hwnd != PrHwnd)
		{
			PrHwnd := Format("0x{:x}", PrHwnd)
			WinGetClass, WinClass, ahk_id %PrHwnd%
			WinGet, ProcessName, ProcessName, ahk_id %PrHwnd%
			arr.push({Hwnd:PrHwnd,Path:SubStr(t2, 1, -1), WinClass:WinClass, ProcessName:ProcessName})
		}
		if (t1 = "" || Hwnd = DesktopHwnd)
		   break
		t2 := t1 "." t2
		PrHwnd := Hwnd 
		Acc := Parent 
	}
	return SubStr(t2, 1, -1)
}
 

GetEnumIndex(Acc)
{ 
   For Each, child in Acc_Children(Acc_Parent(Acc))
      if IsObject(child) and (Acc__Location(child) = Acc__Location(Acc)) and (child.accChildCount = Acc.accChildCount) and (child.accDefaultAction(0) = Acc.accDefaultAction(0)) and (child.accDescription(0) = Acc.accDescription(0)) and (child.accHelp(0) = Acc.accHelp(0)) and (child.accKeyboardShortcut(0) = Acc.accKeyboardShortcut(0)) and (child.accName(0) = Acc.accName(0)) and (child.accRole(0) = Acc.accRole(0)) and (child.accState(0) = Acc.accState(0)) and (child.accValue(0) = Acc.accValue(0))
         return A_Index
}

Acc__Location(Acc, ChildId=0) {
	Static x := 0, y := 0, w := 0, h := 0
	try Acc.accLocation(ComObj(0x4003,&x), ComObj(0x4003,&y), ComObj(0x4003,&w), ComObj(0x4003,&h), ChildId)
	return "x" NumGet(x,0,"int") " y" NumGet(y,0,"int") " w" NumGet(w,0,"int") " h" NumGet(h,0,"int")
}
  
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,326

Re: AHK: Замена "Window Spy"

4.04 - В acc Action добавил кнопку выполнить.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,327

Re: AHK: Замена "Window Spy"

serzh82saratov пишет:

Путь в AhkSpy совпадает с AccExplorer

Не думаю. После первой итерации acc.parent мы получаем другой хендл окна, который является невидимым.
Вот почему так происходит мне лично непонятно.

Мелькания это когда поле серым становится?

Да.
И не совсем верно определяется информация об acc объекте.
Например, кнопки в хроме вперед-назад не определяются (сравни с acc viewer).

1,328

Re: AHK: Замена "Window Spy"

Вот пишут:
https://bugs.chromium.org/p/chromium/is … ?id=773208
Интересно, как это в AccExplorer32 обошли?

1,329 (изменено: serzh82saratov, 2020-04-05 16:13:58)

Re: AHK: Замена "Window Spy"

Malcev пишет:

Не думаю. После первой итерации acc.parent мы получаем другой хендл окна, который является невидимым.

Не понял, я скриншот приводил в 1324, путь 4.1.1, тот же хэндл. Везде всё одинаково.
У меня на всех итерациях одно окно, на последней находит Chrome_WidgetWin_1, которое дочернее рабочему столу, и завершается, потому что GetEnumIndex в нём почему то не находит совпадений, или точнее находит только одного потомка. Далее всё равно бы завершилось, ведь следом идёт рабочий стол.

Malcev пишет:

И не совсем верно определяется информация об acc объекте.
Например, кнопки в хроме вперед-назад не определяются (сравни с acc viewer).

У меня всё одинаково

Malcev пишет:

Интересно, как это в AccExplorer32 обошли?

А по каким признакам ты понял что это обошли?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,330

Re: AHK: Замена "Window Spy"

Да, они тоже не обошли.
Они просто не показывают путь.
Зайди в хромке на какой-нибудь сайт, потом еще на какой-то, чтоб активировалась кнопка назад.
В AhkSpy она не покажется.

1,331

Re: AHK: Замена "Window Spy"

Malcev пишет:

Да, они тоже не обошли.
Они просто не показывают путь

Если идти от окна, то Acc_Get также найдёт и по длинному пути из дерева AccExplorer32, это одно тоже.
Только смысла от этого пути никакого, всё равно сначала надо будет найти окно вкладки хрома, путь до которой может в другой изменится, а далее от него плясать, а этот путь AhkSpy показывает. Так что хром это частный случай, или нет... Потому я и хотел иметь пути от контролов.

Malcev пишет:

Зайди в хромке на какой-нибудь сайт, потом еще на какой-то, чтоб активировалась кнопка назад.
В AhkSpy она не покажется.

Не, не получается, всегда определяет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,332

Re: AHK: Замена "Window Spy"

Ну да - это просто криво пофиксеный баг хрома (не выдавал get_accParent) ссылка в 1328 посте.

serzh82saratov пишет:

Не, не получается, всегда определяет.

То есть, у тебя при наведении мыши на кнопку "назад", accName = "назад"?
И как убрать постоянное мелькание?

1,333 (изменено: serzh82saratov, 2020-04-05 20:12:43)

Re: AHK: Замена "Window Spy"

Malcev пишет:

"назад", accName = "назад"?

Нет, такого никогда не выдаёт, просто обводит рамкой. И state всегда "невидимо  ▪  0x00008000".

Malcev пишет:

И как убрать постоянное мелькание?

Блин, мне так понравилось, могу спецом для тебя сделать опцию через

Если в пользовательской папке создать файл с именем Include.ahk, в него можно прописать свой код, действующий до показа окна. Для продолжения выполнения кода используйте GoTo IncludeLabel.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,334

Re: AHK: Замена "Window Spy"

Help

    Open user dir - Открыть папку с ини файлом, в ней же должны находится дополнения и инклуд.

Global Malcev_AccPanhNotBlink := 1
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,335

Re: AHK: Замена "Window Spy"

Отлично.
В режиме Spot Only перезапуск мне самому нравится, а вот в режиме реального времени нет.
Попробуй в реальном времени - мелькание тебе не мешает?

serzh82saratov пишет:

Нет, такого никогда не выдаёт, просто обводит рамкой. И state всегда "невидимо  ▪  0x00008000".

А у Accessible Info Viewer обводит и показывает.

1,336

Re: AHK: Замена "Window Spy"

Malcev пишет:

В режиме Spot Only перезапуск мне самому нравится, а вот в режиме реального времени нет.
Попробуй в реальном времени - мелькание тебе не мешает?

Да, надо подумать, может сделаю в зависимости от режима.

Malcev пишет:

А у Accessible Info Viewer обводит и показывает.


Да, но только потому что зажата левая кнопка!?
AhkSpy также показывает. Вот и ещё одно расследование.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,337 (изменено: Malcev, 2020-04-05 23:46:00)

Re: AHK: Замена "Window Spy"

Да, интересные фокусы с этим хромом.
Я бы еще при ненахождении объекта оставлял надпись, что объект не найден, сейчас она пропадает.
Кстати, есть еще интерфейс IAccessible2, там вроде есть uniqueID:
https://accessibility.linuxfoundation.o … 3b7e30ae3b
Но получить интерфейс похоже только через внешнюю dll можно.

1,338

Re: AHK: Замена "Window Spy"

Malcev пишет:

Да, интересные фокусы с этим хромом.
Я бы еще при ненахождении объекта оставлял надпись, что объект не найден, сейчас она пропадает.
Кстати, есть еще интерфейс IAccessible2, там вроде есть uniqueID:
https://accessibility.linuxfoundation.o … 3b7e30ae3b
Но получить интерфейс похоже только через внешнюю dll можно.

Тут вроде в файлах нет длл, и что то про IAccessible2.
https://www.autoitscript.com/forum/topi … ome-ff-ie/

Malcev пишет:

Я бы еще при ненахождении объекта оставлял надпись, что объект не найден, сейчас она пропадает.

В какие моменты, у меня вроде всегда остаётся.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,339 (изменено: Malcev, 2020-04-06 09:57:11)

Re: AHK: Замена "Window Spy"

Тут в исходниках лежит dll:
https://github.com/ThePacielloGroup/avi … /tag/2.0.3
Ее надо зарегестрировать.
Но сама программа, мало чего из интерфейса показывает - возможно урезана.

serzh82saratov пишет:

В какие моменты, у меня вроде всегда остаётся.

В этом клиенте при наведении на иконки соединения.
https://www.flashfxp.com/

1,340

Re: AHK: Замена "Window Spy"

Только там, что то не хочется ставить только из за этого.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,341

Re: AHK: Замена "Window Spy"

В режиме реального времени, если минимизировать любое окно, потом навести нм него мышкой, появится его превью.
После этого навести на это превью и надпись о том что объект не найден начинает мигать.

1,342 (изменено: serzh82saratov, 2020-04-06 15:46:21)

Re: AHK: Замена "Window Spy"

Acc_GetPath ничего не находит, при том что объект есть...
Хотя всё верно, у него родитель раб стол.
Мелькание убрал.

Аналогично добавил вывод пути контролов.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,343

Re: AHK: Замена "Window Spy"

Кстати не знаешь как в десятке показать окно поверх меню пуск, виртуальной клавиатуры...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,344

Re: AHK: Замена "Window Spy"

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

1,345

Re: AHK: Замена "Window Spy"

Решил ещё раз побороть мелькания при использовании якоря.
В активном режиме у меня не мелькает, ну может очень редко, если перед Redraw на 3341 если поставить sleep 100 то не замечал, в дальнейшем хочу проверять что перемотка страницы произошла, а потом перерисовывать.
Но не хочет нормально перерисовывать, если например активировать окно AhkSpy и понажимать 1 или Shift+Tab.

https://raw.githubusercontent.com/serzh … AhkSpy.ahk

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,346

Re: AHK: Замена "Window Spy"

На счет окон:
https://blog.adeltax.com/window-z-order-in-windows-10/

1,347

Re: AHK: Замена "Window Spy"

Хорошо расписано.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,348

Re: AHK: Замена "Window Spy"

И заметь, что у On-Screen Keyboard всего лишь второй уровень, а перекрывает все остальные.

1,349

Re: AHK: Замена "Window Spy"

serzh82saratov пишет:

Но не хочет нормально перерисовывать, если например активировать окно AhkSpy и понажимать 1 или Shift+Tab.

Не смотрел? По ссылке тестовый вариант.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,350

Re: AHK: Замена "Window Spy"

Да, такой же результат, как и у тебя.

1,351

Re: AHK: Замена "Window Spy"

У меня глюк.
Запускаем ahkspy в лайв режиме, после чего запускаем Хром через меню старт.
В итоге ahkspy зависает.

1,352

Re: AHK: Замена "Window Spy"

У меня такого нет.
Режим и настройки при этом в ahkspy какие?
Dynamic control path, Dynamic accesible path...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,353 (изменено: Malcev, 2020-04-18 13:47:24)

Re: AHK: Замена "Window Spy"

При любых настройках.
Допустим убираем все галочки в view settings.
1) Запускаем ahkspy
2) Запускаем хром или фаерфокс из меню старта
3) закрываем хром
4) снова запускаем хром из меню старта
Ahkspy виснет.
Но если вызвать снова меню старта, то начинает работать.
То есть ловит какие-то глюки при появлении always on top окон.

1,354

Re: AHK: Замена "Window Spy"

Не получается, меню старта - это меню пуск?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,355

Re: AHK: Замена "Window Spy"

Да.

ahk_class Windows.UI.Core.CoreWindow ahk_exe ShellExperienceHost

Попробуй окон 10 хрома открыть через меню пуск.

1,356

Re: AHK: Замена "Window Spy"

Запустил 14, никаких тормозов.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,357 (изменено: Malcev, 2020-04-18 20:43:20)

Re: AHK: Замена "Window Spy"

А если так.
Создай скрипт

f11::click

После чего зайди в меню пуск, наведи на хром и нажми f11.
Баги в функции AccInfoUnderMouse.
Надо везде, где можно  try ставить.

1,358

Re: AHK: Замена "Window Spy"

Не вижу такого.

Malcev пишет:

Надо везде, где можно  try ставить.

Уже есть ComObjError(false).
try не выводит ошибку, у тебя ошибка вываливается?

Попробуй UIA в меню отключить.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,359 (изменено: Malcev, 2020-04-18 21:30:17)

Re: AHK: Замена "Window Spy"

У меня вылетает из-за этой строки

oPubObj.Acc := {AccObj:Acc, child:child, WinID:WinID, ControlID:ControlID}

Если ее закомментировать, то вроде работает.
Хотя нет, все-равно глючит, но реже.

1,360

Re: AHK: Замена "Window Spy"

С oPubObj могут быть "непонятные" проблемы, но если всё равно глючит, то что то ещё "вылазит", или просто виснет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,361

Re: AHK: Замена "Window Spy"

Убрал ComObjError(false), рааставил try catch - ошибок явных нету.
У меня ahkspy зависает конкретно из-за

oPubObj.Acc := {AccObj:Acc

1,362

Re: AHK: Замена "Window Spy"

А если на 137 так сделать?


; ObjRegisterActive(oPubObj, oPubObjGUID := CreateGUID())
oPubObj := {}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,363

Re: AHK: Замена "Window Spy"

Не, так же виснет.

1,364

Re: AHK: Замена "Window Spy"

Получается добавление Acc объекта в массив вызывает зависание?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,365

Re: AHK: Замена "Window Spy"

В 4.12 как?

Добавил сворачивание по Escape, негативную подсветку по кнопкам flash.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,366

Re: AHK: Замена "Window Spy"

Подвисает гораздо реже.
А что исправил?

1,367

Re: AHK: Замена "Window Spy"

oPubObj.Acc := {AccObj:Object(Acc)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,368

Re: AHK: Замена "Window Spy"

В последней версии опять всё глючит.
Мне кажется проблема в том, что нет проверки на существование окна.
У тебя этого глюка нету, наверное из-за большого RangeTimer.
У меня он 100.

1,369

Re: AHK: Замена "Window Spy"

Malcev пишет:

У тебя этого глюка нету, наверное из-за большого RangeTimer.
У меня он 100.

Нет, у меня такой же.

Malcev пишет:

Мне кажется проблема в том, что нет проверки на существование окна.

А подробнее.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,370

Re: AHK: Замена "Window Spy"

В последнем апдейте перестало часто подвисать, но всё-равно подвисает.

serzh82saratov пишет:

А подробнее.

Ну например мы получаем acc path у объекта, которого уже не сущуствует или который не виден.

1,371

Re: AHK: Замена "Window Spy"

Malcev пишет:

При любых настройках.
Допустим убираем все галочки в view settings.

То есть всё таки Dynamic accesible path.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,372

Re: AHK: Замена "Window Spy"

Нет, просто с Dynamic accesible path быстрее этот глюк поймать.

1,373

Re: AHK: Замена "Window Spy"

Как исправить, везде TRY расставить?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,374

Re: AHK: Замена "Window Spy"

Нет. Полагаю нужно ставить хук на EVENT_OBJECT_CLOAKED.

1,375

Re: AHK: Замена "Window Spy"

Примерчик использования есть, не нашёл. И из описания не понятно как это поможет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,376 (изменено: Malcev, 2020-04-21 21:51:49)

Re: AHK: Замена "Window Spy"

Пример использования как и всегда SetWinEventHook.
То что это поможет, это лишь мои выводы из тестов.
Как я понимаю у Iaccessible происходит глюк при выполнении какого-либо метода либо свойства если окно перешло в DWMWA_CLOAKED.
https://docs.microsoft.com/en-us/window … wattribute
Тестировал я так:

f11::
acc:=Acc_ObjectFromPoint(ChildId)
msgbox
msgbox % Acc.accName(ChildId)
return

Наводим мышкой на меню старта, нажимаем f11, нажимаем ОК - скрипт зависает.
Если же сделать так, то всё будет ОК:

f11::
acc:=Acc_ObjectFromPoint(ChildId)
msgbox % Acc.accName(ChildId)
return

И вроде нашел баги в самих функциях acc.
Вот так возвращать объект неправильно:

Return ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")

Правильно так:

ComObject := ComObject(9, pacc, 1), ObjAddRef(pacc)
Return ComObject, _idChild_:=NumGet(varChild,8,"UInt")

Так как, только так из скрипта можно нормально выйти.
Ну и соответственно еще надо возвращать pacc и делать ему objrelease.

1,377

Re: AHK: Замена "Window Spy"

Пока исправлять не надо.
Я еще потестил и пришел к выводу, что какой-то баг с ComObj.
Запостил на оффоруме.
https://www.autohotkey.com/boards/viewt … mp;t=74960

1,378

Re: AHK: Замена "Window Spy"

Окно почему то определяется как видимое.

+ открыть спойлер

1::
	DetectHiddenWindows, On
	MouseGetPos,  ,  , WinID
	 
	DllCall("LoadLibrary","Str","oleacc","Ptr")  
	DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)

	Acc := ComObject(9, pacc, 1)
	ChildId := NumGet(varChild,8,"UInt")
	ObjAddRef(pacc)
	ObjRelease(pacc)

	MsgBox % WinID

	WinGet, WinStyle, ExStyle, % "ahk_id" WinID
	Exist := WinExist("ahk_id" WinID)
	Visible := DllCall("IsWindowVisible", "Ptr", WinID)  

	MsgBox 0x4, ,  % "`nisObject " isObject(Acc) 
		. "`nWinStyle " WinStyle 
		. "`nExist " Exist 
		. "`nVisible " Visible 

	IfMsgBox Yes, {
		msgbox % Acc.accName(ChildId)
	} Else IfMsgBox No, {
		MsgBox ExitApp  
		ObjRelease(Acc)
		ExitApp
	}
	ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,379

Re: AHK: Замена "Window Spy"

Оно и есть видимое.

1,380

Re: AHK: Замена "Window Spy"


msgbox % DllCall("FindWindowEx", "ptr", 0, "ptr", 0, "str", "Windows.UI.Core.CoreWindow", "str", "Start")
DetectHiddenWindows, On
msgbox % WinExist("Start")

А зачем DetectHiddenWindows?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,381

Re: AHK: Замена "Window Spy"

Чтобы не было лишних вопросов и предложений.
При том у автохотки cloaked window считается за hidden.

1,382

Re: AHK: Замена "Window Spy"

https://www.autohotkey.com/boards/viewt … 60#p324424
Ничего себе!
Это ты можешь так весь интерфейс расписать?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,383

Re: AHK: Замена "Window Spy"

Также уходит в ожидание окна.
После ToolTip % hwnd, скрой окно, msgbox появится только после появления окна.


Send {LWin}
sleep 1000

ToolTip % hwnd := DllCall("FindWindowEx", "ptr", 0, "ptr", 0, "str", "Windows.UI.Core.CoreWindow", "str", "Начальный экран", "ptr")
DllCall("LoadLibrary","str","oleacc","ptr")
VarSetCapacity(IID_IAccessible, 16)
DllCall("ole32\CLSIDFromString", "wstr", "{618736e0-3c3d-11cf-810c-00aa00389b71}", "ptr", &IID_IAccessible)
DllCall("oleacc\AccessibleObjectFromWindow", "ptr", hwnd, "uint", OBJID_CLIENT := 0xFFFFFFFC, "ptr", &IID_IAccessible, "ptr*", pacc)

Sleep 2111
VarSetCapacity(variant, 8+A_PtrSize*2, 0)
NumPut(VT_I4 := 3, variant, 0, "ushort")
ToolTip Запускаем
if (A_PtrSize = 4)
   DllCall(NumGet(NumGet(pacc+0)+10*A_PtrSize), "ptr", pacc, "int64", NumGet(variant, 0, "int64"), "int64", NumGet(variant, 8, "int64"), "ptr*", name)   ; get_accName
else
   DllCall(NumGet(NumGet(pacc+0)+10*A_PtrSize), "ptr", pacc, "ptr", &variant, "ptr*", name)   ; get_accName
ToolTip Выводим
msgbox % StrGet(name)
exitapp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,384 (изменено: Malcev, 2020-04-24 05:05:55)

Re: AHK: Замена "Window Spy"

serzh82saratov пишет:

Это ты можешь так весь интерфейс расписать?

Не знаю, не пробовал, всё зависит от подводных камней - например как этот.
Действительно, ComObject и автохотки, похоже не виноваты.
Я попробовал написать на автоит - результат такой же.

Send("{LWIN}")
Sleep(500)

$hwnd = DllCall("user32.dll", "HWND", "FindWindow", "str", "Windows.UI.Core.CoreWindow", "str", "Start")
$hOLEACC = DllOpen("oleacc.dll")
$IID_IAccessible = DllStructCreate("int;short;short;byte[8]")
DllCall("Ole32.dll", "int", "CLSIDFromString", "WSTR", '{618736e0-3c3d-11cf-810c-00aa00389b71}', "struct*", $IID_IAccessible)
$pacc = DllCall($hOLEACC, 'ptr', 'AccessibleObjectFromWindow', 'hwnd', $hWnd[0], 'dword', 0xFFFFFFFC, 'ptr', DllStructGetPtr($IID_IAccessible), 'ptr*', 0)
$acc = DllCall("kernel32.dll", "none", "RtlMoveMemory", "idispatch*", 0, "ptr*", $pacc[4], "dword", 4+(4*@AutoItX64))

Send("{LWIN}")
Sleep(500)

$name = $acc[1].accname(0)
msgbox("","",$name)

1,385

Re: AHK: Замена "Window Spy"

Может в Accessible можно задавать таймаут ожидания?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,386

Re: AHK: Замена "Window Spy"

Кстати этот поток не прерывается даже по DllCall SetTimer, который на моей памяти прерывал во всех других случаях.


Send {LWin}
sleep 1000

ToolTip % hwnd := DllCall("FindWindowEx", "ptr", 0, "ptr", 0, "str", "Windows.UI.Core.CoreWindow", "str", "Начальный экран", "ptr")
DllCall("LoadLibrary","str","oleacc","ptr")
VarSetCapacity(IID_IAccessible, 16)
DllCall("ole32\CLSIDFromString", "wstr", "{618736e0-3c3d-11cf-810c-00aa00389b71}", "ptr", &IID_IAccessible)
DllCall("oleacc\AccessibleObjectFromWindow", "ptr", hwnd, "uint", OBJID_CLIENT := 0xFFFFFFFC, "ptr", &IID_IAccessible, "ptr*", pacc)

Sleep 2111
VarSetCapacity(variant, 8+A_PtrSize*2, 0)
NumPut(VT_I4 := 3, variant, 0, "ushort")

ToolTip Запускаем
DllCall("SetTimer", Ptr, A_ScriptHwnd, Ptr, 1, UInt, 500, Ptr, RegisterCallback("reset", "CDecl Fast"))

if (A_PtrSize = 4)
   DllCall(NumGet(NumGet(pacc+0)+10*A_PtrSize), "ptr", pacc, "int64", NumGet(variant, 0, "int64"), "int64", NumGet(variant, 8, "int64"), "ptr*", name)   ; get_accName
else
   DllCall(NumGet(NumGet(pacc+0)+10*A_PtrSize), "ptr", pacc, "ptr", &variant, "ptr*", name)   ; get_accName
   
ToolTip Выводим
msgbox % StrGet(name)
exitapp


reset() {
	DllCall("KillTimer", Ptr, A_ScriptHwnd, Ptr, 1)
	MsgBox reset  
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,387 (изменено: Malcev, 2020-04-24 15:48:01)

Re: AHK: Замена "Window Spy"

С таймером так можно:

Send {LWin}
sleep 500

hwnd := DllCall("FindWindowEx", "ptr", 0, "ptr", 0, "str", "Windows.UI.Core.CoreWindow", "str", "Start", "ptr")
DllCall("LoadLibrary","str","oleacc","ptr")
VarSetCapacity(IID_IAccessible, 16)
DllCall("ole32\CLSIDFromString", "wstr", "{618736e0-3c3d-11cf-810c-00aa00389b71}", "ptr", &IID_IAccessible)
DllCall("oleacc\AccessibleObjectFromWindow", "ptr", hwnd, "uint", OBJID_CLIENT := 0xFFFFFFFC, "ptr", &IID_IAccessible, "ptr*", pacc)

Send {LWin}
Sleep 500

UnFreeze(200, Func("MyFunc"))

VarSetCapacity(variant, 8+A_PtrSize*2, 0)
NumPut(VT_I4 := 3, variant, 0, "ushort")
if (A_PtrSize = 4)
   DllCall(NumGet(NumGet(pacc+0)+10*A_PtrSize), "ptr", pacc, "int64", NumGet(variant, 0, "int64"), "int64", NumGet(variant, 8, "int64"), "ptr*", name)   ; get_accName
else
   DllCall(NumGet(NumGet(pacc+0)+10*A_PtrSize), "ptr", pacc, "ptr", &variant, "ptr*", name)   ; get_accName
msgbox ok

MyFunc()
{
   Send {LWin}
}


UnFreeze(timeOut, userFunc)  {
   static SYNCHRONIZE := 0x100000, hGui, oInfo := {}
        , _ := OnMessage( msg := DllCall("RegisterWindowMessage", Str, "WM_INFO"), Func("WM_INFO").Bind(oInfo) )
   if !hGui
      Gui, New, +hwndhGui
   hProc := DllCall("OpenProcess", UInt, SYNCHRONIZE, UInt, 0, UInt, DllCall("GetCurrentProcessId"), Ptr)
   pPtr := GetProcAddr(hProc, hGui, msg, timeOut)
   oInfo.func := userFunc, oInfo.hProc := hProc
   DllCall("CreateThread", Ptr, 0, Ptr, 0, Ptr, pPtr, Ptr, 0, UInt, 0, Ptr, 0)
}

WM_INFO(oInfo)
{
   DllCall("CloseHandle", Ptr, oInfo.hProc)
   oInfo.func.Call()
}

GetProcAddr(Handle, hWnd, Msg, Timeout=-1)
{  ; на основе http://forum.script-coding.com/viewtopic.php?pid=56073#p56073
   static MEM_COMMIT := 0x1000, PAGE_EXECUTE_READWRITE := 0x40
   ptr := DllCall("VirtualAlloc", Ptr, 0, Ptr, A_PtrSize = 4 ? 49 : 85, UInt, MEM_COMMIT, UInt, PAGE_EXECUTE_READWRITE, Ptr)
   , hModule := DllCall("GetModuleHandle", Str, "kernel32.dll", Ptr)
   , pWaitForSingleObject := DllCall("GetProcAddress", Ptr, hModule, AStr, "WaitForSingleObject", Ptr)
   , hModule := DllCall("GetModuleHandle", Str, "user32.dll", Ptr)
   , pSendMessageW := DllCall("GetProcAddress", Ptr, hModule, AStr, "SendMessageW", Ptr)
   , NumPut(pWaitForSingleObject, ptr*1)
   , NumPut(pSendMessageW, ptr + A_PtrSize)
   if (A_PtrSize = 4)  {
      NumPut(0x68, ptr + 8, "UChar")
      , NumPut(Timeout, ptr + 9, "UInt"), NumPut(0x68, ptr + 13, "UChar")
      , NumPut(Handle, ptr + 14), NumPut(0x15FF, ptr + 18, "UShort")
      , NumPut(ptr, ptr + 20), NumPut(0x6850, ptr + 24, "UShort")
      , NumPut(Handle, ptr + 26), NumPut(0x68, ptr + 30, "UChar")
      , NumPut(Msg, ptr + 31, "UInt"), NumPut(0x68, ptr + 35, "UChar")
      , NumPut(hWnd, ptr + 36), NumPut(0x15FF, ptr + 40, "UShort")
      , NumPut(ptr+4, ptr + 42), NumPut(0xC2, ptr + 46, "UChar"), NumPut(4, ptr + 47, "UShort")
   }
   else  {
      NumPut(0x53, ptr + 16, "UChar")
      , NumPut(0x20EC8348, ptr + 17, "UInt"), NumPut(0xBACB8948, ptr + 21, "UInt")
      , NumPut(Timeout, ptr + 25, "UInt"), NumPut(0xB948, ptr + 29, "UShort")
      , NumPut(Handle, ptr + 31), NumPut(0x15FF, ptr + 39, "UShort")
      , NumPut(-45, ptr + 41, "UInt"), NumPut(0xB849, ptr + 45, "UShort")
      , NumPut(Handle, ptr + 47), NumPut(0xBA, ptr + 55, "UChar")
      , NumPut(Msg, ptr + 56, "UInt"), NumPut(0xB948, ptr + 60, "UShort")
      , NumPut(hWnd, ptr + 62), NumPut(0xC18941, ptr + 70, "UInt")
      , NumPut(0x15FF, ptr + 73, "UShort"), NumPut(-71, ptr + 75, "UInt")
      , NumPut(0x20C48348, ptr + 79, "UInt"), NumPut(0xC35B, ptr + 83, "UShort")
   }
   return ptr + A_PtrSize*2
}

1,388

Re: AHK: Замена "Window Spy"

Интересный пример таймера, но как это использовать, get_accName продолжает ожидание, хотя теперь и возможно закрыть скрипт, но нам надо продолжать работу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,389

Re: AHK: Замена "Window Spy"

Это лучше teadrinkera спрашивать.
Он этот пример когда-то привел.

1,390

Re: AHK: Замена "Window Spy"

Я не очень понял, в чём вопрос. У меня на десятке этот код работает без проблем.

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

1,391 (изменено: Malcev, 2020-04-25 00:58:31)

Re: AHK: Замена "Window Spy"

Тут от версии десятки зависит. На 1809 не работает.
А такой код срабатывает только первый раз.
При повторном нажатии f11 msgbox timer не выходит.

f11::
Send {LWin}
sleep 500

hwnd := DllCall("FindWindowEx", "ptr", 0, "ptr", 0, "str", "Windows.UI.Core.CoreWindow", "str", "Start", "ptr")
DllCall("LoadLibrary","str","oleacc","ptr")
VarSetCapacity(IID_IAccessible, 16)
DllCall("ole32\CLSIDFromString", "wstr", "{618736e0-3c3d-11cf-810c-00aa00389b71}", "ptr", &IID_IAccessible)
DllCall("oleacc\AccessibleObjectFromWindow", "ptr", hwnd, "uint", OBJID_CLIENT := 0xFFFFFFFC, "ptr", &IID_IAccessible, "ptr*", pacc)

Send {LWin}
Sleep 500

UnFreeze(200, Func("MyFunc"))

VarSetCapacity(variant, 8+A_PtrSize*2, 0)
NumPut(VT_I4 := 3, variant, 0, "ushort")
if (A_PtrSize = 4)
   DllCall(NumGet(NumGet(pacc+0)+10*A_PtrSize), "ptr", pacc, "int64", NumGet(variant, 0, "int64"), "int64", NumGet(variant, 8, "int64"), "ptr*", name)   ; get_accName
else
   DllCall(NumGet(NumGet(pacc+0)+10*A_PtrSize), "ptr", pacc, "ptr", &variant, "ptr*", name)   ; get_accName
msgbox ok

MyFunc()
{
   msgbox timer
   Send {LWin}
}


UnFreeze(timeOut, userFunc)  {
   static SYNCHRONIZE := 0x100000, hGui, oInfo := {}
        , _ := OnMessage( msg := DllCall("RegisterWindowMessage", Str, "WM_INFO"), Func("WM_INFO").Bind(oInfo) )
   if !hGui
      Gui, New, +hwndhGui
   hProc := DllCall("OpenProcess", UInt, SYNCHRONIZE, UInt, 0, UInt, DllCall("GetCurrentProcessId"), Ptr)
   pPtr := GetProcAddr(hProc, hGui, msg, timeOut)
   oInfo.func := userFunc, oInfo.hProc := hProc
   DllCall("CreateThread", Ptr, 0, Ptr, 0, Ptr, pPtr, Ptr, 0, UInt, 0, Ptr, 0)
}

WM_INFO(oInfo)
{
   DllCall("CloseHandle", Ptr, oInfo.hProc)
   oInfo.func.Call()
}

GetProcAddr(Handle, hWnd, Msg, Timeout=-1)
{  ; на основе http://forum.script-coding.com/viewtopic.php?pid=56073#p56073
   static MEM_COMMIT := 0x1000, PAGE_EXECUTE_READWRITE := 0x40
   ptr := DllCall("VirtualAlloc", Ptr, 0, Ptr, A_PtrSize = 4 ? 49 : 85, UInt, MEM_COMMIT, UInt, PAGE_EXECUTE_READWRITE, Ptr)
   , hModule := DllCall("GetModuleHandle", Str, "kernel32.dll", Ptr)
   , pWaitForSingleObject := DllCall("GetProcAddress", Ptr, hModule, AStr, "WaitForSingleObject", Ptr)
   , hModule := DllCall("GetModuleHandle", Str, "user32.dll", Ptr)
   , pSendMessageW := DllCall("GetProcAddress", Ptr, hModule, AStr, "SendMessageW", Ptr)
   , NumPut(pWaitForSingleObject, ptr*1)
   , NumPut(pSendMessageW, ptr + A_PtrSize)
   if (A_PtrSize = 4)  {
      NumPut(0x68, ptr + 8, "UChar")
      , NumPut(Timeout, ptr + 9, "UInt"), NumPut(0x68, ptr + 13, "UChar")
      , NumPut(Handle, ptr + 14), NumPut(0x15FF, ptr + 18, "UShort")
      , NumPut(ptr, ptr + 20), NumPut(0x6850, ptr + 24, "UShort")
      , NumPut(Handle, ptr + 26), NumPut(0x68, ptr + 30, "UChar")
      , NumPut(Msg, ptr + 31, "UInt"), NumPut(0x68, ptr + 35, "UChar")
      , NumPut(hWnd, ptr + 36), NumPut(0x15FF, ptr + 40, "UShort")
      , NumPut(ptr+4, ptr + 42), NumPut(0xC2, ptr + 46, "UChar"), NumPut(4, ptr + 47, "UShort")
   }
   else  {
      NumPut(0x53, ptr + 16, "UChar")
      , NumPut(0x20EC8348, ptr + 17, "UInt"), NumPut(0xBACB8948, ptr + 21, "UInt")
      , NumPut(Timeout, ptr + 25, "UInt"), NumPut(0xB948, ptr + 29, "UShort")
      , NumPut(Handle, ptr + 31), NumPut(0x15FF, ptr + 39, "UShort")
      , NumPut(-45, ptr + 41, "UInt"), NumPut(0xB849, ptr + 45, "UShort")
      , NumPut(Handle, ptr + 47), NumPut(0xBA, ptr + 55, "UChar")
      , NumPut(Msg, ptr + 56, "UInt"), NumPut(0xB948, ptr + 60, "UShort")
      , NumPut(hWnd, ptr + 62), NumPut(0xC18941, ptr + 70, "UInt")
      , NumPut(0x15FF, ptr + 73, "UShort"), NumPut(-71, ptr + 75, "UInt")
      , NumPut(0x20C48348, ptr + 79, "UInt"), NumPut(0xC35B, ptr + 83, "UShort")
   }
   return ptr + A_PtrSize*2
}

Если же убрать OnMessage( msg := DllCall("RegisterWindowMessage", Str, "WM_INFO"), Func("WM_INFO").Bind(oInfo) ) из static, то при повторном нажатии f11 будет выходить уже 2 msgbox timer. И т.д.
И кстати, ты не разбирался откуда Александр_ взял все эти данные NumPut(0x53, ptr + 16, "UChar")...?

1,392 (изменено: teadrinker, 2020-04-25 03:03:53)

Re: AHK: Замена "Window Spy"

У меня второй раз даже просто так не работает:

f11::UnFreeze(200, Func("MyFunc"))

MyFunc()
{
   msgbox timer
}


UnFreeze(timeOut, userFunc)  {
   static SYNCHRONIZE := 0x100000, hGui, oInfo := {}
        , _ := OnMessage( msg := DllCall("RegisterWindowMessage", Str, "WM_INFO"), Func("WM_INFO").Bind(oInfo) )
   if !hGui
      Gui, New, +hwndhGui
   hProc := DllCall("OpenProcess", UInt, SYNCHRONIZE, UInt, 0, UInt, DllCall("GetCurrentProcessId"), Ptr)
   pPtr := GetProcAddr(hProc, hGui, msg, timeOut)
   oInfo.func := userFunc, oInfo.hProc := hProc
   DllCall("CreateThread", Ptr, 0, Ptr, 0, Ptr, pPtr, Ptr, 0, UInt, 0, Ptr, 0)
}

WM_INFO(oInfo)
{
   DllCall("CloseHandle", Ptr, oInfo.hProc)
   oInfo.func.Call()
}

GetProcAddr(Handle, hWnd, Msg, Timeout=-1)
{  ; на основе http://forum.script-coding.com/viewtopic.php?pid=56073#p56073
   static MEM_COMMIT := 0x1000, PAGE_EXECUTE_READWRITE := 0x40
   ptr := DllCall("VirtualAlloc", Ptr, 0, Ptr, A_PtrSize = 4 ? 49 : 85, UInt, MEM_COMMIT, UInt, PAGE_EXECUTE_READWRITE, Ptr)
   , hModule := DllCall("GetModuleHandle", Str, "kernel32.dll", Ptr)
   , pWaitForSingleObject := DllCall("GetProcAddress", Ptr, hModule, AStr, "WaitForSingleObject", Ptr)
   , hModule := DllCall("GetModuleHandle", Str, "user32.dll", Ptr)
   , pSendMessageW := DllCall("GetProcAddress", Ptr, hModule, AStr, "SendMessageW", Ptr)
   , NumPut(pWaitForSingleObject, ptr*1)
   , NumPut(pSendMessageW, ptr + A_PtrSize)
   if (A_PtrSize = 4)  {
      NumPut(0x68, ptr + 8, "UChar")
      , NumPut(Timeout, ptr + 9, "UInt"), NumPut(0x68, ptr + 13, "UChar")
      , NumPut(Handle, ptr + 14), NumPut(0x15FF, ptr + 18, "UShort")
      , NumPut(ptr, ptr + 20), NumPut(0x6850, ptr + 24, "UShort")
      , NumPut(Handle, ptr + 26), NumPut(0x68, ptr + 30, "UChar")
      , NumPut(Msg, ptr + 31, "UInt"), NumPut(0x68, ptr + 35, "UChar")
      , NumPut(hWnd, ptr + 36), NumPut(0x15FF, ptr + 40, "UShort")
      , NumPut(ptr+4, ptr + 42), NumPut(0xC2, ptr + 46, "UChar"), NumPut(4, ptr + 47, "UShort")
   }
   else  {
      NumPut(0x53, ptr + 16, "UChar")
      , NumPut(0x20EC8348, ptr + 17, "UInt"), NumPut(0xBACB8948, ptr + 21, "UInt")
      , NumPut(Timeout, ptr + 25, "UInt"), NumPut(0xB948, ptr + 29, "UShort")
      , NumPut(Handle, ptr + 31), NumPut(0x15FF, ptr + 39, "UShort")
      , NumPut(-45, ptr + 41, "UInt"), NumPut(0xB849, ptr + 45, "UShort")
      , NumPut(Handle, ptr + 47), NumPut(0xBA, ptr + 55, "UChar")
      , NumPut(Msg, ptr + 56, "UInt"), NumPut(0xB948, ptr + 60, "UShort")
      , NumPut(hWnd, ptr + 62), NumPut(0xC18941, ptr + 70, "UInt")
      , NumPut(0x15FF, ptr + 73, "UShort"), NumPut(-71, ptr + 75, "UInt")
      , NumPut(0x20C48348, ptr + 79, "UInt"), NumPut(0xC35B, ptr + 83, "UShort")
   }
   return ptr + A_PtrSize*2
}

Видимо, с кодом что-то не совсем так, надо посмотреть.
Версия 10.0.18362.

Malcev пишет:

откуда Александр_ взял все эти данные NumPut(0x53, ptr + 16, "UChar")

Так понимаю, из отладчика, это машинный код запуска функций WaitForSingleObject и SendMessageW в новом потоке.
Подозреваю, что вместо машинного кода можно использовать просто адрес функции, полученный через RegisterCallback(), надо проверить.

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

1,393 (изменено: teadrinker, 2020-04-25 03:16:18)

Re: AHK: Замена "Window Spy"

Вот похожая конструкция без машинного кода:

F11::UnFreeze(200, Func("MyFunc"))

MyFunc()
{
   msgbox timer
}

UnFreeze(timeout, userFunc) {
   static oInfo := {}
        , msg := DllCall("RegisterWindowMessage", "Str", "WM_INFO")
        , _ := OnMessage(msg, Func("WM_INFO").Bind(oInfo))
   params := {msg: msg, timeout: timeout}
   pObj := Object(params)
   pFunc := RegisterCallback("CreateTimer", "F", 0, pObj)
   oInfo.func := userFunc, oInfo.pObj := pObj
   oInfo.hThread := DllCall("CreateThread", "Ptr", 0, "Ptr", 0, "Ptr", pFunc, "Ptr", 0, "UInt", 0, "Ptr", 0)
}

CreateTimer() {
   obj := Object(A_EventInfo)
   DllCall("SetTimer", "Ptr", A_ScriptHwnd, "Ptr", 1, "UInt", obj.timeout, "Ptr", RegisterCallback("MyTimer", "F", 0, obj.msg))
}

MyTimer() {
   DllCall("KillTimer", "Ptr", A_ScriptHwnd, "Ptr", 1)
   DllCall("SendMessage", "Ptr", A_ScriptHwnd, "UInt", A_EventInfo, "Ptr", 0, "Ptr", 0)
}

WM_INFO(oInfo)
{
   DllCall("CloseHandle", "Ptr", oInfo.hThread)
   ObjRelease(oInfo.pObj)
   oInfo.func.Call()
}

Проверьте, размораживает, или нет.

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

1,394

Re: AHK: Замена "Window Spy"

Исправленный первоначальный вариант:

f11::UnFreeze(200, Func("MyFunc"))

MyFunc()
{
   msgbox timer
}


UnFreeze(timeOut, userFunc)  {
   static SYNCHRONIZE := 0x100000, oInfo := {}
        , msg := DllCall("RegisterWindowMessage", "Str", "WM_INFO")
        , _ := OnMessage(msg, Func("WM_INFO").Bind(oInfo))
   hProc := DllCall("OpenProcess", UInt, SYNCHRONIZE, UInt, 0, UInt, DllCall("GetCurrentProcessId"), Ptr)
   pPtr := GetProcAddr(hProc, A_ScriptHwnd, msg, timeOut)
   oInfo.func := userFunc, oInfo.hProc := hProc
   DllCall("CreateThread", Ptr, 0, Ptr, 0, Ptr, pPtr, Ptr, 0, UInt, 0, Ptr, 0)
}

WM_INFO(oInfo)
{
   DllCall("CloseHandle", Ptr, oInfo.hProc)
   oInfo.func.Call()
}

GetProcAddr(Handle, hWnd, Msg, Timeout=-1)
{  ; на основе http://forum.script-coding.com/viewtopic.php?pid=56073#p56073
   static MEM_COMMIT := 0x1000, PAGE_EXECUTE_READWRITE := 0x40
   ptr := DllCall("VirtualAlloc", Ptr, 0, Ptr, A_PtrSize = 4 ? 49 : 85, UInt, MEM_COMMIT, UInt, PAGE_EXECUTE_READWRITE, Ptr)
   , hModule := DllCall("GetModuleHandle", Str, "kernel32.dll", Ptr)
   , pWaitForSingleObject := DllCall("GetProcAddress", Ptr, hModule, AStr, "WaitForSingleObject", Ptr)
   , hModule := DllCall("GetModuleHandle", Str, "user32.dll", Ptr)
   , pSendMessageW := DllCall("GetProcAddress", Ptr, hModule, AStr, "SendMessageW", Ptr)
   , NumPut(pWaitForSingleObject, ptr*1)
   , NumPut(pSendMessageW, ptr + A_PtrSize)
   if (A_PtrSize = 4)  {
      NumPut(0x68, ptr + 8, "UChar")
      , NumPut(Timeout, ptr + 9, "UInt"), NumPut(0x68, ptr + 13, "UChar")
      , NumPut(Handle, ptr + 14), NumPut(0x15FF, ptr + 18, "UShort")
      , NumPut(ptr, ptr + 20), NumPut(0x6850, ptr + 24, "UShort")
      , NumPut(Handle, ptr + 26), NumPut(0x68, ptr + 30, "UChar")
      , NumPut(Msg, ptr + 31, "UInt"), NumPut(0x68, ptr + 35, "UChar")
      , NumPut(hWnd, ptr + 36), NumPut(0x15FF, ptr + 40, "UShort")
      , NumPut(ptr+4, ptr + 42), NumPut(0xC2, ptr + 46, "UChar"), NumPut(4, ptr + 47, "UShort")
   }
   else  {
      NumPut(0x53, ptr + 16, "UChar")
      , NumPut(0x20EC8348, ptr + 17, "UInt"), NumPut(0xBACB8948, ptr + 21, "UInt")
      , NumPut(Timeout, ptr + 25, "UInt"), NumPut(0xB948, ptr + 29, "UShort")
      , NumPut(Handle, ptr + 31), NumPut(0x15FF, ptr + 39, "UShort")
      , NumPut(-45, ptr + 41, "UInt"), NumPut(0xB849, ptr + 45, "UShort")
      , NumPut(Handle, ptr + 47), NumPut(0xBA, ptr + 55, "UChar")
      , NumPut(Msg, ptr + 56, "UInt"), NumPut(0xB948, ptr + 60, "UShort")
      , NumPut(hWnd, ptr + 62), NumPut(0xC18941, ptr + 70, "UInt")
      , NumPut(0x15FF, ptr + 73, "UShort"), NumPut(-71, ptr + 75, "UInt")
      , NumPut(0x20C48348, ptr + 79, "UInt"), NumPut(0xC35B, ptr + 83, "UShort")
   }
   return ptr + A_PtrSize*2
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

1,395

Re: AHK: Замена "Window Spy"

teadrinker пишет:

Проверьте, размораживает, или нет.

Нет.

teadrinker пишет:

Исправленный первоначальный вариант:

Да, но поток get_accName также остаётся в ожидании.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,396

Re: AHK: Замена "Window Spy"

serzh82saratov пишет:

Да, но поток get_accName также остаётся в ожидании.

Не могу воспроизвести.

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

1,397

Re: AHK: Замена "Window Spy"

Я как то задавал этот вопрос, возможно как то завершить конкретный поток  в скрипте?

1::
	; начинаем поток
	id = getcurrentthreadid()
	UnFreeze(1200, Func("MyFunc").Bind(id))
	MsgBox Первый поп ап
	MsgBox Второй поп ап не должен появится после запуска MyFunc
	Return
 
MyFunc(id)
{
	; закрываем поток
	terminatethreadid(id)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,398

Re: AHK: Замена "Window Spy"

teadrinker пишет:

Не могу воспроизвести.

Так всегда зависает, и Esc:: ExitApp не работает, только меню Exit.


1:: 
	Send {LWin}
	sleep 500

	ToolTip % hwnd := DllCall("FindWindowEx", "ptr", 0, "ptr", 0, "str", "Windows.UI.Core.CoreWindow", "str", "Начальный экран", "ptr")
	DllCall("LoadLibrary","str","oleacc","ptr")
	VarSetCapacity(IID_IAccessible, 16)
	DllCall("ole32\CLSIDFromString", "wstr", "{618736e0-3c3d-11cf-810c-00aa00389b71}", "ptr", &IID_IAccessible)
	DllCall("oleacc\AccessibleObjectFromWindow", "ptr", hwnd, "uint", OBJID_CLIENT := 0xFFFFFFFC, "ptr", &IID_IAccessible, "ptr*", pacc)

	Send {LWin}
	Sleep 500

	UnFreeze(1200, Func("MyFunc"))

	VarSetCapacity(variant, 8+A_PtrSize*2, 0)
	NumPut(VT_I4 := 3, variant, 0, "ushort")
	if (A_PtrSize = 4)
	   DllCall(NumGet(NumGet(pacc+0)+10*A_PtrSize), "ptr", pacc, "int64", NumGet(variant, 0, "int64"), "int64", NumGet(variant, 8, "int64"), "ptr*", name)   ; get_accName
	else
	   DllCall(NumGet(NumGet(pacc+0)+10*A_PtrSize), "ptr", pacc, "ptr", &variant, "ptr*", name)   ; get_accName
	msgbox % StrGet(name)
	Return

Esc:: ExitApp

MyFunc()
{
   msgbox timer
}

UnFreeze(timeout, userFunc) {
   static oInfo := {}
        , msg := DllCall("RegisterWindowMessage", "Str", "WM_INFO")
        , _ := OnMessage(msg, Func("WM_INFO").Bind(oInfo))
   params := {msg: msg, timeout: timeout}
   pObj := Object(params)
   pFunc := RegisterCallback("CreateTimer", "F", 0, pObj)
   oInfo.func := userFunc, oInfo.pObj := pObj
   oInfo.hThread := DllCall("CreateThread", "Ptr", 0, "Ptr", 0, "Ptr", pFunc, "Ptr", 0, "UInt", 0, "Ptr", 0)
}

CreateTimer() {
   obj := Object(A_EventInfo)
   DllCall("SetTimer", "Ptr", A_ScriptHwnd, "Ptr", 1, "UInt", obj.timeout, "Ptr", RegisterCallback("MyTimer", "F", 0, obj.msg))
}

MyTimer() {
   DllCall("KillTimer", "Ptr", A_ScriptHwnd, "Ptr", 1)
   DllCall("SendMessage", "Ptr", A_ScriptHwnd, "UInt", A_EventInfo, "Ptr", 0, "Ptr", 0)
}

WM_INFO(oInfo)
{
   DllCall("CloseHandle", "Ptr", oInfo.hThread)
   ObjRelease(oInfo.pObj)
   oInfo.func.Call()
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,399

Re: AHK: Замена "Window Spy"

serzh82saratov пишет:

Так всегда зависает

У меня нет.

serzh82saratov пишет:

возможно как то завершить конкретный поток  в скрипте?

Так код скрипта выполняется только в одном потоке, если его завершить — всё сломается.

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

1,400

Re: AHK: Замена "Window Spy"

teadrinker пишет:

Так код скрипта выполняется только в одном потоке

Ну это ты наверное в глобальном контексте всего процесса имеешь в виду.
Тогда назовём потоком (execution invoked) то, что запускается и завершается после выполнения по таймеру или горячей клавише.
Команда Exit завершает такой "поток".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.33.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui