Что нового

[Окна, Диалоги] Как узнать TITLE окна, без использования Au3Info

Paul_Markey

Новичок
Сообщения
18
Репутация
1
Задача собственно следующая:
Есть программа. Чтобы она работала, пользователю нужно в поле input ввести title необходимого окна. Но вот как пользователю выяснить title без использования Au3Info остается вопросом. Просто вписать title не вариант. А описывать весь процесс, как выяснить title, не для всех пользователей может быть понятен.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Paul_Markey
http://autoit-script.ru/index.php/topic,13322.0.html
"Перетащите мишень на нужное окно"

Или получить список всех окон верхнего уровня, вывести его в ComboBox, пусть пользователь сам выберет
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
А функция
Код:
WinGetTitle
не подойдёт?
 
Автор
P

Paul_Markey

Новичок
Сообщения
18
Репутация
1
WSWR
Или получить список всех окон верхнего уровня, вывести его в ComboBox, пусть пользователь сам выберет
Можно подробнее, как это реализовать?

GUIFinder - Элемент поиска окон
"Перетащите мишень на нужное окно"
У меня не отображается прицел.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Paul_Markey

Код:
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <Array.au3>
#include <GuiComboBox.au3>

Global $sList = ''

Global $aList1[1][2]
$aList1[0][0] = 1
Global $aList = WinList()

If $aList[0][0] Then
	For $i = 1 To $aList[0][0]
		$sClass = _WinAPI_GetClassName($aList[$i][1])
		If $sClass <> 'Progman' And $sClass <> 'Shell_TrayWnd' Then
			If $aList[$i][0] Then
				If BitAND(WinGetState($aList[$i][1]), 2) Then
					$aList1[0][0] += 1
					ReDim $aList1[$aList1[0][0]][2]
					$aList1[$aList1[0][0] - 1][0] = $aList[$i][1]
					$aList1[$aList1[0][0] - 1][1] = WinGetTitle($aList[$i][1])
					$sList &= WinGetTitle($aList[$i][1]) & '|'
				EndIf
			EndIf
		EndIf
	Next
EndIf

;_ArrayDisplay($aList1)
GUICreate('My GUI combo', 450, 100, -1, -1)
$read = GUICtrlCreateButton('Выбрать', 133, 40, 132, 25)
$Combo1 = GUICtrlCreateCombo('', 10, 10, 350, 20, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, StringTrimRight($sList,1))

GUISetState()


While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $read
			$sText = GUICtrlRead($Combo1)
			$Sel = _GUICtrlComboBox_GetCurSel($Combo1)
			If $sText <> '' Then MsgBox(0, 'Тест', $aList1[$Sel + 1][1] & ' ' & $aList1[$Sel + 1][0])
	EndSwitch
WEnd
 

skkkk

Новичок
Сообщения
4
Репутация
0
Скажите, пожалуйста, если кто знает, как узнать заголовок окна, которое при активации AutoItWindowInfo пропадает? Т.е. для того, чтоб узнать инфо об окне, нужно схватить за прицел и перетащить его на окно программы. Но когда жмем этот прицел, окно исчезает. Таким окном, например, является контекстное меню, а также маленькие вспомогательные (всплывающие) окна некоторых программ (например, AutoCAD)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
skkkk [?]
как узнать заголовок окна, которое при активации AutoItWindowInfo пропадает?
Попробуйте сделать примерно так.
Код:
#include <WinAPI.au3>
#include <Array.au3>

Global $oDict, $aNewWin[1][3] = [[0, 'Title', 'Class']]

$oDict = ObjCreate('Scripting.Dictionary')
If Not IsObj($oDict) Then Exit 1
_GetAllVisibleWindows(0)
__LoadKeyboardLayoutEngSelf()
HotKeySet('+z', '_GetNew');Shift+z
HotKeySet('{Esc}', '_Exit');Esc

While 1
	Sleep(100)
WEnd

