1,001

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

Malcev пишет:

Не совсем понимаю, что ты имеешь в виду.

Первый код из 997 и AhkSpy в блокноте и хроме вроде одинаково показывают.

Malcev пишет:

State я бы исправил для наглядности

Не знаю, первым думаю надо выводить GetStateText, а эти флаги просто одни из многих.

Malcev пишет:

При нажатии show styles - стили скрываются, hide styles - появляются.
В вкладке control этой функции почему-то вообще нету.

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

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

1,002 (изменено: Malcev, 2018-12-29 01:49:18)

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

serzh82saratov пишет:

первым думаю надо выводить GetStateText

Эта функция не совсем правильно у тебя используется - ее надо вызывать для каждого флага отдельно:

Retrieves a localized string that describes an object's state for a single predefined state bit flag. Because state values are a combination of one or more bit flags, clients call this function more than once to retrieve all state strings.

https://docs.microsoft.com/en-us/window … statetextw

serzh82saratov пишет:

Первый код из 997 и AhkSpy в блокноте и хроме вроде одинаково показывают.

А сейчас ты используешь в AhkSpy код из 997 поста?

1,003

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

Malcev пишет:

ее надо вызывать для каждого флага отдельно:

Ну это наверное слишком, такого и в accviewer нет.

Malcev пишет:

А сейчас ты используешь в AhkSpy код из 997 поста?

Нет, просто Acc.accFocus.accValue(0). Меня в твоём варианте смущает Acc_ObjectFromWindow(WinExist("A")), ведь AhkSpy выводит только объект под мышкой, и тут же будет инфо про окно, путаница.

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

1,004 (изменено: Malcev, 2018-12-29 03:53:16)

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

serzh82saratov пишет:

Ну это наверное слишком, такого и в accviewer нет.

Значит это минус accviewerа.
Я бы на него не равнялся бы.
Посмотри, как это сделано в inspect.exe.
И к тому же прослеживается ошибка - наведи мышкой на сфокусированный элемент и нажми f11.
В твоём случае получится, что 1048580 = focusable, а это же не так.

f11::
msgbox % GetTextUnderMouse()

GetTextUnderMouse() {
	Acc := Acc_ObjectFromPoint(child)
	try value := Acc.accState(child) "`n" Acc_GetStateText(Acc.accState(child))
	return value
}
serzh82saratov пишет:

AhkSpy выводит только объект под мышкой, и тут же будет инфо про окно, путаница.

По-моему сейчас путаница, так как при движении мышкой фокус у окна не меняется, а ahkspy показывает, что меняется.
К тому же мы же не знаем какая вложенность сфокусированного элемента, поэтому такой код необязательно будет показывать сфокусированный элемент Acc.accFocus.accValue(0).
Вот так по-моему логичней:

f11::
MouseGetPos , , , OutputVarWin
Acc := Acc_ObjectFromWindow(OutputVarWin)
loop
{
   if isobject(Acc.accFocus)
      Acc := Acc.accFocus
   else
   {
      Child := Acc.accFocus
      try name := Acc.accName(child)
      try value := Acc.accValue(child)
      msgbox % name "`n`n" value
      name := value := ""
      return
   }
}

1,005

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

Навожу на поле блокнота, inspect, твой код и AhkSpy показывают одно и тоже, или куда смотреть?

Malcev пишет:

По-моему сейчас путаница, так как при движении мышкой фокус у окна не меняется, а ahkspy показывает, что меняется.

Так причём тут окно, если это вкладка так сказать "Under Mouse".

Malcev пишет:

К тому же мы же не знаем какая вложенность

Так она может быть ещё более глубокой? Может While?

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

1,006

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

serzh82saratov пишет:

Навожу на поле блокнота, inspect, твой код и AhkSpy показывают одно и тоже, или куда смотреть?

AhkSpy и мой код показывают не совсем правильно, а inspect правильно:
ahkSpy: focusable  ▪  code: 1048580  ▪  focusable  ▪  focused
inspect: focused,focusable (0x100004)

serzh82saratov пишет:

Так причём тут окно, если это вкладка так сказать "Under Mouse".

Когда окно не в фокусе во вкладке Control "Focus control" пустой.
Почему тогда  в AccInfo должно быть по-другому?

serzh82saratov пишет:

Может While?

Можно и while, я использую loop - дело привычки.

1,007

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

Malcev пишет:

AhkSpy и мой код показывают не совсем правильно, а inspect правильно:
ahkSpy: focusable  ▪  code: 1048580  ▪  focusable  ▪  focused
inspect: focused,focusable (0x100004)

А чем 0x100004 отличается от 1048580?
И где тут разница в строках?

Malcev пишет:

Когда окно не в фокусе во вкладке Control "Focus control" пустой.

Показывает то что даёт ControlGetFocus.

Malcev пишет:

Почему тогда  в AccInfo должно быть по-другому?

Так а что она должна показывать, если окно не в фокусе, и соответственно не может быть и контрола в фокусе.

Malcev пишет:

Можно и while, я использую loop - дело привычки.

В смысле, ты приводишь не первый раз пример того, что если вложенность первой "ступени", то безусловно нужно значение следующего потомка.
А уже между While и loop нет никакой разницы, тут просто вопрос предпочтений удобства выхода из цикла.

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

1,008

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

Ну у тебя получается, что focusable  - это code: 1048580
А это и focused и focusable.

serzh82saratov пишет:

а что она должна показывать, если окно не в фокусе, и соответственно не может быть и контрола в фокусе

Если окно не в фокусе, то AccInfo ничего не должно показывать ни в Focus - name ни в Focus - value, а сейчас показывает.
Accfocus нужно искать в цикле.

1,009

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

Malcev пишет:

Ну у тебя получается, что focusable  - это code: 1048580
А это и focused и focusable.

Нет, у меня показывает "фокусируемое" в зависимости от локали пользователя.
И оно там может быть разным, в смысле строка может быть и "элемент списка" например. Флаг focusable говорит о том что этот элемент в состоянии принять фокус, а focused, то что он в фокусе в данный момент.

Malcev пишет:

Если окно не в фокусе, то AccInfo ничего не должно показывать ни в Focus - name ни в Focus - value, а сейчас показывает.

Вот этого не замечал, посмотрю.

Malcev пишет:

Accfocus нужно искать в цикле.

Это да, но всё равно не пойму как ObjectFromWindow укладывается в концепцию "Under Mouse".

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

1,010

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

Смотри, открываем ноутпад++.
Наводим мышкой на вкладку с названием документа и кликаем туда.
Ahkspy показывает - selectable  ▪  code: 3145730  ▪  focusable
Но это не совсем верно.
Inspect же показывает - selected,focusable,selectable (0x300002).

serzh82saratov пишет:

как ObjectFromWindow укладывается в концепцию "Under Mouse".

Может дополнительно в настройках меню прописать  - показывать/не показывать?
Например при работе с хромом это может быть полезна.

1,011

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

Если SysListView32 не в фокусе, то показывает в Selection - parent индекс выделенного, если SysListView32 в фокусе, то focused добавляется.

Malcev пишет:

в настройках меню прописать  - показывать/не показывать?

Показывать что?

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

1,012

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

serzh82saratov пишет:

Показывать что?

Вкладки  ( Focus - name ) и  ( Focus - value )

serzh82saratov пишет:

Если SysListView32 не в фокусе, то показывает в Selection

Открываем блокнот, нажимаем на меню Help.
Ahspy показывает: has popup  ▪  code: 1074790532  ▪  focusable  ▪  focused
Inspect: focused,hot tracked,focusable,has popup (0x40100084)
У тебя "hot tracked" пропал.

1,013

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

Вообщем я окончательно запутался, приведи ещё раз код Focus - name и пример где он сейчас не работает.
И что за значение hot tracked, это в State, как его получить, в блокноте меню у меня такого нет.

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

1,014

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

Focus - name и value нужно получать так:

f11::
MouseGetPos , , , OutputVarWin
Acc := Acc_ObjectFromWindow(OutputVarWin)
loop
{
   if isobject(Acc.accFocus)
      Acc := Acc.accFocus
   else
   {
      Child := Acc.accFocus
      try name := Acc.accName(child)
      try value := Acc.accValue(child)
      msgbox % name "`n`n" value
      name := value := ""
      return
   }
}

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

serzh82saratov пишет:

И что за значение hot tracked, это в State, как его получить, в блокноте меню у меня такого нет.

Алгоритм примерно такой:

style := 1074790532
if (style = 0)
   fin := Acc_GetStateText(style)
else
{
   i := 1
   loop
   {
      if (i & style)
         fin .= Acc_GetStateText(i) "`n"
      i <<= 1
      if (i > style)
         break
   }
}
msgbox % fin

1,015

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

Всё, дошло. )
Думаю будут полезными индексы параметров.

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

1,016

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

Баги:
1) При нажатии show styles - стили скрываются, hide styles - появляются.
2) В IE стили контрола задисейблены.
3) Принадлежность контрола к процессу решил не делать?

detecthiddenwindows on
uia := UIA_Interface()

F11::
pid := uia.ElementFromPoint().CurrentProcessId
WinGet, Name, ProcessName, ahk_pid %pid%
msgbox % name "`n" pid
return



;~ UI Automation Constants: http://msdn.microsoft.com/en-us/library/windows/desktop/ee671207(v=vs.85).aspx
;~ UI Automation Enumerations: http://msdn.microsoft.com/en-us/library/windows/desktop/ee671210(v=vs.85).aspx
;~ http://www.autohotkey.com/board/topic/94619-ahk-l-screen-reader-a-tool-to-get-text-anywhere/

/* Questions:
	- better way to do __properties?
	- support for Constants?
	- if method returns a SafeArray, should we return a Wrapped SafeArray, Raw SafeArray, or AHK Array
	- on UIA Interface conversion methods, how should the data be returned? wrapped/extracted or raw? should raw data be a ByRef param?
	- do variants need cleared? what about SysAllocString BSTRs?
	- do RECT struts need destroyed?
	- if returning wrapped data & raw is ByRef, will the wrapped data being released destroy the raw data?
	- returning varaint data other than vt=3|8|9|13|0x2000
	- Cached Members?
	- UIA Element existance - dependent on window being visible (non minimized)?
	- function(params, ByRef out="……")
*/

class UIA_Base {
	__New(p="", flag=1) {
		ObjInsert(this,"__Type","IUIAutomation" SubStr(this.__Class,5))
		,ObjInsert(this,"__Value",p)
		,ObjInsert(this,"__Flag",flag)
	}
	__Get(member) {
		if member not in base,__UIA ; base & __UIA should act as normal
		{	if raw:=SubStr(member,0)="*" ; return raw data - user should know what they are doing
				member:=SubStr(member,1,-1)
			if RegExMatch(this.__properties, "im)^" member ",(\d+),(\w+)", m) { ; if the member is in the properties. if not - give error message
				if (m2="VARIANT")	; return VARIANT data - DllCall output param different
					return UIA_Hr(DllCall(this.__Vt(m1), "ptr",this.__Value, "ptr",UIA_Variant(out)))? (raw?out:UIA_VariantData(out)):
				else if (m2="RECT") ; return RECT struct - DllCall output param different
					return UIA_Hr(DllCall(this.__Vt(m1), "ptr",this.__Value, "ptr",&(rect,VarSetCapacity(rect,16))))? (raw?out:UIA_RectToObject(rect)):
				else if UIA_Hr(DllCall(this.__Vt(m1), "ptr",this.__Value, "ptr*",out))
					return raw?out:m2="BSTR"?StrGet(out):RegExMatch(m2,"i)IUIAutomation\K\w+",n)?new UIA_%n%(out):out ; Bool, int, DWORD, HWND, CONTROLTYPEID, OrientationType?
			}
			else throw Exception("Property not supported by the " this.__Class " Class.",-1,member)
		}
	}
	__Set(member) {
		throw Exception("Assigning values not supported by the " this.__Class " Class.",-1,member)
	}
	__Call(member) {
		if !ObjHasKey(UIA_Base,member)&&!ObjHasKey(this,member)
			throw Exception("Method Call not supported by the " this.__Class " Class.",-1,member)
	}
	__Delete() {
		this.__Flag? ObjRelease(this.__Value):
	}
	__Vt(n) {
		return NumGet(NumGet(this.__Value+0,"ptr")+n*A_PtrSize,"ptr")
	}
}	