Func _GetNew()
	HotKeySet('+z')
	_GetAllVisibleWindows(1)
	_ArrayDisplay($aNewWin, 'New Windows')
	HotKeySet('+z', '_GetNew')
EndFunc   ;==>_GetNew

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func _GetAllVisibleWindows($i_Flag)
	Local $a_Win, $s_HexHWnd

	If $i_Flag Then
		ReDim $aNewWin[1][3]
		$aNewWin[0][0] = 0
	EndIf
	$a_Win = WinList()
	If $i_Flag Then ReDim $aNewWin[$a_Win[0][0] + 1][3]
	For $i = 1 To $a_Win[0][0]
		If Not BitAND(WinGetState($a_Win[$i][1]), 2) Then ContinueLoop
		$s_HexHWnd = Hex($a_Win[$i][1], 8)
		If $oDict.Exists($s_HexHWnd) Then ContinueLoop
		$oDict.Add($s_HexHWnd, 0)
		If Not $i_Flag Then ContinueLoop
		$aNewWin[0][0] += 1
		$aNewWin[$aNewWin[0][0]][0] = '0x' & $s_HexHWnd
		$aNewWin[$aNewWin[0][0]][1] = WinGetTitle($a_Win[$i][1])
		$aNewWin[$aNewWin[0][0]][2] = _WinAPI_GetClassName($a_Win[$i][1])
	Next
	If $i_Flag Then ReDim $aNewWin[$aNewWin[0][0] + 1][3]
EndFunc   ;==>_GetAllVisibleWindows

Func __LoadKeyboardLayoutEngSelf()
	Local Const $__KLF_ACTIVATE = 0x00000001, $__KLF_SETFORPROCESS = 0x00000100
	Local $a_Res = DllCall('user32.dll', 'long', 'LoadKeyboardLayoutW', 'wstr', '00000409', 'uint', BitOR($__KLF_ACTIVATE, $__KLF_SETFORPROCESS))
	If (@error) Or (Not $a_Res[0]) Or (Not StringInStr(Hex($a_Res[0]), '0409')) Then Return 0
	Return 1
EndFunc   ;==>__LoadKeyboardLayoutEngSelf
 

skkkk

Новичок
Сообщения
4
Репутация
0
madmasles, большое спасибо за отклик, но прошу дополнительных пояснений. Как запустить скрипт, я разобрался, еще по тексту кода догадываюсь, что он собирает информацию обо всех активных окнах, но куда он ее складывает - не пойму. Гляжу в код вижу фигу. :smile: И правильно ли я понял, что нужно скрипт запустить, потом запустить нужные окна, затем скрипт остановить?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
skkkk,
Запускаете скрипт, ждете появления или вызываете нужные новые окна, нажимаете Shift+z (можно поменять) и скрипт покажет данные о новых видимых окнах. Esc - выход.

PS
Правильнее было бы сделать через
Код:
_WinAPI_WindowFromPoint()
Но уже лень. :smile:
 

skkkk

Новичок
Сообщения
4
Репутация
0
madmasles, спасибо, получилось!
OffTopic:
Не могу поставить плюс, видимо, потому что я новичок :smile:
Очень рад, что попал на данный форум. Спасибо еще раз!!!
:laugh:
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
skkkk [?]
нужно схватить за прицел и перетащить его на окно программы
В Au3Info есть режим без использования прицела: отключите опцию в меню "Options - Freeze".
А ещё можно использовать альтернативу wInformer
 

skkkk

Новичок
Сообщения
4
Репутация
0
InnI сказал(а):
В Au3Info есть режим без использования прицела: отключите опцию в меню "Options - Freeze".
Спасибо, тоже то, что надо. Причем вариант от madmasles показывает другую информацию. Пригодились оба варианта. Один показал правильное название для всплывающих окон Автокада, второй - для контекстного меню. Спасибо вам, добрые ребята! Дай Бог вам здоровья! :smile:
 
Верх