class UIA_Interface extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671406(v=vs.85).aspx
	static __IID := "{30cbe57d-d9d0-452a-ab13-7ac5ac4825ee}"
		,  __properties := "ControlViewWalker,14,IUIAutomationTreeWalker`r`nContentViewWalker,15,IUIAutomationTreeWalker`r`nRawViewWalker,16,IUIAutomationTreeWalker`r`nRawViewCondition,17,IUIAutomationCondition`r`nControlViewCondition,18,IUIAutomationCondition`r`nContentViewCondition,19,IUIAutomationCondition`r`nProxyFactoryMapping,48,IUIAutomationProxyFactoryMapping`r`nReservedNotSupportedValue,54,IUnknown`r`nReservedMixedAttributeValue,55,IUnknown"
	
	CompareElements(e1,e2) {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr",e1.__Value, "ptr",e2.__Value, "int*",out))? out:
	}
	CompareRuntimeIds(r1,r2) {
		return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr",ComObjValue(r1), "ptr",ComObjValue(r2), "int*",out))? out:
	}
	GetRootElement() {
		return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out))? new UIA_Element(out):
	}
	ElementFromHandle(hwnd) {
		return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr",hwnd, "ptr*",out))? new UIA_Element(out):
	}
	ElementFromPoint(x="", y="") {
		return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "int64",x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "ptr*",out))? new UIA_Element(out):
	}	
	GetFocusedElement() {
		return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out))? new UIA_Element(out):
	}
	;~ GetRootElementBuildCache 	9
	;~ ElementFromHandleBuildCache 	10
	;~ ElementFromPointBuildCache 	11
	;~ GetFocusedElementBuildCache 	12
	CreateTreeWalker(condition) {
		return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "ptr",Condition.__Value, "ptr*",out))? new UIA_TreeWalker(out):
	}
	;~ CreateCacheRequest 	20

	CreateTrueCondition() {
		return UIA_Hr(DllCall(this.__Vt(21), "ptr",this.__Value, "ptr*",out))? new UIA_Condition(out):
	}
	CreateFalseCondition() {
		return UIA_Hr(DllCall(this.__Vt(22), "ptr",this.__Value, "ptr*",out))? new UIA_Condition(out):
	}
	CreatePropertyCondition(propertyId, ByRef var, type="Variant") {
		if (type!="Variant")
			UIA_Variant(var,type,var)
		return UIA_Hr(DllCall(this.__Vt(23), "ptr",this.__Value, "int",propertyId, "ptr",&var, "ptr*",out))? new UIA_PropertyCondition(out):
	}
	CreatePropertyConditionEx(propertyId, ByRef var, type="Variant", flags=0x1) { ; NOT TESTED
	; PropertyConditionFlags_IgnoreCase = 0x1
		if (type!="Variant")
			UIA_Variant(var,type,var)
		return UIA_Hr(DllCall(this.__Vt(24), "ptr",this.__Value, "int",propertyId, "ptr",&var, "uint",flags, "ptr*",out))? new UIA_PropertyCondition(out):
	}
	CreateAndCondition(c1,c2) {
		return UIA_Hr(DllCall(this.__Vt(25), "ptr",this.__Value, "ptr",c1.__Value, "ptr",c2.__Value, "ptr*",out))? new UIA_AndCondition(out):
	}
	CreateAndConditionFromArray(array) { ; ComObj(0x2003)??
	;->in: AHK Array or Wrapped SafeArray
		if ComObjValue(array)&0x2000
			SafeArray:=array
		else {
			SafeArray:=ComObj(0x2003,DllCall("oleaut32\SafeArrayCreateVector", "uint",13, "uint",0, "uint",array.MaxIndex()),1)
			for i,c in array
				SafeArray[A_Index-1]:=c.__Value, ObjAddRef(c.__Value) ; AddRef - SafeArrayDestroy will release UIA_Conditions - they also release themselves
		}
		return UIA_Hr(DllCall(this.__Vt(26), "ptr",this.__Value, "ptr",ComObjValue(SafeArray), "ptr*",out))? new UIA_AndCondition(out):
	}
	CreateAndConditionFromNativeArray(p*) { ; Not Implemented
		return UIA_NotImplemented()
	/*	[in]           IUIAutomationCondition **conditions,
		[in]           int conditionCount,
		[out, retval]  IUIAutomationCondition **newCondition
	*/
		;~ return UIA_Hr(DllCall(this.__Vt(27), "ptr",this.__Value,
	}
	CreateOrCondition(c1,c2) {
		return UIA_Hr(DllCall(this.__Vt(28), "ptr",this.__Value, "ptr",c1.__Value, "ptr",c2.__Value, "ptr*",out))? new UIA_OrCondition(out):
	}
	CreateOrConditionFromArray(array) {
	;->in: AHK Array or Wrapped SafeArray
		if ComObjValue(array)&0x2000
			SafeArray:=array
		else {
			SafeArray:=ComObj(0x2003,DllCall("oleaut32\SafeArrayCreateVector", "uint",13, "uint",0, "uint",array.MaxIndex()),1)
			for i,c in array
				SafeArray[A_Index-1]:=c.__Value, ObjAddRef(c.__Value) ; AddRef - SafeArrayDestroy will release UIA_Conditions - they also release themselves
		}
		return UIA_Hr(DllCall(this.__Vt(29), "ptr",this.__Value, "ptr",ComObjValue(SafeArray), "ptr*",out))? new UIA_AndCondition(out):
	}
	CreateOrConditionFromNativeArray(p*) { ; Not Implemented
		return UIA_NotImplemented()
	/*	[in]           IUIAutomationCondition **conditions,
		[in]           int conditionCount,
		[out, retval]  IUIAutomationCondition **newCondition
	*/
		;~ return UIA_Hr(DllCall(this.__Vt(27), "ptr",this.__Value,
	}
	CreateNotCondition(c) {
		return UIA_Hr(DllCall(this.__Vt(31), "ptr",this.__Value, "ptr",c.__Value, "ptr*",out))? new UIA_NotCondition(out):
	}

	;~ AddAutomationEventHandler 	32
	;~ RemoveAutomationEventHandler 	33
	;~ AddPropertyChangedEventHandlerNativeArray 	34
	AddPropertyChangedEventHandler(element,scope=0x1,cacheRequest=0,handler="",propertyArray="") {
		SafeArray:=ComObjArray(0x3,propertyArray.MaxIndex())
		for i,propertyId in propertyArray
			SafeArray[i-1]:=propertyId
		return UIA_Hr(DllCall(this.__Vt(35), "ptr",this.__Value, "ptr",element.__Value, "int",scope, "ptr",cacheRequest,"ptr",handler.__Value,"ptr",ComObjValue(SafeArray)))
	}
	;~ RemovePropertyChangedEventHandler 	36
	;~ AddStructureChangedEventHandler 	37
	;~ RemoveStructureChangedEventHandler 	38
	AddFocusChangedEventHandler(cacheRequest, handler) {
		return UIA_Hr(DllCall(this.__Vt(39), "ptr",this.__Value, "ptr",cacheRequest, "ptr",handler.__Value))
	}
	;~ RemoveFocusChangedEventHandler 	40
	;~ RemoveAllEventHandlers 	41

	IntNativeArrayToSafeArray(ByRef nArr, n="") {
		return UIA_Hr(DllCall(this.__Vt(42), "ptr",this.__Value, "ptr",&nArr, "int",n?n:VarSetCapacity(nArr)/4, "ptr*",out))? ComObj(0x2003,out,1):
	}
/*	IntSafeArrayToNativeArray(sArr, Byref nArr="", Byref arrayCount="") { ; NOT WORKING
		VarSetCapacity(nArr,(sArr.MaxIndex()+1)*4)
		return UIA_Hr(DllCall(this.__Vt(43), "ptr",this.__Value, "ptr",ComObjValue(sArr), "ptr*",nArr, "int*",arrayCount))? arrayCount:
	}
*/
	RectToVariant(ByRef rect, ByRef out="") {	; in:{left,top,right,bottom} ; out:(left,top,width,height)
		; in:	RECT Struct
		; out:	AHK Wrapped SafeArray & ByRef Variant
		return UIA_Hr(DllCall(this.__Vt(44), "ptr",this.__Value, "ptr",&rect, "ptr",UIA_Variant(out)))? UIA_VariantData(out):
	}
/*	VariantToRect(ByRef var, ByRef out="") { ; NOT WORKING
		; in:	VT_VARIANT (SafeArray)
		; out:	AHK Wrapped RECT Struct & ByRef Struct
		return UIA_Hr(DllCall(this.__Vt(45), "ptr",this.__Value, "ptr",var, "ptr",&(out,VarSetCapacity(out,16))))? UIA_RectToObject(out):
	}
*/
	;~ SafeArrayToRectNativeArray 	46
	;~ CreateProxyFactoryEntry 	47
	GetPropertyProgrammaticName(Id) {
		return UIA_Hr(DllCall(this.__Vt(49), "ptr",this.__Value, "int",Id, "ptr*",out))? StrGet(out):
	}
	GetPatternProgrammaticName(Id) {
		return UIA_Hr(DllCall(this.__Vt(50), "ptr",this.__Value, "int",Id, "ptr*",out))? StrGet(out):
	}
	PollForPotentialSupportedPatterns(e, Byref Ids="", Byref Names="") {
		return UIA_Hr(DllCall(this.__Vt(51), "ptr",this.__Value, "ptr",e.__Value, "ptr*",Ids, "ptr*",Names))? UIA_SafeArraysToObject(Names:=ComObj(0x2008,Names,1),Ids:=ComObj(0x2003,Ids,1)):
	}
	PollForPotentialSupportedProperties(e, Byref Ids="", Byref Names="") {
		return UIA_Hr(DllCall(this.__Vt(52), "ptr",this.__Value, "ptr",e.__Value, "ptr*",Ids, "ptr*",Names))? UIA_SafeArraysToObject(Names:=ComObj(0x2008,Names,1),Ids:=ComObj(0x2003,Ids,1)):
	}
	CheckNotSupported(value) { ; Useless in this Framework???
	/*	Checks a provided VARIANT to see if it contains the Not Supported identifier.
		After retrieving a property for a UI Automation element, call this method to determine whether the element supports the 
		retrieved property. CheckNotSupported is typically called after calling a property retrieving method such as GetCurrentPropertyValue.
	*/
		return UIA_Hr(DllCall(this.__Vt(53), "ptr",this.__Value, "ptr",value, "int*",out))? out:
	}
	ElementFromIAccessible(IAcc, childId=0) {
	/* The method returns E_INVALIDARG - "One or more arguments are not valid" - if the underlying implementation of the
	Microsoft UI Automation element is not a native Microsoft Active Accessibility server; that is, if a client attempts to retrieve
	the IAccessible interface for an element originally supported by a proxy object from Oleacc.dll, or by the UIA-to-MSAA Bridge.
	*/
		return UIA_Hr(DllCall(this.__Vt(56), "ptr",this.__Value, "ptr",ComObjValue(IAcc), "int",childId, "ptr*",out))? new UIA_Element(out):
	}
	;~ ElementFromIAccessibleBuildCache 	57
}

class UIA_Element extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671425(v=vs.85).aspx
	static __IID := "{d22108aa-8ac5-49a5-837b-37bbb3d7591e}"
		,  __properties := "CurrentProcessId,20,int`r`nCurrentControlType,21,CONTROLTYPEID`r`nCurrentLocalizedControlType,22,BSTR`r`nCurrentName,23,BSTR`r`nCurrentAcceleratorKey,24,BSTR`r`nCurrentAccessKey,25,BSTR`r`nCurrentHasKeyboardFocus,26,BOOL`r`nCurrentIsKeyboardFocusable,27,BOOL`r`nCurrentIsEnabled,28,BOOL`r`nCurrentAutomationId,29,BSTR`r`nCurrentClassName,30,BSTR`r`nCurrentHelpText,31,BSTR`r`nCurrentCulture,32,int`r`nCurrentIsControlElement,33,BOOL`r`nCurrentIsContentElement,34,BOOL`r`nCurrentIsPassword,35,BOOL`r`nCurrentNativeWindowHandle,36,UIA_HWND`r`nCurrentItemType,37,BSTR`r`nCurrentIsOffscreen,38,BOOL`r`nCurrentOrientation,39,OrientationType`r`nCurrentFrameworkId,40,BSTR`r`nCurrentIsRequiredForForm,41,BOOL`r`nCurrentItemStatus,42,BSTR`r`nCurrentBoundingRectangle,43,RECT`r`nCurrentLabeledBy,44,IUIAutomationElement`r`nCurrentAriaRole,45,BSTR`r`nCurrentAriaProperties,46,BSTR`r`nCurrentIsDataValidForForm,47,BOOL`r`nCurrentControllerFor,48,IUIAutomationElementArray`r`nCurrentDescribedBy,49,IUIAutomationElementArray`r`nCurrentFlowsTo,50,IUIAutomationElementArray`r`nCurrentProviderDescription,51,BSTR`r`nCachedProcessId,52,int`r`nCachedControlType,53,CONTROLTYPEID`r`nCachedLocalizedControlType,54,BSTR`r`nCachedName,55,BSTR`r`nCachedAcceleratorKey,56,BSTR`r`nCachedAccessKey,57,BSTR`r`nCachedHasKeyboardFocus,58,BOOL`r`nCachedIsKeyboardFocusable,59,BOOL`r`nCachedIsEnabled,60,BOOL`r`nCachedAutomationId,61,BSTR`r`nCachedClassName,62,BSTR`r`nCachedHelpText,63,BSTR`r`nCachedCulture,64,int`r`nCachedIsControlElement,65,BOOL`r`nCachedIsContentElement,66,BOOL`r`nCachedIsPassword,67,BOOL`r`nCachedNativeWindowHandle,68,UIA_HWND`r`nCachedItemType,69,BSTR`r`nCachedIsOffscreen,70,BOOL`r`nCachedOrientation,71,OrientationType`r`nCachedFrameworkId,72,BSTR`r`nCachedIsRequiredForForm,73,BOOL`r`nCachedItemStatus,74,BSTR`r`nCachedBoundingRectangle,75,RECT`r`nCachedLabeledBy,76,IUIAutomationElement`r`nCachedAriaRole,77,BSTR`r`nCachedAriaProperties,78,BSTR`r`nCachedIsDataValidForForm,79,BOOL`r`nCachedControllerFor,80,IUIAutomationElementArray`r`nCachedDescribedBy,81,IUIAutomationElementArray`r`nCachedFlowsTo,82,IUIAutomationElementArray`r`nCachedProviderDescription,83,BSTR"
	
	SetFocus() {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value))
	}
	GetRuntimeId(ByRef stringId="") {
		return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",sa))? ComObj(0x2003,sa,1):
	}
	FindFirst(c="", scope=0x2) {
		static tc	; TrueCondition
		if !tc
			tc:=this.__uia.CreateTrueCondition()
		return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "uint",scope, "ptr",(c=""?tc:c).__Value, "ptr*",out))? new UIA_Element(out):
	}
	FindAll(c="", scope=0x2) {
		static tc	; TrueCondition
		if !tc
			tc:=this.__uia.CreateTrueCondition()
		return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "uint",scope, "ptr",(c=""?tc:c).__Value, "ptr*",out))? UIA_ElementArray(out):
	}
	;~ Find (First/All, Element/Children/Descendants/Parent/Ancestors/Subtree, Conditions)
	;~ FindFirstBuildCache 	7	IUIAutomationElement
	;~ FindAllBuildCache 	8	IUIAutomationElementArray
	;~ BuildUpdatedCache 	9	IUIAutomationElement
	GetCurrentPropertyValue(propertyId, ByRef out="") {
		return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "uint",propertyId, "ptr",UIA_Variant(out)))? UIA_VariantData(out):
	}
	GetCurrentPropertyValueEx(propertyId, ignoreDefaultValue=1, ByRef out="") {
	; Passing FALSE in the ignoreDefaultValue parameter is equivalent to calling GetCurrentPropertyValue
		return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "uint",propertyId, "uint",ignoreDefaultValue, "ptr",UIA_Variant(out)))? UIA_VariantData(out):
	}
	;~ GetCachedPropertyValue 	12	VARIANT
	;~ GetCachedPropertyValueEx 	13	VARIANT
	GetCurrentPatternAs(pattern="") {
		if IsObject(UIA_%pattern%Pattern)&&(iid:=UIA_%pattern%Pattern.__iid)&&(pId:=UIA_%pattern%Pattern.__PatternID)
			return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "int",pId, "ptr",UIA_GUID(riid,iid), "ptr*",out))? new UIA_%pattern%Pattern(out):
		else throw Exception("Pattern not implemented.",-1, "UIA_" pattern "Pattern")
	}
	;~ GetCachedPatternAs 	15	void **ppv
	;~ GetCurrentPattern 	16	Iunknown **patternObject
	;~ GetCachedPattern 	17	Iunknown **patternObject
	;~ GetCachedParent 	18	IUIAutomationElement
	GetCachedChildren() { ; Haven't successfully tested
		return UIA_Hr(DllCall(this.__Vt(19), "ptr",this.__Value, "ptr*",out))&&out? UIA_ElementArray(out):
	}
	;~ GetClickablePoint 	84	POINT, BOOL
}

class UIA_ElementArray extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671426(v=vs.85).aspx
	static __IID := "{14314595-b4bc-4055-95f2-58f2e42c9855}"
		,  __properties := "Length,3,int"
	
	GetElement(i) {
		return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "int",i, "ptr*",out))? new UIA_Element(out):
	}
}

class UIA_TreeWalker extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671470(v=vs.85).aspx
	static __IID := "{4042c624-389c-4afc-a630-9df854a541fc}"
		,  __properties := "Condition,15,IUIAutomationCondition"
	
	GetParentElement(e) {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out))? new UIA_Element(out):
	}
	GetFirstChildElement(e) {
		return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out))&&out? new UIA_Element(out):
	}
	GetLastChildElement(e) {
		return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out))&&out? new UIA_Element(out):
	}
	GetNextSiblingElement(e) {
		return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out))&&out? new UIA_Element(out):
	}
	GetPreviousSiblingElement(e) {
		return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out))&&out? new UIA_Element(out):
	}
	NormalizeElement(e) {
		return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out))&&out? new UIA_Element(out):
	}
/*	GetParentElementBuildCache(e, cacheRequest) {
		return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value.__Value, "ptr*",out))? new UIA_Element(out):
	}
	GetFirstChildElementBuildCache(e, cacheRequest) {
		return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out))? new UIA_Element(out):
	}
	GetLastChildElementBuildCache(e, cacheRequest) {
		return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out))? new UIA_Element(out):
	}
	GetNextSiblingElementBuildCache(e, cacheRequest) {
		return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out))? new UIA_Element(out):
	}
	GetPreviousSiblingElementBuildCache(e, cacheRequest) {
		return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out))? new UIA_Element(out):
	}
	NormalizeElementBuildCache(e, cacheRequest) {
		return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out))? new UIA_Element(out):
	}
*/
}

class UIA_Condition extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671420(v=vs.85).aspx
	static __IID := "{352ffba8-0973-437c-a61f-f64cafd81df9}"
}

class UIA_PropertyCondition extends UIA_Condition {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696121(v=vs.85).aspx
	static __IID := "{99ebf2cb-5578-4267-9ad4-afd6ea77e94b}"
		,  __properties := "PropertyId,3,PROPERTYID`r`nPropertyValue,4,VARIANT`r`nPropertyConditionFlags,5,PropertyConditionFlags"
}
; should returned children have a condition type (property/and/or/bool/not), or be a generic uia_condition object?
class UIA_AndCondition extends UIA_Condition {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671407(v=vs.85).aspx
	static __IID := "{a7d0af36-b912-45fe-9855-091ddc174aec}"
		,  __properties := "ChildCount,3,int"
	
	;~ GetChildrenAsNativeArray	4	IUIAutomationCondition ***childArray
	GetChildren() {
		return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out))&&out? ComObj(0x2003,out,1):
	}
}
class UIA_OrCondition extends UIA_Condition {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696108(v=vs.85).aspx
	static __IID := "{8753f032-3db1-47b5-a1fc-6e34a266c712}"
		,  __properties := "ChildCount,3,int"
	
	;~ GetChildrenAsNativeArray	4	IUIAutomationCondition ***childArray
	;~ GetChildren	5	SAFEARRAY
}
class UIA_BoolCondition extends UIA_Condition {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671411(v=vs.85).aspx
	static __IID := "{8753f032-3db1-47b5-a1fc-6e34a266c712}"
		,  __properties := "BooleanValue,3,boolVal"
}
class UIA_NotCondition extends UIA_Condition {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696106(v=vs.85).aspx
	static __IID := "{f528b657-847b-498c-8896-d52b565407a1}"
	
	;~ GetChild	3	IUIAutomationCondition
}

class UIA_IUnknown extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ms680509(v=vs.85).aspx
	static __IID := "{00000000-0000-0000-C000-000000000046}"
}

class UIA_CacheRequest  extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671413(v=vs.85).aspx
	static __IID := "{b32a92b5-bc25-4078-9c08-d7ee95c48e03}"
}


class _UIA_EventHandler {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696044(v=vs.85).aspx
	static __IID := "{146c3c17-f12e-4e22-8c27-f894b9b79c69}"
	
/*	HandleAutomationEvent	3
		[in]  IUIAutomationElement *sender,
		[in]  EVENTID eventId
*/
}
class _UIA_FocusChangedEventHandler {		
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696051(v=vs.85).aspx
	static __IID := "{c270f6b5-5c69-4290-9745-7a7f97169468}"
	
/*	HandleFocusChangedEvent	3
		[in]  IUIAutomationElement *sender
*/
}
class _UIA_PropertyChangedEventHandler {		
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696119(v=vs.85).aspx
	static __IID := "{40cd37d4-c756-4b0c-8c6f-bddfeeb13b50}"
	
/*	HandlePropertyChangedEvent	3
		[in]  IUIAutomationElement *sender,
		[in]  PROPERTYID propertyId,
		[in]  VARIANT newValue
*/
}
class _UIA_StructureChangedEventHandler {		
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696197(v=vs.85).aspx
	static __IID := "{e81d1b4e-11c5-42f8-9754-e7036c79f054}"
	
/*	HandleStructureChangedEvent	3
		[in]  IUIAutomationElement *sender,
		[in]  StructureChangeType changeType,
		[in]  SAFEARRAY *runtimeId[int]
*/
}
class _UIA_TextEditTextChangedEventHandler { ; Windows 8.1 Preview [desktop apps only]
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/dn302202(v=vs.85).aspx
	static __IID := "{92FAA680-E704-4156-931A-E32D5BB38F3F}"
	
	;~ HandleTextEditTextChangedEvent	3
}


;~ 		UIA_Patterns - http://msdn.microsoft.com/en-us/library/windows/desktop/ee684023
class UIA_DockPattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671421
	static	__IID := "{fde5ef97-1464-48f6-90bf-43d0948e86ec}"
		,	__PatternID := 10011
		,	__Properties := "CurrentDockPosition,4,int`r`nCachedDockPosition,5,int"

	SetDockPosition(Pos) {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "uint",pos))
	}
/*	DockPosition_Top	= 0,
	DockPosition_Left	= 1,
	DockPosition_Bottom	= 2,
	DockPosition_Right	= 3,
	DockPosition_Fill	= 4,
	DockPosition_None	= 5
*/
}
class UIA_ExpandCollapsePattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696046
	static	__IID := "{619be086-1f4e-4ee4-bafa-210128738730}"
		,	__PatternID := 10005
		,	__Properties := "CachedExpandCollapseState,6,int`r`nCurrentExpandCollapseState,5,int"
	
	Expand() {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value))
	}
	Collapse() {
		return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value))
	}	
/*	ExpandCollapseState_Collapsed	= 0,
	ExpandCollapseState_Expanded	= 1,
	ExpandCollapseState_PartiallyExpanded	= 2,
	ExpandCollapseState_LeafNode	= 3
*/
}
class UIA_GridItemPattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696053
	static	__IID := "{78f8ef57-66c3-4e09-bd7c-e79b2004894d}"
		,	__PatternID := 10007
		,	__Properties := "CurrentContainingGrid,3,IUIAutomationElement`r`nCurrentRow,4,int`r`nCurrentColumn,5,int`r`nCurrentRowSpan,6,int`r`nCurrentColumnSpan,7,int`r`nCachedContainingGrid,8,IUIAutomationElement`r`nCachedRow,9,int`r`nCachedColumn,10,int`r`nCachedRowSpan,11,int`r`nCachedColumnSpan,12,int"
}
class UIA_GridPattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696064
	static	__IID := "{414c3cdc-856b-4f5b-8538-3131c6302550}"
		,	__PatternID := 10006
		,	__Properties := "CurrentRowCount,4,int`r`nCurrentColumnCount,5,int`r`nCachedRowCount,6,int`r`nCachedColumnCount,7,int"

	GetItem(row,column) { ; Hr!=0 if no result, or blank output?
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "uint",row, "uint",column, "ptr*",out))? new UIA_Element(out):
	}
}
class UIA_InvokePattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696070
	static	__IID := "{fb377fbe-8ea6-46d5-9c73-6499642d3059}"
		,	__PatternID := 10000
	
	Invoke() {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value))
	}
}
class UIA_ItemContainerPattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696072
	static	__IID := "{c690fdb2-27a8-423c-812d-429773c9084e}"
		,	__PatternID := 10019

	FindItemByProperty(startAfter, propertyId, ByRef value, type=8) {	; Hr!=0 if no result, or blank output?
		if (type!="Variant")
			UIA_Variant(value,type,value)
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr",startAfter.__Value, "int",propertyId, "ptr",&value, "ptr*",out))? new UIA_Element(out):
	}
}
class UIA_LegacyIAccessiblePattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696074
	static	__IID := "{828055ad-355b-4435-86d5-3b51c14a9b1b}"
		,	__PatternID := 10018
		,	__Properties := "CurrentChildId,6,int`r`nCurrentName,7,BSTR`r`nCurrentValue,8,BSTR`r`nCurrentDescription,9,BSTR`r`nCurrentRole,10,DWORD`r`nCurrentState,11,DWORD`r`nCurrentHelp,12,BSTR`r`nCurrentKeyboardShortcut,13,BSTR`r`nCurrentDefaultAction,15,BSTR`r`nCachedChildId,16,int`r`nCachedName,17,BSTR`r`nCachedValue,18,BSTR`r`nCachedDescription,19,BSTR`r`nCachedRole,20,DWORD`r`nCachedState,21,DWORD`r`nCachedHelp,22,BSTR`r`nCachedKeyboardShortcut,23,BSTR`r`nCachedDefaultAction,25,BSTR"

	Select(flags=3) {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "int",flags))
	}
	DoDefaultAction() {
		return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value))
	}
	SetValue(value) {
		return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr",&value))
	}
	GetCurrentSelection() { ; Not correct
		;~ if (hr:=DllCall(this.__Vt(14), "ptr",this.__Value, "ptr*",array))=0
			;~ return new UIA_ElementArray(array)
		;~ else
			;~ MsgBox,, Error, %hr%
	}
	;~ GetCachedSelection	24	IUIAutomationElementArray
	GetIAccessible() {
	/*	This method returns NULL if the underlying implementation of the UI Automation element is not a native 
	Microsoft Active Accessibility server; that is, if a client attempts to retrieve the IAccessible interface 
	for an element originally supported by a proxy object from OLEACC.dll, or by the UIA-to-MSAA Bridge.
	*/
		return UIA_Hr(DllCall(this.__Vt(26), "ptr",this.__Value, "ptr*",pacc))&&pacc? ComObj(9,pacc,1):
	}
}
class UIA_MultipleViewPattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696099
	static	__IID := "{8d253c91-1dc5-4bb5-b18f-ade16fa495e8}"
		,	__PatternID := 10008
		,	__Properties := "CurrentCurrentView,5,int`r`nCachedCurrentView,7,int"

	GetViewName(view) { ; need to release BSTR?
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "int",view, "ptr*",name))? StrGet(name):
	}
	SetCurrentView(view) {
		return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "int",view))
	}
	GetCurrentSupportedViews() {
		return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out))? ComObj(0x2003,out,1):
	}
	GetCachedSupportedViews() {
		return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out))? ComObj(0x2003,out,1):
	}
}
class UIA_RangeValuePattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696147
	static	__IID := "{59213f4f-7346-49e5-b120-80555987a148}"
		,	__PatternID := 10003
		,	__Properties := "CurrentValue,4,double`r`nCurrentIsReadOnly,5,BOOL`r`nCurrentMaximum,6,double`r`nCurrentMinimum,7,double`r`nCurrentLargeChange,8,double`r`nCurrentSmallChange,9,double`r`nCachedValue,10,double`r`nCachedIsReadOnly,11,BOOL`r`nCachedMaximum,12,double`r`nCachedMinimum,13,double`r`nCachedLargeChange,14,double`r`nCachedSmallChange,15,double"

	SetValue(val) {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "double",val))
	}
}
class UIA_ScrollItemPattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696165
	static	__IID := "{b488300f-d015-4f19-9c29-bb595e3645ef}"
		,	__PatternID := 10017

	ScrollIntoView() {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value))
	}
}
class UIA_ScrollPattern extends UIA_Base {
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696167
	static	__IID := "{88f4d42a-e881-459d-a77c-73bbbb7e02dc}"
		,	__PatternID := 10004
		,	__Properties := "CurrentHorizontalScrollPercent,5,double`r`nCurrentVerticalScrollPercent,6,double`r`nCurrentHorizontalViewSize,7,double`r`CurrentHorizontallyScrollable,9,BOOL`r`nCurrentVerticallyScrollable,10,BOOL`r`nCachedHorizontalScrollPercent,11,double`r`nCachedVerticalScrollPercent,12,double`r`nCachedHorizontalViewSize,13,double`r`nCachedVerticalViewSize,14,double`r`nCachedHorizontallyScrollable,15,BOOL`r`nCachedVerticallyScrollable,16,BOOL"
		
	Scroll(horizontal, vertical) {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "uint",horizontal, "uint",vertical))
	}
	SetScrollPercent(horizontal, vertical) {
		return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "double",horizontal, "double",vertical))
	}
/*	UIA_ScrollPatternNoScroll	=	-1
	ScrollAmount_LargeDecrement	= 0,
	ScrollAmount_SmallDecrement	= 1,
	ScrollAmount_NoAmount	= 2,
	ScrollAmount_LargeIncrement	= 3,
	ScrollAmount_SmallIncrement	= 4
*/
}
;~ class UIA_SelectionItemPattern extends UIA_Base {10010
;~ class UIA_SelectionPattern extends UIA_Base {10001
;~ class UIA_SpreadsheetItemPattern extends UIA_Base {10027
;~ class UIA_SpreadsheetPattern extends UIA_Base {10026
;~ class UIA_StylesPattern extends UIA_Base {10025
;~ class UIA_SynchronizedInputPattern extends UIA_Base {10021
;~ class UIA_TableItemPattern extends UIA_Base {10013
;~ class UIA_TablePattern extends UIA_Base {10012
;~ class UIA_TextChildPattern extends UIA_Base {10029
;~ class UIA_TextEditPattern extends UIA_Base {10032
;~ class UIA_TextPattern extends UIA_Base {10014
;~ class UIA_TextPattern2 extends UIA_Base {10024
;~ class UIA_TogglePattern extends UIA_Base {10015
;~ class UIA_TransformPattern extends UIA_Base {10016
;~ class UIA_TransformPattern2 extends UIA_Base {10028
;~ class UIA_ValuePattern extends UIA_Base {10002
;~ class UIA_VirtualizedItemPattern extends UIA_Base {10020
;~ class UIA_WindowPattern extends UIA_Base {10009
;~ class UIA_AnnotationPattern extends UIA_Base {10023		; Windows 8 [desktop apps only]
;~ class UIA_DragPattern extends UIA_Base {10030			; Windows 8 [desktop apps only]
;~ class UIA_DropTargetPattern extends UIA_Base {10031		; Windows 8 [desktop apps only]
/* class UIA_ObjectModelPattern extends UIA_Base {			; Windows 8 [desktop apps only]
	;~ http://msdn.microsoft.com/en-us/library/windows/desktop/hh437262(v=vs.85).aspx
	static	__IID := "{71c284b3-c14d-4d14-981e-19751b0d756d}"
		,	__PatternID := 10022
	
	GetUnderlyingObjectModel() {
		return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value))
	}
}
*/

;~ class UIA_PatternHandler extends UIA_Base {
;~ class UIA_PatternInstance extends UIA_Base {
;~ class UIA_TextRange extends UIA_Base {
;~ class UIA_TextRange2 extends UIA_Base {
;~ class UIA_TextRangeArray extends UIA_Base {




{  ;~ UIA Functions
	UIA_Interface() {
		try {
			if uia:=ComObjCreate("{ff48dba4-60ef-4201-aa87-54103eef594e}","{30cbe57d-d9d0-452a-ab13-7ac5ac4825ee}")
				return uia:=new UIA_Interface(uia), uia.base.base.__UIA:=uia
			throw "UIAutomation Interface failed to initialize."
		} catch e
			MsgBox, 262160, UIA Startup Error, % IsObject(e)?"IUIAutomation Interface is not registered.":e.Message
	}
	UIA_Hr(hr) {
		;~ http://blogs.msdn.com/b/eldar/archive/2007/04/03/a-lot-of-hresult-codes.aspx
		static err:={0x8000FFFF:"Catastrophic failure.",0x80004001:"Not implemented.",0x8007000E:"Out of memory.",0x80070057:"One or more arguments are not valid.",0x80004002:"Interface not supported.",0x80004003:"Pointer not valid.",0x80070006:"Handle not valid.",0x80004004:"Operation aborted.",0x80004005:"Unspecified error.",0x80070005:"General access denied.",0x800401E5:"The object identified by this moniker could not be found.",0x80040201:"UIA_E_ELEMENTNOTAVAILABLE",0x80040200:"UIA_E_ELEMENTNOTENABLED",0x80131509:"UIA_E_INVALIDOPERATION",0x80040202:"UIA_E_NOCLICKABLEPOINT",0x80040204:"UIA_E_NOTSUPPORTED",0x80040203:"UIA_E_PROXYASSEMBLYNOTLOADED"} ; //not completed
		if hr&&(hr&=0xFFFFFFFF) {
			RegExMatch(Exception("",-2).what,"(\w+).(\w+)",i)
			throw Exception(UIA_Hex(hr) " - " err[hr], -2, i2 "  (" i1 ")")
		}
		return !hr
	}
	UIA_NotImplemented() {
		RegExMatch(Exception("",-2).What,"(\D+)\.(\D+)",m)
		MsgBox, 262192, UIA Message, Class:`t%m1%`nMember:`t%m2%`n`nMethod has not been implemented yet.
	}
	UIA_ElementArray(p, uia="") { ; should AHK Object be 0 or 1 based?
		a:=new UIA_ElementArray(p),out:=[]
		Loop % a.Length
			out[A_Index]:=a.GetElement(A_Index-1)
		return out, out.base:={UIA_ElementArray:a}
	}
	UIA_RectToObject(ByRef r) { ; rect.__Value work with DllCalls?
		static b:={__Class:"object",__Type:"RECT",Struct:Func("UIA_RectStructure")}
		return {l:NumGet(r,0,"Int"),t:NumGet(r,4,"Int"),r:NumGet(r,8,"Int"),b:NumGet(r,12,"Int"),base:b}
	}
	UIA_RectStructure(this, ByRef r) {
		static sides:="ltrb"
		VarSetCapacity(r,16)
		Loop Parse, sides
			NumPut(this[A_LoopField],r,(A_Index-1)*4,"Int")
	}
	UIA_SafeArraysToObject(keys,values) {
	;~	1 dim safearrays w/ same # of elements
		out:={}
		for key in keys
			out[key]:=values[A_Index-1]
		return out
	}
	UIA_Hex(p) {
		setting:=A_FormatInteger
		SetFormat,IntegerFast,H
		out:=p+0 ""
		SetFormat,IntegerFast,%setting%
		return out
	}
	UIA_GUID(ByRef GUID, sGUID) { ;~ Converts a string to a binary GUID and returns its address.
		VarSetCapacity(GUID,16,0)
		return DllCall("ole32\CLSIDFromString", "wstr",sGUID, "ptr",&GUID)>=0?&GUID:""
	}
	UIA_Variant(ByRef var,type=0,val=0) {
		; Does a variant need to be cleared? If it uses SysAllocString? 
		return (VarSetCapacity(var,8+2*A_PtrSize)+NumPut(type,var,0,"short")+NumPut(type=8? DllCall("oleaut32\SysAllocString", "ptr",&val):val,var,8,"ptr"))*0+&var
	}
	UIA_IsVariant(ByRef vt, ByRef type="") {
		size:=VarSetCapacity(vt),type:=NumGet(vt,"UShort")
		return size>=16&&size<=24&&type>=0&&(type<=23||type|0x2000)
	}
	UIA_Type(ByRef item, ByRef info) {
	}
	UIA_VariantData(ByRef p, flag=1) {
		; based on Sean's COM_Enumerate function
		; need to clear varaint? what if you still need it (flag param)?
		return !UIA_IsVariant(p,vt)?"Invalid Variant"
				:vt=3?NumGet(p,8,"int")
				:vt=8?StrGet(NumGet(p,8))
				:vt=9||vt=13||vt&0x2000?ComObj(vt,NumGet(p,8),flag)
				:vt<0x1000&&UIA_VariantChangeType(&p,&p)=0?StrGet(NumGet(p,8)) UIA_VariantClear(&p)
				:NumGet(p,8)
	/*
		VT_EMPTY     =      0  		; No value
		VT_NULL      =      1 		; SQL-style Null
		VT_I2        =      2 		; 16-bit signed int
		VT_I4        =      3 		; 32-bit signed int
		VT_R4        =      4 		; 32-bit floating-point number
		VT_R8        =      5 		; 64-bit floating-point number
		VT_CY        =      6 		; Currency
		VT_DATE      =      7  		; Date
		VT_BSTR      =      8 		; COM string (Unicode string with length prefix)
		VT_DISPATCH  =      9 		; COM object 
		VT_ERROR     =    0xA  10	; Error code (32-bit integer)
		VT_BOOL      =    0xB  11	; Boolean True (-1) or False (0)
		VT_VARIANT   =    0xC  12	; VARIANT (must be combined with VT_ARRAY or VT_BYREF)
		VT_UNKNOWN   =    0xD  13	; IUnknown interface pointer
		VT_DECIMAL   =    0xE  14	; (not supported)
		VT_I1        =   0x10  16	; 8-bit signed int
		VT_UI1       =   0x11  17	; 8-bit unsigned int
		VT_UI2       =   0x12  18	; 16-bit unsigned int
		VT_UI4       =   0x13  19	; 32-bit unsigned int
		VT_I8        =   0x14  20	; 64-bit signed int
		VT_UI8       =   0x15  21	; 64-bit unsigned int
		VT_INT       =   0x16  22	; Signed machine int
		VT_UINT      =   0x17  23	; Unsigned machine int
		VT_RECORD    =   0x24  36	; User-defined type
		VT_ARRAY     = 0x2000  		; SAFEARRAY
		VT_BYREF     = 0x4000  		; Pointer to another type of value
					 = 0x1000  4096
		COM_VariantChangeType(pvarDst, pvarSrc, vt=8) {
			return DllCall("oleaut32\VariantChangeTypeEx", "ptr",pvarDst, "ptr",pvarSrc, "Uint",1024, "Ushort",0, "Ushort",vt)
		}
		COM_VariantClear(pvar) {
			DllCall("oleaut32\VariantClear", "ptr",pvar)
		}
		COM_SysAllocString(str) {
			Return	DllCall("oleaut32\SysAllocString", "Uint", &str)
		}
		COM_SysFreeString(pstr) {
				DllCall("oleaut32\SysFreeString", "Uint", pstr)
		}
		COM_SysString(ByRef wString, sString) {
			VarSetCapacity(wString,4+nLen:=2*StrLen(sString))
			Return	DllCall("kernel32\lstrcpyW","Uint",NumPut(nLen,wString),"Uint",&sString)
		}
	*/
	}
	UIA_VariantChangeType(pvarDst, pvarSrc, vt=8) { ; written by Sean
		return DllCall("oleaut32\VariantChangeTypeEx", "ptr",pvarDst, "ptr",pvarSrc, "Uint",1024, "Ushort",0, "Ushort",vt)
	}
	UIA_VariantClear(pvar) { ; Written by Sean
		DllCall("oleaut32\VariantClear", "ptr",pvar)
	}
}
MsgBox(msg) {
	MsgBox %msg%
}

/*
enum TreeScope
    {	TreeScope_Element	= 0x1,
	TreeScope_Children	= 0x2,
	TreeScope_Descendants	= 0x4,
	TreeScope_Parent	= 0x8,
	TreeScope_Ancestors	= 0x10,
	TreeScope_Subtree	= ( ( TreeScope_Element | TreeScope_Children )  | TreeScope_Descendants ) 
    } ;
DllCall("oleaut32\SafeArrayGetVartype", "ptr*",ComObjValue(SafeArray), "uint*",pvt)
HRESULT SafeArrayGetVartype(
  _In_   SAFEARRAY *psa,
  _Out_  VARTYPE *pvt
);
DllCall("oleaut32\SafeArrayDestroy", "ptr",ComObjValue(SafeArray))
HRESULT SafeArrayDestroy(
  _In_  SAFEARRAY *psa
);

1,017

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

#1001

Malcev пишет:

При нажатии show styles - стили скрываются, hide styles - появляются.
В вкладке control этой функции почему-то вообще нету.

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

Malcev пишет:

В IE стили контрола задисейблены

Так для него у меня стилей, оставил видимым чтобы можно было всегда включить.

Malcev пишет:

Принадлежность контрола к процессу решил не делать?

Пока нет, это же для десятки.

Добавил Acc path.

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

1,018

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

serzh82saratov пишет:

Так для него у меня стилей, оставил видимым чтобы можно было всегда включить.

Не совсем понял.

serzh82saratov пишет:

Пока нет, это же для десятки.

Это для любой виндовс.
Зависит от программы.
Например в IE каждая вкладка - отдельный процесс.

1,019

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

Malcev пишет:

Например в IE каждая вкладка - отдельный процесс.

Тогда может быть, пока не до этого. На практике это что может дать?

Malcev пишет:

Не совсем понял.

Так а что надо делать, скрывать кнопку если нет стилей для контрола?

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

1,020 (изменено: Malcev, 2019-01-03 15:51:57)

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

Почему нету?

HWND:  0x2067e  ▪  Focus control:  Internet Explorer_Server1
Style:  0x56000000  ▪  ExStyle:  0x00000000  ▪   show styles

На практике это нам может помочь избежать подобных вопросов:

teadrinker пишет:

Почему-то не определяется в Microsoft Edge, даже от администратора.

http://forum.script-coding.com/viewtopi … 98#p127898

1,021 (изменено: Malcev, 2019-01-03 16:09:11)

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

Вот хорошая утилита с кучей настроек для извлечения информации об окне:
https://dennisbabkin.com/php/downloads/WinID.zip
По этой ссылке не надо устанавливать:
http://www.manhunter.ru/download/25255/WinID.3.1.zip

1,022

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

А в чем отличие UIA_Interface?

2::
	MouseGetPos,  ,  , , ControlID, 2
	WinGet, pid, PID, ahk_id %ControlID%
	WinGet, Name, ProcessName, ahk_pid %pid%
	ToolTip %  name "`n" pid
	return
Malcev пишет:

Вот хорошая утилита с кучей настроек для извлечения информации об окне:
https://dennisbabkin.com/php/downloads/WinID.zip

Спасибо, а что там за плюшки?

Malcev пишет:

Почему нету?

Ну так у нас нет их определения.

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

1,023

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

serzh82saratov пишет:

А в чем отличие UIA_Interface?

UIA_Interface покажет настоящий процесс контрола, окно которого запущена через ApplicationFrameHost на win10 или WWAHost на Win8.

serzh82saratov пишет:

что там за плюшки?

Много различной информации об окне.

serzh82saratov пишет:

Ну так у нас нет их определения.

Можно взять msdn:
https://docs.microsoft.com/en-us/window … /constants

1,024

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

Malcev пишет:

UIA_Interface покажет настоящий процесс контрола, окно которого запущена через ApplicationFrameHost на win10 или WWAHost на Win8.

У меня нет протестировать, так WinGet, pid не правильно показывает в этих случаях?

Malcev пишет:

Много различной информации об окне.

Так это смотреть надо, я думал ты что то конкретное предлагаешь.

Malcev пишет:

Можно взять msdn:

Так это стили окна, что они могут сказать про контрол?

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

1,025 (изменено: Malcev, 2019-01-03 17:02:38)

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

serzh82saratov пишет:

Так это стили окна, что они могут сказать про контрол?

Так контрол - это и есть окно.

serzh82saratov пишет:

Так это смотреть надо, я думал ты что то конкретное предлагаешь.

Я предложил посмотреть, как это сделано в довольно хорошей утилите.

serzh82saratov пишет:

WinGet, pid не правильно показывает в этих случаях?

Не правильно. Показывает процесс ApplicationFrameHost.

1,026

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

Malcev пишет:

Так контрол - это и есть окно.

Предлагаешь применять к тем контролам у которых нет специфичных стилей?

Malcev пишет:

Показывает процесс ApplicationFrameHost.

А в каком виде инфо выводить?

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

1,027

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

Предлагаю выводить и те и другие, как сделано в утилите winId.

serzh82saratov пишет:

А в каком виде инфо выводить?

Можно в графе контрол писать, также как и в графе windows - название процесса и его PID.

1,028

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

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

1,029 (изменено: serzh82saratov, 2019-01-03 18:56:03)

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

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

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

1,030 (изменено: Malcev, 2019-01-04 13:40:05)

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

Наверное как-нибудь так:

ES_LEFT := 0
ES_CENTER := 1
ES_RIGHT := 2

style := 0x50300104
if !(style & (ES_CENTER|ES_RIGHT))
  msgbox left

Алгоритм можно взять отсюда:
https://github.com/strobejb/winspy/blob … tyleInfo.c
Список стилей лучше брать отсюда:
https://www.autohotkey.com/boards/viewt … amp;t=4557

1,031 (изменено: serzh82saratov, 2019-01-05 09:29:23)

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

Я тут смотрел стили https://autohotkey.com/board/topic/70454-gui-constants/

Malcev пишет:

Алгоритм можно взять отсюда:

Я там мало что понял.
И в твоём примере тоже. Если нет ни того ни другого стиля, то есть нулевой? То есть если не определено ни одного, например из 20 стилей, то значит есть все нулевые?
Их же там много.

Styles.Static := {"SS_LEFT":"0x00000000","SS_CENTER":"0x00000001","SS_RIGHT":"0x00000002","SS_ICON":"0x00000003","SS_BLACKRECT":"0x00000004","SS_GRAYRECT":"0x00000005","SS_WHITERECT":"0x00000006"
			,"SS_BLACKFRAME":"0x00000007","SS_GRAYFRAME":"0x00000008","SS_WHITEFRAME":"0x00000009","SS_USERITEM":"0x0000000A","SS_SIMPLE":"0x0000000B","SS_LEFTNOWORDWRAP":"0x0000000C","SS_OWNERDRAW":"0x0000000D"
			,"SS_BITMAP":"0x0000000E","SS_ENHMETAFILE":"0x0000000F","SS_ETCHEDHORZ":"0x00000010","SS_ETCHEDVERT":"0x00000011","SS_ETCHEDFRAME":"0x00000012","SS_TYPEMASK":"0x0000001F","SS_REALSIZECONTROL":"0x00000040"
			,"SS_NOPREFIX":"0x00000080","SS_NOTIFY":"0x00000100","SS_CENTERIMAGE":"0x00000200","SS_RIGHTJUST":"0x00000400","SS_REALSIZEIMAGE":"0x00000800","SS_SUNKEN":"0x00001000","SS_EDITCONTROL":"0x00002000"
			,"SS_ENDELLIPSIS":"0x00004000","SS_PATHELLIPSIS":"0x00008000","SS_WORDELLIPSIS":"0x0000C000","SS_ELLIPSISMASK":"0x0000C000"}

В Button 2 нулевых,  BS_PUSHBUTTON и BS_TEXT:

		Styles.Button := {"BS_PUSHBUTTON":"0x00000000","BS_DEFPUSHBUTTON":"0x00000001","BS_CHECKBOX":"0x00000002","BS_AUTOCHECKBOX":"0x00000003","BS_RADIOBUTTON":"0x00000004","BS_3STATE":"0x00000005"
			,"BS_AUTO3STATE":"0x00000006","BS_GROUPBOX":"0x00000007","BS_USERBUTTON":"0x00000008","BS_AUTORADIOBUTTON":"0x00000009","BS_PUSHBOX":"0x0000000A","BS_OWNERDRAW":"0x0000000B"
			,"BS_TYPEMASK":"0x0000000F","BS_LEFTTEXT":"0x00000020","BS_TEXT":"0x00000000","BS_ICON":"0x00000040","BS_BITMAP":"0x00000080","BS_LEFT":"0x00000100","BS_RIGHT":"0x00000200","BS_CENTER":"0x00000300"
			,"BS_TOP":"0x00000400","BS_BOTTOM":"0x00000800","BS_VCENTER":"0x00000C00","BS_PUSHLIKE":"0x00001000","BS_MULTILINE":"0x00002000","BS_NOTIFY":"0x00004000","BS_FLAT":"0x00008000"
			,"BS_RIGHTBUTTON":"0x00000020","BS_SPLITBUTTON":"0x0000000C","BS_DEFSPLITBUTTON":"0x0000000D","BS_COMMANDLINK":"0x0000000E","BS_DEFCOMMANDLINK":"0x0000000F"}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,032 (изменено: Malcev, 2019-01-05 13:24:24)

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

serzh82saratov пишет:

Я тут смотрел стили https://autohotkey.com/board/topic/70454-gui-constants

Это старая ссылка. Новая тут:
https://www.autohotkey.com/boards/viewt … amp;t=4557
Например у нас есть контрол static, он же дочернее окно static.
У него могут быть следующие стили:
1) общие, для всех окон:
https://github.com/AHK-just-me/AHK_Gui_ … s.ahk#L238
В тех стилях только 1 нулевой WS_OVERLAPPED, он же WS_TILED.
Заходим по этой ссылке и вбиваем в поиск WS_OVERLAPPED.
https://github.com/strobejb/winspy/blob … tyleInfo.c
Видим:

STYLE_(WS_OVERLAPPED), 0, -1, (WS_POPUP|WS_CHILD), //0x00000000

Из этого следует, что окно у которого нету ни WS_POPUP ни WS_CHILD стиля считается WS_OVERLAPPED.

if !(style & (WS_POPUP|WS_CHILD))
  msgbox WS_OVERLAPPED

2) Стили присущие данному типу дочернего окна:
https://github.com/AHK-just-me/AHK_Gui_ … ic.ahk#L19
Нулевой там только SS_LEFT.
Заходим опять по ссылке исходника winspy и видим:

STYLE_(SS_LEFT), 0x1f, -1,SS_CENTER|SS_RIGHT,//0x0000

Из чего делаем вывод, что стиль SS_LEFT будет у дочернего контрола static у которого нету ни SS_CENTER ни SS_RIGHT.
3) Теперь смотрим расширенные стили по такому же алгоритму.
Общие расширенные стили:
https://github.com/AHK-just-me/AHK_Gui_ … s.ahk#L267

WS_EX_LEFT
STYLE_(WS_EX_LEFT), 0, -1, (WS_EX_RIGHT), //0x00000000L   ; если нет стиля WS_EX_RIGHT, то значит есть стиль WS_EX_LEFT
WS_EX_LTRREADING
STYLE_(WS_EX_LTRREADING), 0, -1, (WS_EX_RTLREADING), //0x00000000L
WS_EX_RIGHTSCROLLBAR
STYLE_(WS_EX_RIGHTSCROLLBAR), 0, -1, (WS_EX_LEFTSCROLLBAR),//0x00000000L

Расширенных же стилей для конкретно контрола static нет.
Ну и если какие-то стили определить не удалось, то, думаю, стоит показывать просто их значение.
Посмотри как показывает WinId при наведении на Notepad++ (0x2000).
Хотя у него баг - перепутаны колонки (0x2000 надо в колонку style, а WS_EX_CLIENTEDGE в ExStyle).

1,033 (изменено: serzh82saratov, 2019-01-05 14:30:24)

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

Во спасибо, объяснил так объяснил.
А где он это !(style & (WS_POPUP|WS_CHILD)) взял, на мсдн почему то нет такого описания. https://docs.microsoft.com/en-us/window … ton-styles

Это старая ссылка. Новая тут:

В WinId вроде старые стили, на момент ХР. Например там нет:

BS_SPLITBUTTON       := 0x000C   ; >= Vista

Думаешь между ссылками на форуме есть разница в стилях?

То есть нулевые выводить не как

BS_PUSHBUTTON:= 0x00000000

а как

BS_PUSHBUTTON := !(BS_DEFPUSHBUTTON|BS_CHECKBOX|BS_AUTOCHECKBOX|BS_RADIOBUTTON|BS_GROUPBOX|BS_AUTORADIOBUTTON)

Кстати BS_PUSHBUTTON там не как все, а без (),//0x00000000, это может что то значить. https://github.com/strobejb/winspy/blob … nfo.c#L106
Простые оконные стили и дочерние вроде не пересекаются по значениям, а расширенные имеют совпадения например LVS_EX_MULTIWORKAREAS и WS_EX_RTLREADING, выводить и тот и другой?

Ну и если какие-то стили определить не удалось, то, думаю, стоит показывать просто их значение.

Это займёт много места, а если выводить оконные стили, то очень много. Может сделать это опционально, и в таком режиме сделать возможность включения и выключения каждого стиля.

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

1,034 (изменено: serzh82saratov, 2019-01-05 15:44:52)

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

serzh82saratov пишет:

Кстати BS_PUSHBUTTON там не как все, а без (),//0x00000000

Вот ещё:

STYLE_(WS_MAXIMIZEBOX),			0, WS_POPUPWINDOW|WS_OVERLAPPEDWINDOW|WS_CAPTION, 0, //0x00010000
мсдн пишет:

WS_MAXIMIZEBOX
0x00010000L
В окне есть кнопка максимизации. Нельзя комбинировать со стилем WS_EX_CONTEXTHELP . Стиль WS_SYSMENU также должен быть указан.

При этом

мсдн пишет:

WS_TABSTOP
0x00010000L

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

1,035

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

serzh82saratov пишет:

А где он это !(style & (WS_POPUP|WS_CHILD)) взял, на мсдн почему то нет такого описания

Думаю пришел к этому выводу логически.

serzh82saratov пишет:

Думаешь между ссылками на форуме есть разница в стилях?

Я проверял - на новом форуме добавлены новые стили.
Нулевые я проверял так:

ES_LEFT := 0
ES_CENTER := 1
ES_RIGHT := 2

style := 0x50300104   ; left
if !(style & (ES_CENTER|ES_RIGHT))
  msgbox left
else
   msgbox right or center

style := 0x50300106   ; right
if !(style & (ES_CENTER|ES_RIGHT))
  msgbox left
else
   msgbox right or center

Насчет кнопок - первые 11 флагов экслюзивные:

STYLE_(BS_DEFPUSHBUTTON), 0xf, -1, 0, //0x0001

поэтому нужно проверять так:

msgbox % style & 0xF
serzh82saratov пишет:

Это займёт много места

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

serzh82saratov пишет:

Вот ещё:

WS_MAXIMIZEBOX - может быть только у родительского окна, а WS_TABSTOP только у дочернего.

1,036

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

Malcev пишет:

Я проверял - на новом форуме добавлены новые стили.

По отношению к старому форуму, пример можно.

STYLE_(BS_DEFPUSHBUTTON), 0xf, -1, 0, //0x0001

Что за 0xf?
Тогда у него получается что сразу все эти стили есть, если есть 0xf, и что значат тогда 0x0001 - 0x0009...

STYLE_(BS_DEFPUSHBUTTON), 0xf, -1, 0, //0x0001
STYLE_(BS_CHECKBOX), 0xf, -1, 0, //0x0002
STYLE_(BS_AUTOCHECKBOX), 0xf, -1, 0, //0x0003
STYLE_(BS_RADIOBUTTON), 0xf, -1, 0, //0x0004
STYLE_(BS_3STATE), 0xf, -1, 0, //0x0005
STYLE_(BS_AUTO3STATE), 0xf, -1, 0, //0x0006
STYLE_(BS_GROUPBOX), 0xf, -1, 0, //0x0007
STYLE_(BS_USERBUTTON), 0xf, -1, 0, //0x0008
STYLE_(BS_AUTORADIOBUTTON), 0xf, -1, 0, //0x0009
STYLE_(BS_OWNERDRAW), 0xf, -1, 0,

Если же, про вывод остатка от неопределенных стилей - то на одну строку больше.

Не понял, это как.

WS_MAXIMIZEBOX - может быть только у родительского окна, а WS_TABSTOP только у дочернего.

У где

STYLE_(WS_MAXIMIZEBOX), 0, WS_POPUPWINDOW|WS_OVERLAPPEDWINDOW|WS_CAPTION, 0, //0x00010000
STYLE_(WS_TABSTOP), 0, -1, 0, //0x00010000

тут проверка родительского или дочернего, в WS_TABSTOP вообще пусто. Что значит //0x00010000 одинаковые в обоих случаях.
WS_MAXIMIZEBOX и ...|WS_CAPTION, есть MAXIMIZEBOX если нет заголовка?

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

1,037

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

serzh82saratov пишет:

По отношению к старому форуму, пример можно.

https://github.com/AHK-just-me/AHK_Gui_ … oolbar.ahk

serzh82saratov пишет:

Что за 0xf?

Отделение младших битов от старших.

serzh82saratov пишет:

что значат тогда 0x0001 - 0x0009

Значения этих стилей. Так как они экслюзивные, то будет именно один из них.

style := 0x5000010B   ; bs_ownerdraw
msgbox % 0x5000010B & 0xf
serzh82saratov пишет:

Не понял, это как.

Смотри как показывает WinId в ноутпад++.

serzh82saratov пишет:

где тут проверка родительского или дочернего

Я C++ не знаю, поэтому могу только делать предположения основываясь на логике.
Наверное он вначале проверяет не является ли окно WS_POPUPWINDOW или WS_OVERLAPPEDWINDOW или WS_CAPTION, если является значит WS_MAXIMIZEBOX.
Наверное если совместить WS_CHILD с WS_CAPTION с 0x00010000, то получим WS_MAXIMIZEBOX.
Можно такое окно создать и протестировать.

1,038

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

Я нашёл что у меня нет ComboBoxEx32, ToolbarWindow32, SysHeader32, msctls_hotkey32, SysLink. И не понял для каких классов контролов Const_ImageList и Const_Controls?

Malcev пишет:

Отделение младших битов от старших.

Можешь разжевать, я с битами и байтами так и не подружился. )

Malcev пишет:

Смотри как показывает WinId в ноутпад++.

Показывает только те которые есть.

Malcev пишет:

не является ли окно WS_POPUPWINDOW или WS_OVERLAPPEDWINDOW или WS_CAPTION, если является значит WS_MAXIMIZEBOX.

Опять путаница, до этого мы смотрели чтобы не было ни одного из стилей, теперь смотрим есть ли один из стилей... И почему если у окна есть заголовок, то обязательно должен быть MAXIMIZEBOX?

SetFormat, IntegerFast, h
Gui, -MaximizeBox -MinimizeBox +Caption +HWNDhGui
Gui, Show, w111 h111 x111 yCenter
WinGet, WinStyle, Style, ahk_id %hGui%
MsgBox % WinStyle
ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,039

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

У Const_ImageList стилей нету, там лишь флаги для создания слайдшоу.
https://docs.microsoft.com/en-us/window … -reference
Const_Controls:
https://docs.microsoft.com/en-us/window … rol-styles

serzh82saratov пишет:

я с битами и байтами так и не подружился

https://autoit-script.ru/autoit3_docs/t … itFlag.htm

serzh82saratov пишет:

Показывает только те которые есть.

У меня при наведении на ноутпад++:

Parent Class: Notepad++
Wnd Styles: 0x52302000 = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL | 0x2000
Wnd ExStyles: 0x200 = WS_EX_CLIENTEDGE

serzh82saratov пишет:

если у окна есть заголовок, то обязательно должен быть MAXIMIZEBOX?

Если у окна есть WS_POPUPWINDOW или WS_OVERLAPPEDWINDOW или WS_CAPTION, и если у него есть флаг со значением 0x00010000, то это будет WS_MAXIMIZEBOX.

1,040 (изменено: Malcev, 2019-01-06 02:02:46)

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

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

Gui, Add, ListView, +icon +LV0x2000 +E0x2000  +hwndhwnd
Gui, Show
SendMessage, 0x1037, 0, 0, , % "ahk_id " hwnd  ; LVM_GETEXTENDEDLISTVIEWSTYLE
msgbox % errorlevel

То есть у контрола нужно определять стили, дополнительные стили и дополнительные стили, присущие только данному контролу 3 разными командами.
И для каждого контрола нужно создавать массив из стиля + операций с битами для данного стиля + сравнение с другими присутствующими стилями, который потом парсить и выполнять нужные для каждого стиля действия.

1,041

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

С ума сойти можно с этими стилями. (

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

1,042

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

Я не думал, что так муторно будет.
Вопрос - насколько это необходимо в ahkspy?
Кстати, стили которых на форуме нет:
https://docs.microsoft.com/en-us/window … rol-styles
https://docs.microsoft.com/en-us/window … rol-styles
https://docs.microsoft.com/en-us/window … rol-styles
https://docs.microsoft.com/en-us/window … rol-styles

1,043

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

Да, не знаю даже, овчинка выделки... Лучше удалить стили и не позорится. Открыл для себя Window Detective, там и стили можно включать, и структура окон и контролов есть, которую давно хотел сделать, а тут приятный и сразу понятный фейс, вообщем всё что сам хотел добавить, но зачем так тужится если всё и так есть, видимо концепции что нибудь по быстрому определить под курсором, и кнопочки понажимать, мне будет достаточно.
Хотя стили может оставить только те, которые "однозначно" определяются, типа Style & WS_CAPTION?

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

1,044 (изменено: Malcev, 2019-01-06 23:37:49)

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

У меня window detective не показывает расширенные стили присущие контролу listview.
Пишет об ошибке доступа.

Gui, Add, ListView, +icon +LV0x2000 +E0x2000  +hwndhwnd
Gui, Show

Да и вообще он с багами.
Например здесь он показывает и WS_TABSTOP и WS_MAXIMIZEBOX на edit контролах:

Gui, Add, edit, +0x00C00000 +0x00080000 +0x00010000 w100 h100
Gui, Add, edit, +0x00C00000  w100 h100
Gui, Show, w300 h300

А это неправильно, так как не может быть у флагов одинаковых значений кроме дефалтных нулей + сумма в итоге будет на 0x00010000 больше.
И из второго edit я убрал WS_SYSMENU, а без него WS_MAXIMIZEBOX быть не может, window detective же всё-равно показывает WS_MAXIMIZEBOX.

WS_MAXIMIZEBOX
0x00010000L
The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.

https://docs.microsoft.com/en-us/window … dow-styles
Майкрософтский WinSpy++ и другие утилиты (WinId, WinSpy++) показывают WS_TABSTOP.
Так что, наверное, принято считать, что у дочернего окна не может быть WS_MAXIMIZEBOX.
Насчет ShkSpy, тут либо вообще определение стилей из него убирать (из окна тоже), либо доводить всё до ума, беря во внимание контролы.
Так как сейчас он показывает неправильно ни там ни там.
Но лично мне копаться в них уже неинтересно.
Как это работает я понял, а вникать в пол-тысячи стилей и изучать как они друг с другом взаимодействуют, желания особого нет.

1,045

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

Malcev пишет:

У меня window detective не показывает расширенные стили присущие контролу listview.
Пишет об ошибке доступа.

У меня показывает.
http://images.vfl.ru/ii/1546803515/8f68689a/24845311.png

Да и вообще он с багами.

Есть такое, а что без багов да за бесплатно. Мне главное что дерево окон есть.

Насчет ShkSpy, тут либо вообще определение стилей из него убирать (из окна тоже), либо доводить всё до ума, беря во внимание контролы.
Так как сейчас он показывает неправильно ни там ни там.

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

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

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

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

1,046

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

serzh82saratov пишет:

кроме нас всё равно никто не юзает

А есть статистика?
Я думаю используют, так как на форуме было несколько вопросов связанных с AhkSpy.
Можно следующим апдейтом отправлять информацию о скачавших.

1,047

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

Malcev пишет:

Можно следующим апдейтом отправлять информацию о скачавших.

А это как, на гитхабе как то смотреть?

Malcev пишет:

Я думаю используют, так как на форуме было несколько вопросов связанных с AhkSpy

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

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

1,048

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

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

1,049

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

В "Control" добавлен вывод пути контрола в иерархии окна.
Может быть удобно в программах с изменяющимися ClassNN контролов, но конечно перед использованием надо понаблюдать за тем что иерархия не меняется.
Передаём путь и хэндл окна, получаем хэндл контрола.

ChildFromPath(str, hwnd) 
{
	Static GW_HWNDNEXT := 2, GW_CHILD := 5
	hwnd := DllCall("GetWindow", "Ptr", hwnd, UInt, GW_CHILD, "Ptr")
	arr := StrSplit(str, ","), off := 1, i := 1
	Loop 
	{
		If (i = arr[off])
		{
			If (off = arr.Count())
				return hwnd
			hwnd := DllCall("GetWindow", "Ptr", hwnd, UInt, GW_CHILD, "Ptr"), ++off, i := 1 
		}
		Else If (++i) && !(hwnd := DllCall("GetWindow", "Ptr", hwnd, UInt, GW_HWNDNEXT, "Ptr"))
			return   
	}
} 

В меню View добавлены:

Dynamic control path - Показывает путь контрола в иерархии окна, не по запросу, а постоянно. Снижает производительность.

Dynamic accesible path - Показывает путь объекта в иерархии родительского объекта, не по запросу, а постоянно. Снижает производительность.

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

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

1,050

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

serzh82saratov пишет:

так что активных пользователей нет

Я иногда пользуюсь!

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

1,051

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

Вот я и говорю один активный пользователь, и один пассивный. Больше никого.

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

1,052

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

Навскидку несколько сотен пассивных пользователей. Если обернуть ссылки через сокращатели, то можно получить статистику загрузок.
https://s8.hostingkartinok.com/uploads/images/2019/01/85f2cdc29c1b564dd917950aacab8f74.png
Кол-во активных пользователей можно получить, делая единичный http запрос с каждой машины.

1,053

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

Malcev пишет:

Принадлежность контрола к процессу решил не делать?

Надо включить UIA detect control parent process в View settings.

stealzy пишет:

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

Можно пошагово, ничего не понял.

stealzy пишет:

делая единичный http запрос с каждой машины.

Это на свой сервер, или на гитхаб.

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

1,054

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

Мне кажется, что статистика будет вернее по количеству получивших апдейт.
Так как человек может скачать-посмотреть и больше не использовать.
А на гитхабе такую статистику можно узнать, по-моему, только сделав релиз.
serzh82saratov, не хочешь сделать ради интереса?

1,055

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

А можно сделать, как предложил stealzy, так проще будет:
https://lifehacker.ru/alternativy-goo-gl

1,056 (изменено: Malcev, 2019-01-22 18:36:07)

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

serzh82saratov пишет:

Надо включить UIA detect control parent process в View settings.

Не уверен на счет правильности формулировки - "control parent process".
На Msdn это: process identifier (ID) of this element.
https://docs.microsoft.com/en-us/dotnet … work-4.7.2
И мне кажется, что его надо всегда показывать, а не сравнивать с PID окна, так как пропадает наглядность об изменении процесса.

1,057

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

Process ID of this control (UIA detect)

Если так?

Malcev пишет:

наглядность об изменении процесса.

По моему наоборот, если PID не как в заголовке Window, то появляется новая строка, а если постоянно показывать, то надо самому смотреть в Window, таким образом не очевидно когда процесс другой.

Malcev пишет:

А можно сделать, как предложил stealzy, так проще будет:

С ссылками понял схему, а чем релиз сложен или неудобен, я просто не вникал.

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

1,058

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

serzh82saratov пишет:

Если так?

Можно короче: ProcessId (UIA detect).

serzh82saratov пишет:

, если PID не как в заголовке Window, то появляется новая строка, а если постоянно показывать, то надо самому смотреть в Window, таким образом не очевидно когда процесс другой.

Да, так удобней.

serzh82saratov пишет:

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

Да я тоже, но наверное тем, что скачивается как архив и придется его при апдейте разархивировать.

1,059

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

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

stealzy пишет:

А смысл в релизах для некомпилируемых скриптов?

?

Malcev пишет:

скачивается как архив и придется его при апдейте разархивировать

Я там даже не понял как в них вносить изменения.

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

1,060

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

serzh82saratov пишет:

ассинхронный запрос не успевает перед выходом.

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

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

1,061

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

serzh82saratov пишет:

Я там даже не понял как в них вносить изменения.

Не смогу помочь - ни разу релизы не делал.

1,062

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

Баг: если при активном окне IE навести мышку на ahkspy, то иногда процесс контрола меняется на процесс AHKSpy.

1,063

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

serzh82saratov пишет:

надо переходить при выборе обновления

Ну можно и не так прямо :-), я бы в новой версии выделил пустой параметр в ini, пока параметр пуст скрипт пытается выполнит http запрос на заготовленную ссылку, как только запрос успешно осуществлен, параметр инициализируется и больше скрипт запросов не совершает (независимо от обновления). Таким образом получаем кол-во пользователей, которые запускали хоть раз скрипт начиная с новой версии и у которых разрешен доступ в инет интерпретатору ahk.

Релизы можно изменять из интерфейса сайта, хотя зачем менять релизы?

1,064

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

serzh82saratov пишет:
stealzy пишет:

А смысл в релизах для некомпилируемых скриптов?

?.

Релизы то для компилируемых языков задуманы, чтобы пользователь не собирал сам из кода с гитхаба или не искал скомпилированую прогу на sourceforge.net.

1,065

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

Malcev пишет:

Баг: если при активном окне IE навести мышку на ahkspy, то иногда процесс контрола меняется на процесс AHKSpy.

Не удалось такого поймать. Добавил сравнение со своим ид.

stealzy пишет:

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

Да будет так, начиная с 3.48.

stealzy пишет:

хотя зачем менять релизы?

Я так и не понял, что это такое и с чем его едят.

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

1,066 (изменено: Malcev, 2019-01-23 00:28:21)

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

serzh82saratov пишет:

Не удалось такого поймать. Добавил сравнение со своим ид.

Сейчас просто иногда PID пропадает.
Открой IE, рядом с ним поставь AhkSpy, слева в пикселях 50 от AhkSpy поставь мышку и запусти следующий код.

f11::
loop
{
   MouseMove, 100, 0, 0, R
   sleep 500
   MouseMove, -100, 0, 0, R
}
f12::Pause, toggle
serzh82saratov пишет:

Я так и не понял, что это такое и с чем его едят.

https://habr.com/ru/post/185444/
Я релизы предлагал делать для учета статистики на гитхаб, так как не знал про способ сокращенных ссылок.

1,067

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

Я по ссылке ходил, там нет описания.

Malcev пишет:

поставь мышку и запусти следующий код.

Оставив на 5 минут получил:

Error:  Memory limit reached (see #MaxMem in the help file).

И до этого были какие то ошибки связанные с UIA.

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

1,068

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

Наверное не в UIA дело.
Так как пропадает также все из "Info - Internet Explorer_Server".

serzh82saratov пишет:

Я по ссылке ходил, там нет описания.

А что конкретно тебя интересует? Как создать релиз?

1,069

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

Malcev пишет:

Так как пропадает также все из "Info - Internet Explorer_Server".

У меня не пропадает, не знаю в чём может быть дело, какой то жестокий краш тест.

Malcev пишет:

А что конкретно тебя интересует? Как создать релиз?

В первую очередь зачем это нужно.

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

1,070

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

---------------------------
AhkSpy.ahk
---------------------------
Error:  0x80004005 - Unspecified error.

Specifically: ElementFromPoint  (UIA_Interface)

Line#
818: }
819: if ViewStrPos 
820: ViewStrPos1 := _DP "<span name='MS:'>" CtrlX ", " CtrlY ", " CtrlX2 ", " CtrlY2 "</span>" _DP "<span name='MS:'>" CtrlX ", " CtrlY ", " CtrlW ", " CtrlH "</span>", ViewStrPos2 := _DP "<span name='MS:'>" CtrlCAX ", " CtrlCAY ", " CtrlCAX2 ", " CtrlCAY2 "</span>" _DP "<span name='MS:'>" CtrlCAX ", " CtrlCAY ", " CtrlW ", " CtrlH "</span>" 
823: if DynamicControlPath && ControlID 
824: control_path_value := ChildToPath(ControlID)
825: if UseUIA 
826: {
---> 827: UIAPID := oUIAInterface.ElementFromPoint().CurrentProcessId
828: if (UIAPID && UIAPID != WinPID && UIAPID != oOther.CurrentProcessId) 
829: {
830: WinGet,UIAProcessParent,ProcessName,ahk_id %WinID%
831: WinGet,UIAProcessPath,ProcessPath,ahk_id %WinID%
832: Loop,%UIAProcessPath%
833: UIAProcessPath = %A_LoopFileLongPath%
834: UseUIAStr =
<span class='param'>ProcessId (UIA detect):</span>  <span name='MS:'>%UIAPID%</span>%_DP%<span name='MS:'>%UIAProcessParent%</span>%_DP%<span name='MS:'>%UIAProcessPath%</span>

The current thread will exit.
---------------------------
ОК   
---------------------------

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

1,071 (изменено: Malcev, 2019-01-23 03:05:13)

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

serzh82saratov пишет:

В первую очередь зачем это нужно.

Так stealzy же уже ответил.

stealzy пишет:

Релизы то для компилируемых языков задуманы, чтобы пользователь не собирал сам из кода с гитхаба или не искал скомпилированую прогу на sourceforge.net.

serzh82saratov пишет:

У меня не пропадает, не знаю в чём может быть дело, какой то жестокий краш тест.

А у меня и без теста пропадает.
При этом:
Info - Internet Explorer_Server - пусто
Tag name: HTML:

Pos: x0 y0  ▪  x²630 y²802  ▪  Size: w631 h803
Index:  1

Outer HTML:

<HTML><HEAD>
<META http-equiv=X-UA-Compatible content=IE=8>
<STYLE id=css_ColorBg type=text/css>.title, .button {background-color: #FFFFFF;}</STYLE>

<STYLE id=css_PreOverflowHide type=text/css></STYLE>

<STYLE id=css_Body type=text/css>body {word-wrap: break-word; overflow-x: hidden;} .lpre {overflow-x: hidden;}</STYLE>

<SCRIPT type=text/javascript>
	var prWidth, WordWrap, MoveTitles, key1, key2, ButtonOver, ButtonOverColor;
	function shift(scroll) {
		var col, Width, clientWidth, scrollLeft, Offset;
		clientWidth = document.documentElement.clientWidth;
		if (clientWidth < 0)
			return
		scrollLeft = document.documentElement.scrollLeft;
		Width = (clientWidth + scrollLeft);
		if (scroll && Width == prWidth)
			return
		if (MoveTitles == 1) {
			Offset = ((clientWidth / 100 * 30) + scrollLeft);
			col = document.querySelectorAll('.con');
			for (var i = 0; i < col.length; i++) {
				col[i].style.left = Offset + "px";
			}
		}
		col = document.querySelectorAll('.box');
		for (var i = 0; i < col.length; i++) {
			col[i].style.width = Width + 'px';
		}
		prWidth = Width;
	}
	function conleft30() {
		col = document.querySelectorAll('.con');
		for (var i = 0; i < col.length; i++) {
			col[i].style.left = "30%";
		}
	}
	function menuitemdisplay(param) {
		col = document.querySelectorAll('.menuitemid');
		for (var i = 0; i < col.length; i++) {
			col[i].style.display = param;
		}
	}
	function removemenuitem(parent, selector) {
		col = parent.querySelectorAll(selector);
		for (var i = 0; i < col.length; i++) {
			parent.removeChild(col[i])
		}
	}
	onresize = function() {
		shift(0);
	}
	onscroll = function() {
		if (WordWrap == 1)
			return
		shift(1);
	}
	function OnButtonDown (el) {
		if (window.event.button != 1)   //  only left button https://msdn.microsoft.com/en-us/library/aa703876(v=vs.85).aspx
			return
		el.style.backgroundColor = "#96C3DC";
		el.style.color = "#fff";
		el.style.border = "1px solid black";
	}
	function OnButtonUp (el) {
		el.style.backgroundColor = "";
		// el.style.color = (el.name != "pre" ? "#000000" : "#189200");
		el.style.color = ButtonOverColor;
		if (window.event.button == 2 && el.parentElement.className == 'BB')
			document.documentElement.focus();
	}
	function OnButtonOver (el) {
		ButtonOverColor = el.style.color;
		el.style.zIndex = "2";
		el.style.border = "1px solid black";
		ButtonOver = el;
	}
	function OnButtonOut (el) {
		el.style.zIndex = "0";
		el.style.backgroundColor = "";
		// el.style.color = (el.name != "pre" ? "#000000" : "#189200");
		el.style.color = ButtonOverColor;
		el.style.border = "1px dotted black";
		ButtonOver = 0;
	}
	function Assync (param) {
		setTimeout(param, 1);
	}
	function ElementName (param) {
		try {
			el = document.querySelector("[name=" + param + "]");
		} catch (e) {
			return
		}
		return el
	}
	//	alert(value);
	//	tooltip(value);
</SCRIPT>

<SCRIPT id=hkinputevent type=text/javascript>
	function funchkinputevent(el, eventname) {
		key1 = el, key2 = eventname;
		hkinputevent.click();
		if (eventname == 'focus')
			el.style.border = "1px solid #4A8DFF";
		else
			el.style.border = "1px dotted black";
	}
</SCRIPT>

<SCRIPT id=tooltipevent type=text/javascript>
	function tooltip(text) {
		key1 = text;
		tooltipevent.click();
	}
</SCRIPT>
</HEAD>
<BODY><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=__Mouse> ( Mouse ) </SPAN><SPAN class=button id=pause_button contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on"> pause </SPAN><SPAN style="POSITION: relative; MARGIN-RIGHT: 1em"></SPAN><SPAN style="POSITION: relative; MARGIN-RIGHT: 1em"></SPAN><SPAN class=button id=run_zoom contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on"> zoom </SPAN></SPAN></SPAN></SPAN><BR>
<P class=br></P><PRE contentEditable=true><SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=set_pos style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre">Screen:</SPAN></SPAN>  <SPAN name="MS:">x1193 y475</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=set_pos style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre">Window:</SPAN></SPAN>  <SPAN name="MS:">x1013 y429</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=set_pos style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre">Client:</SPAN></SPAN>  <SPAN name="MS:">x1009 y406</SPAN>
<SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=set_pos style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre">Relative window:</SPAN></SPAN>  <SPAN name="MS:">0.6411, 0.4347</SPAN>  <SPAN class=param>for</SPAN> <SPAN name="MS:">w1580 h987</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=set_pos style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre">Relative client:</SPAN></SPAN>  <SPAN name="MS:">0.6419, 0.4229</SPAN>  <SPAN class=param>for</SPAN> <SPAN name="MS:">w1572 h960</SPAN>
<SPAN class=param>Relative active window:</SPAN>  <SPAN name="MS:">x1013 y429</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>exe</SPAN> <SPAN name="MS:">iexplore.exe</SPAN> <SPAN class=param>class</SPAN> <SPAN name="MS:">IEFrame</SPAN> <SPAN class=param>hwnd</SPAN> <SPAN name="MS:">0x10464</SPAN></PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=__PixelColor> ( PixelColor ) </SPAN></SPAN></SPAN></SPAN><BR><PRE contentEditable=true><SPAN class=param>RGB: </SPAN> <SPAN name="MS:">0xE0E0E0</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">#E0E0E0</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>BGR: </SPAN> <SPAN name="MS:">0xE0E0E0</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">#E0E0E0</SPAN></PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=__Window> ( Window ) </SPAN></SPAN></SPAN></SPAN><BR><PRE contentEditable=true><SPAN><SPAN class=param name="MS:S">ahk_class</SPAN> <SPAN name="MS:">IEFrame</SPAN></SPAN> <SPAN><SPAN class=param name="MS:S">ahk_exe</SPAN> <SPAN name="MS:">iexplore.exe</SPAN></SPAN> <SPAN><SPAN class=param name="MS:S">ahk_id</SPAN> <SPAN name="MS:">0x10464</SPAN></SPAN> <SPAN><SPAN class=param name="MS:S">ahk_pid</SPAN> <SPAN name="MS:">4616</SPAN></SPAN>
<SPAN class=param>Cursor:</SPAN>  <SPAN name="MS:">Arrow</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>Caret:</SPAN>  <SPAN name="MS:">x297 y443</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>Client area:</SPAN>  <SPAN name="MS:">x4 y23 w1572 h960</SPAN>
<SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=set_button_focus_ctrl style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre">Focus control:</SPAN></SPAN>  <SPAN name="MS:">Internet Explorer_Server1</SPAN></PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=__Control> ( Control ) </SPAN></SPAN></SPAN></SPAN><BR><PRE contentEditable=true><SPAN class=param>Class NN:</SPAN>  <SPAN name="MS:">Internet Explorer_Server1</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>Win class:</SPAN>  <SPAN name="MS:">Internet Explorer_Server</SPAN>
<SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=set_button_pos style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre">Pos:</SPAN></SPAN>  <SPAN name="MS:">x4 y111</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">x²1575 y²962</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=set_button_pos style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre">Size:</SPAN></SPAN>  <SPAN name="MS:">w1572 h852</SPAN>
<SPAN class=param>Pos relative client area:</SPAN>  <SPAN name="MS:">x0 y88</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">x²1571 y²939</SPAN>
<SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=set_pos style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre">Mouse relative control:</SPAN></SPAN>  <SPAN name="MS:">x1009 y318</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">0.6419, 0.3732</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=control_path style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre"> Get path: </SPAN></SPAN>  <SPAN id=control_path_value name="MS:"></SPAN>
<SPAN class=param>HWND:</SPAN>  <SPAN name="MS:">0x70666</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>Parent control:</SPAN>  <SPAN name="MS:">Shell DocObject View</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">0x10636</SPAN>
<SPAN class=param>ProcessId (UIA detect):</SPAN>  <SPAN name="MS:">2908</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">iexplore.exe</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">C:\Program Files\Internet Explorer\iexplore.exe</SPAN>
<SPAN class=param>Style:</SPAN>  <SPAN id=c_Style name="MS:">0x56000000</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>ExStyle:</SPAN>  <SPAN id=c_ExStyle name="MS:">0x00000000</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=BB style="HEIGHT: 0px" contentEditable=false oncontextmenu="return false"><SPAN class=button id=get_styles_c style="COLOR: #c0c0c0" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on"> show styles </SPAN></SPAN></PRE><SPAN id=ControlStyles></SPAN><SPAN class=box><SPAN class=line><SPAN class=hr id=anchor></SPAN><SPAN class=con><SPAN class=title id=__Info_Class> ( Info - Internet Explorer_Server ) </SPAN><A></A></SPAN></SPAN></SPAN><BR><PRE contentEditable=true><SPAN class=param name="MS:N">Title:  </SPAN><SPAN name="MS:">Разработка скриптов</SPAN>
<SPAN class=param name="MS:N">URL:  </SPAN><SPAN name="MS:">http://script-coding.com/</SPAN></PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=P__Tag_name name="MS:N"> ( Tag name: <SPAN style="COLOR: #000000" name="MS:">LI</SPAN> ) </SPAN></SPAN></SPAN></SPAN><BR><PRE contentEditable=true><SPAN class=param>Pos: </SPAN><SPAN name="MS:">x48 y318</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">x²1547 y²336</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>Size: </SPAN><SPAN name="MS:">w1500 h18</SPAN>
<SPAN class=param name="MS:N">Index:  </SPAN><SPAN name="MS:">105</SPAN></PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=P__Outer_HTML style="COLOR: #189200"> ( Outer HTML ) </SPAN><A></A><SPAN class=button id=copy_button contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on"> copy </SPAN></SPAN></SPAN></SPAN><BR><PRE class=lpre contentEditable=true>&lt;li&gt;&lt;a href="ooRexx.html"&gt;Скриптовый язык Open Object Rexx&lt;/a&gt;&lt;/li&gt;</PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=P__Outer_Text style="COLOR: #189200"> ( Outer Text ) </SPAN><A></A><SPAN class=button id=copy_button contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on"> copy </SPAN></SPAN></SPAN></SPAN><BR><PRE class=lpre contentEditable=true>Скриптовый язык Open Object Rexx</PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=__AccInfo> ( Accessible ) </SPAN><A></A></SPAN></SPAN></SPAN><BR><PRE contentEditable=true><SPAN class=param>Type:</SPAN>  Parent  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param name="MS:N">ChildCount:  </SPAN><SPAN name="MS:">1</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=BB contentEditable=false oncontextmenu="return false"><SPAN class=button id=acc_path style="COLOR: #189200" contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on" name="pre"> Get path: </SPAN></SPAN>  <SPAN id=acc_path_value name="MS:"></SPAN></PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=P__Position_relative_Acc style="COLOR: #189200"> ( Position relative ) </SPAN></SPAN></SPAN></SPAN><BR><PRE contentEditable=true><SPAN class=param>Screen: </SPAN><SPAN name="MS:">x232 y475</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">x²1731 y²493</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>Size: </SPAN><SPAN name="MS:">w1500 h19</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>Mouse: </SPAN><SPAN name="MS:">x961 y0</SPAN>
<SPAN class=param>Window: </SPAN><SPAN name="MS:">x52 y429</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">x²1551 y²447</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param>Control: </SPAN><SPAN name="MS:">x48 y318</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">x²1547 y²336</SPAN></PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=P__Name_Acc style="COLOR: #189200"> ( Name ) </SPAN><A></A><SPAN class=button id=copy_button contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on"> copy </SPAN></SPAN></SPAN></SPAN><BR><PRE class=lpre contentEditable=true>Скриптовый язык Open Object Rexx</PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=P__State_Acc style="COLOR: #189200"> ( State: <SPAN style="COLOR: #000000" name="MS:">0x00000000</SPAN> ) </SPAN></SPAN></SPAN></SPAN><BR><PRE contentEditable=true><SPAN class=param name="MS:">normal</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN name="MS:">0x00000000</SPAN>
</PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=P__Role_Acc style="COLOR: #189200"> ( Role ) </SPAN></SPAN></SPAN></SPAN><BR><PRE contentEditable=true><SPAN name="MS:">list item</SPAN>  <SPAN id=delimiter style="COLOR: #e14b30">▪</SPAN>  <SPAN class=param name="MS:N">code: </SPAN><SPAN name="MS:">34</SPAN></PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=P__Focus_name_Acc style="COLOR: #189200"> ( Focus - name ) </SPAN><A></A><SPAN class=button id=copy_button contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on"> copy </SPAN></SPAN></SPAN></SPAN><BR><PRE class=lpre contentEditable=true>Разработка скриптов</PRE><SPAN class=box><SPAN class=line><SPAN class=hr></SPAN><SPAN class=con><SPAN class=title id=P__Focus_value_Acc style="COLOR: #189200"> ( Focus - value ) </SPAN><A></A><SPAN class=button id=copy_button contentEditable=false onmouseover="OnButtonOver (this)" onmousedown="OnButtonDown (this)" onmouseup="OnButtonUp (this)" oncontextmenu="return false" onmouseleave="OnButtonOut (this)" unselectable="on"> copy </SPAN></SPAN></SPAN></SPAN><BR><PRE class=lpre contentEditable=true>http://script-coding.com/</PRE><A></A><SPAN class=box><SPAN class=hr></SPAN></SPAN>
<STYLE>
* {
margin: 0;
background: none;
font-family: Arial;
font-weight: 500;
}
body {
margin: 0.3em;
background-color: #FFFFFF;
font-size: 15px;
scrollbar-y-position: 111px;
}
.br {
height:0.1em;
}
.box {
position: absolute;
overflow: hidden;
width: 100%;
height: 1.5em;
background: transparent;
left: 0px;
}
.line {
position: absolute;
width: 100%;
top: 1px;
}
.con {
position: absolute;
left: 30%;
}
.title {
margin-right: 50px;
white-space: pre;
color: #27419B;
}
.hr {
position: absolute;
width: 100%;
border-bottom: 0.2em dashed red;
height: 0.5em;
}
pre {
margin-bottom: 0.1em;
margin-top: 0.1em;
line-height: 1.3em;
}
.button {
position: relative;
border: 1px dotted;
border-color: black;
white-space: pre;
cursor: hand;
}
.BB {
display: inline-block;
}
.param {
color: #189200;
}
#anchor {
background-color: #FFFF80;
}
</STYLE>
</BODY></HTML>

Outer Text:

 ( Mouse )  pause  zoom 
Screen:  x1193 y475  ▪  Window:  x1013 y429  ▪  Client:  x1009 y406
Relative window:  0.6411, 0.4347  for w1580 h987  ▪  Relative client:  0.6419, 0.4229  for w1572 h960
Relative active window:  x1013 y429  ▪  exe iexplore.exe class IEFrame hwnd 0x10464 ( PixelColor ) 
RGB:  0xE0E0E0  ▪  #E0E0E0  ▪  BGR:  0xE0E0E0  ▪  #E0E0E0 ( Window ) 
ahk_class IEFrame ahk_exe iexplore.exe ahk_id 0x10464 ahk_pid 4616
Cursor:  Arrow  ▪  Caret:  x297 y443  ▪  Client area:  x4 y23 w1572 h960
Focus control:  Internet Explorer_Server1 ( Control ) 
Class NN:  Internet Explorer_Server1  ▪  Win class:  Internet Explorer_Server
Pos:  x4 y111  ▪  x²1575 y²962  ▪  Size:  w1572 h852
Pos relative client area:  x0 y88  ▪  x²1571 y²939
Mouse relative control:  x1009 y318  ▪  0.6419, 0.3732  ▪   Get path:   
HWND:  0x70666  ▪  Parent control:  Shell DocObject View  ▪  0x10636
ProcessId (UIA detect):  2908  ▪  iexplore.exe  ▪  C:\Program Files\Internet Explorer\iexplore.exe
Style:  0x56000000  ▪  ExStyle:  0x00000000  ▪   show styles  ( Info - Internet Explorer_Server ) 
Title:  Разработка скриптов
URL:  http://script-coding.com/ ( Tag name: LI ) 
Pos: x48 y318  ▪  x²1547 y²336  ▪  Size: w1500 h18
Index:  105 ( Outer HTML )  copy 
<li><a href="ooRexx.html">Скриптовый язык Open Object Rexx</a></li> ( Outer Text )  copy 
Скриптовый язык Open Object Rexx ( Accessible ) 
Type:  Parent  ▪  ChildCount:  1  ▪   Get path:    ( Position relative ) 
Screen: x232 y475  ▪  x²1731 y²493  ▪  Size: w1500 h19  ▪  Mouse: x961 y0
Window: x52 y429  ▪  x²1551 y²447  ▪  Control: x48 y318  ▪  x²1547 y²336 ( Name )  copy 
Скриптовый язык Open Object Rexx ( State: 0x00000000 ) 
normal  ▪  0x00000000
 ( Role ) 
list item  ▪  code: 34 ( Focus - name )  copy 
Разработка скриптов ( Focus - value )  copy 
http://script-coding.com/

А должно быть:
Info - Internet Explorer_Server :

Title:  Разработка скриптов
URL:  http://script-coding.com/

Tag name: LI :

Pos: x48 y318  ▪  x²1547 y²336  ▪  Size: w1500 h18
Index:  105

Outer HTML:

<li><a href="ooRexx.html">Скриптовый язык Open Object Rexx</a></li>

Outer Text:

Скриптовый язык Open Object Rexx

1,072

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

А до добавления UIA такое было?
По сути вся котовасия из за еджа, MouseGetPos с 3 в конце в калькуляторе также определяет, а в едже определит другой процесс, но только не для каждой вкладки.

1:: 
	MouseGetPos, x, y, win, hwnd, 3 
	WinGet, processname, processname, ahk_id %hwnd%
	WinGetclass, class, ahk_id %hwnd%
	WinGet, pid, pid, ahk_id %hwnd% 
	WinGet, wprocessname, processname, ahk_id %win%
	WinGetclass, wclass, ahk_id %win%
	WinGet, wpid, pid, ahk_id %win%

	ToolTip % "control`t" processname "`t" pid "`t" class
			.  "`nwin`t" wprocessname "`t" wpid "`t" wclass
	Return
Malcev пишет:

Так stealzy же уже ответил.

Да, я читал это ещё до своего вопроса.

Добавил:

Spot only Shift+Tab - Работает только по нажатию Shift+Tab, при этом окно не активируется.

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

1,073

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

В версии 3.14 такой же баг.
При чем проверял на 2 компьютерах один win10 второй win7.
Попробуй сам открыть окно IE например с нашим сайтом, подвигай мышкой и увидишь как инфа меняется.
Видно какой-то конфликт между контролом IE и контролом AhkSpy.

1,074

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

Malcev пишет:

В версии 3.14

Так сейчас уже 3.49, ты где её взял.

Malcev пишет:

подвигай мышкой и увидишь как инфа меняется.

Так она и должна менятся.

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

1,075

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

serzh82saratov пишет:

Так сейчас уже 3.49, ты где её взял.

Была в моем архиве.
На 3.49 тоже самое.

serzh82saratov пишет:

Так она и должна менятся.

Она меняется на исходный код AhkSpy - посмотри OuterHtml 1071 поста.

1,076

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

3.50 должно быть пофиксил.

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

1,077

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

Вроде работает теперь нормально.

1,078

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

Релиз - это ссылка на архив репозитория (папки), тогда где там версии "выставлять".
То есть как создав в папке новую версию, указать что релиз изменился.
Тогда можно в холостую скачать архив для статистики, а чтобы не разархивировать его, то проще скачать ещё и исходник.

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

1,079

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

Добавил кнопки подсветки определённых элементов и IsWindowUnicode.
В Accessible добавлено WindowFromObject, выводит хэндл если WindowFromObject возвращает отличное от WinID или ControlID.

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

1,080

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

В UIA можно получить класс контрола - oUIAInterface.ElementFromPoint().CurrentClassName, а как получить класс его окна?

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

1,081

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

Ты имеешь в виду как получить родительское окно элемента?

1,082

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

Да.

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

1,083

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

Надо смотреть и проверять.
https://docs.microsoft.com/en-us/window … -findfirst
https://docs.microsoft.com/en-us/window … entelement

1,084

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

Я тут искал, особо копать не хочется.
https://docs.microsoft.com/ru-ru/window … ionelement

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

1,085

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

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

1,086

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

Ничё не понял.
В этих методах разве есть нужный.

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

1,087

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

В 1083 посте, судя по описанию оба метода должны работать.

1,088

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

Сложный для меня класс, extends, base, тёмный лес.

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

1,089 (изменено: Malcev, 2019-01-27 19:47:08)

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

Я в класс особо не вникал - не люблю в них копаться.
На мсдн в принципе все расписано.

uia := UIA_Interface()
F11::
element := uia.ElementFromPoint()
TrueCondition := uia.CreateTrueCondition()
TreeWalker := uia.CreateTreeWalker(TrueCondition)
parent := TreeWalker.GetParentElement(element)
msgbox % element.CurrentNativeWindowHandle "`n" parent.CurrentNativeWindowHandle
return

1,090 (изменено: serzh82saratov, 2019-01-27 20:21:22)

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

Это не то. Нажми 1 над окошком, parent.CurrentNativeWindowHandle возвращает окно в котором сейчас находится контрол, а не то которое является его создателем.


#SingleInstance Force
#NoEnv
#Persistent 

Gui, +HWNDhGui -DPIScale
Gui, Show, w300 h300
 
Run, notepad, , Min, pid
WinWait, ahk_pid %pid%
hNotepad := WinExist("ahk_pid " pid " ahk_class Notepad")
ControlGet, hEdit1, Hwnd, , Edit1 
DllCall("SetParent", "Ptr", hEdit1, "Ptr", hGui) 
uia := UIA_Interface()

1::
	element := uia.ElementFromPoint()
	TrueCondition := uia.CreateTrueCondition()
	TreeWalker := uia.CreateTreeWalker(TrueCondition)
	parent := TreeWalker.GetParentElement(element)
	WinGet, EIAProcessName, ProcessName, % "ahk_id " element.CurrentNativeWindowHandle
	WinGet, PProcessName, ProcessName, % "ahk_id " parent.CurrentNativeWindowHandle
	 
	MsgBox % "parent element: " EIAProcessName 
		. "`nparent window: " PProcessName 
		. "`n" (hGui = parent.CurrentNativeWindowHandle)
		
	Process, Close, % pid
	ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,091

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

Не понимаю, что ты хочешь получить.
Тебе же нужно было родительское окно.

Malcev пишет:

Ты имеешь в виду как получить родительское окно элемента?

serzh82saratov пишет:

Да.

1,092 (изменено: serzh82saratov, 2019-01-27 21:44:20)

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

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

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

1,093

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

А почему ты не хочешь создателя определять по Pid?

1,094

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

А как по Pid можно определить окно?

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

1,095

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

Winget?

1,096

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

Так ты им найдёшь просто первое в Z-Order.

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

1,097 (изменено: Malcev, 2019-01-27 22:49:00)

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

А почему ты считаешь, что первое в z-order не будет его создателем?
Но даже если это не так, можно получать список окон принадлежащих процессу и проверять на hwnd нужного элемента.

1,098

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

Malcev пишет:

А почему ты считаешь, что первое в z-order не будет его создателем?

А почему так надо считать?

Malcev пишет:

получать список окон принадлежащих процессу и проверять на hwnd нужного элемента.

В нём его уже не будет.

#SingleInstance Force
#NoEnv
#Persistent 

Gui, +HWNDhGui -DPIScale
Gui, Show, w300 h300
 
Run, notepad, , Min, pid
WinWait, ahk_pid %pid%
hNotepad := WinExist("ahk_pid " pid " ahk_class Notepad")

WinGet, ListNN, ControlList 
Loop, parse, ListNN, `n
	str .=  A_LoopField "`n" 
MsgBox % str
str = 

ControlGet, hEdit1, Hwnd, , Edit1 
DllCall("SetParent", "Ptr", hEdit1, "Ptr", hGui) 

WinGet, ListNN, ControlList 
Loop, parse, ListNN, `n
	str .=  A_LoopField "`n" 
MsgBox % str
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

1,099

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

serzh82saratov пишет:

А почему так надо считать?

Возможно не надо, я не проверял, и если это так, то наверное никак не знаешь.
Во всяком случае я такой информации в утилитах не нашел.

1,100

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

Взялся за стили, обычные оконные вроде сделал. В расширенных требуется знать "class style", например для WS_EX_COMPOSITED нужно определять CS_OWNDC и CS_CLASSDC. Со стандартными контролами значения совпадают с программой WinID. Но например контрол Scintilla, или классы окон - нет.


VarSetCapacity(WNDCLASSEX, A_PtrSize == 8 ? 80 : 48, 0)
SetFormat, IntegerFast, H  

1::
	MouseGetPos, , , hWin, hWnd, 2
	If !hWnd 
		hWnd := hWin
	WinGetClass, Class, ahk_id %hWnd%
	hInstance := DllCall("GetWindowLong", Ptr, hWin, "UInt", GWL_HINSTANCE := -6)

	DllCall("GetClassInfoEx", "Ptr", hInstance, "Str", Class, "Ptr", &WNDCLASSEX)
	ToolTip % "Style bits: " NumGet(WNDCLASSEX, 4, "Uint") "`nClass: " Class "`nHINSTANCE: " hInstance
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui