Что нового

Пронумеровать окна по времени их открытия.

StarWash

Новичок
Сообщения
27
Репутация
0
Версия AutoIt: v3.3.10.2
Описание: После запуска макроса, надо пронумеровать окна (добавить порядковый номер к заголовку) по времени их открытия. Во время работы макроса, если закрывается, к примеру, окно №7, то надо, чтобы окно №8 стало окном номер №7, а окно №9 стало окном №8 и т.д.
Примечания: Возможно, можно использовать http://autoit-script.ru/index.php/topic,47.0.html
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: Помогите допилить код от madmasles.

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


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

"Помогите допилить код от madmasles." - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Глобальный модератор.
 
Автор
S

StarWash

Новичок
Сообщения
27
Репутация
0
Re: Поочередное переименование окон при пропущеном порядковом номере.

Кто-нибудь?
 
Автор
S

StarWash

Новичок
Сообщения
27
Репутация
0
Re: Поочередное переименование окон при пропущеном порядковом номере.

ап
 
Автор
S

StarWash

Новичок
Сообщения
27
Репутация
0
Re: Поочередное переименование окон при пропущеном порядковом номере.

Я что кого-то чем-то обидел?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Поочередное переименование окон при пропущеном порядковом номере.

StarWash,
Попробуйте примерно так.
Код:
Opt('WinTitleMatchMode', 2);только для блокнота
Opt('MustDeclareVars', 1)

Global $fExit, $aWnd[1]

HotKeySet('{Esc}', '_Exit')
AdlibRegister('_CheckWnd', 500)

While Not $fExit
	Sleep(1000)
	If Random(0, 4, 1) = 4 Then Run('notepad.exe');рандомный запуск блокнота для проверки, уберите эту строку
	If Random(0, 4, 1) = 4 Then;закрываем рандомное окно блокнота, уберите эту строку
		If $aWnd[0] > 1 Then WinClose($aWnd[Random(1, $aWnd[0], 1)])
	EndIf
WEnd
;закрываем все окна блокнота, можно убрать.
$aWnd = WinList('Блокнот')
If $aWnd[0][0] Then
	For $i = 1 To $aWnd[0][0]
		WinClose($aWnd[$i][1])
	Next
EndIf

Func _CheckWnd()
	Local $s_Title = 'Блокнот', $a_Win, $s_StrHandle = '|', $i_Max = 100, $a_NewWnd[$i_Max + 1]
	;поменяйте на Ваш заголовок
	If $aWnd[0] Then
		For $i = 1 To $aWnd[0]
			If WinExists($aWnd[$i]) Then
				$s_StrHandle &= $aWnd[$i] & '|'
				$a_NewWnd[0] += 1
				If $a_NewWnd[0] > $i_Max Then
					$i_Max += 100
					ReDim $a_NewWnd[$i_Max + 1]
				EndIf
				$a_NewWnd[$a_NewWnd[0]] = $aWnd[$i]
				If $a_NewWnd[0] <> $i Then
					WinSetTitle($a_NewWnd[$a_NewWnd[0]], '', $s_Title & ' - ' & $a_NewWnd[0])
				EndIf
			EndIf
		Next
	EndIf
	$a_Win = WinList($s_Title)
	If Not $a_Win[0][0] Then
		ReDim $a_NewWnd[$a_NewWnd[0] + 1]
		$aWnd = $a_NewWnd
		Return
	EndIf
	For $i = 1 To $a_Win[0][0]
		If StringInStr($s_StrHandle, '|' & $a_Win[$i][1] & '|') Then
			ContinueLoop
		EndIf
		$a_NewWnd[0] += 1
		If $a_NewWnd[0] > $i_Max Then
			$i_Max += 100
			ReDim $a_NewWnd[$i_Max + 1]
		EndIf
		$a_NewWnd[$a_NewWnd[0]] = $a_Win[$i][1]
		WinSetTitle($a_NewWnd[$a_NewWnd[0]], '', $s_Title & ' - ' & $a_NewWnd[0])
	Next
	ReDim $a_NewWnd[$a_NewWnd[0] + 1]
	$aWnd = $a_NewWnd
EndFunc   ;==>_CheckWnd

Func _Exit()
	AdlibUnRegister('_CheckWnd')
	$fExit = True
EndFunc   ;==>_Exit


Добавлено:
Сообщение автоматически объединено:

OffTopic:
StarWash [?]
Кто-нибудь?
...
ап
...
Я что кого-то чем-то обидел?
Если у кого-то есть желание и возможность помочь, то обязательно помогут. Последние почти пять лет только так и было у нас на форуме. :smile:
 
Автор
S

StarWash

Новичок
Сообщения
27
Репутация
0
Re: Поочередное переименование окон при пропущеном порядковом номере.

Рандомно проставил имена. Т.е. не 1,2,3,4... а 11,12,14,5,8,7...


Добавлено:
Сообщение автоматически объединено:

Вроде, удалил только нужные строки... но все равно рандомно делает.
Код:
Opt('MustDeclareVars', 1)

Global $fExit, $aWnd[1]

HotKeySet('{Esc}', '_Exit')
AdlibRegister('_CheckWnd', 500)

_CheckWnd()

Func _CheckWnd()
	Local $s_Title = 'Guild Wars 2', $a_Win, $s_StrHandle = '|', $i_Max = 100, $a_NewWnd[$i_Max + 1]
	If $aWnd[0] Then
		For $i = 1 To $aWnd[0]
			If WinExists($aWnd[$i]) Then
				$s_StrHandle &= $aWnd[$i] & '|'
				$a_NewWnd[0] += 1
				If $a_NewWnd[0] > $i_Max Then
					$i_Max += 100
					ReDim $a_NewWnd[$i_Max + 1]
				EndIf
				$a_NewWnd[$a_NewWnd[0]] = $aWnd[$i]
				If $a_NewWnd[0] <> $i Then
					WinSetTitle($a_NewWnd[$a_NewWnd[0]], '', $s_Title & ' - ' & $a_NewWnd[0])
				EndIf
			EndIf
		Next
	EndIf
	$a_Win = WinList($s_Title)
	If Not $a_Win[0][0] Then
		ReDim $a_NewWnd[$a_NewWnd[0] + 1]
		$aWnd = $a_NewWnd
		Return
	EndIf
	For $i = 1 To $a_Win[0][0]
		If StringInStr($s_StrHandle, '|' & $a_Win[$i][1] & '|') Then
			ContinueLoop
		EndIf
		$a_NewWnd[0] += 1
		If $a_NewWnd[0] > $i_Max Then
			$i_Max += 100
			ReDim $a_NewWnd[$i_Max + 1]
		EndIf
		$a_NewWnd[$a_NewWnd[0]] = $a_Win[$i][1]
		WinSetTitle($a_NewWnd[$a_NewWnd[0]], '', $s_Title & ' - ' & $a_NewWnd[0])
	Next
	ReDim $a_NewWnd[$a_NewWnd[0] + 1]
	$aWnd = $a_NewWnd
EndFunc

Func _Exit()
	AdlibUnRegister('_CheckWnd')
	$fExit = True
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Re: Поочередное переименование окон при пропущеном порядковом номере.

Только тут в названии сперва будут цифры, а затем название. Т.к так проще 8)
Код:
#include <array.au3>
AdlibRegister('_CheckWnd', 500)
HotKeySet('{Esc}', '_Exit')
While Sleep(500)
WEnd
Func _Exit()
	Exit
EndFunc   ;==>_Exit
Func _CheckWnd()
	Local $s_Title = 'Калькулятор'
	Local $windows_array = WinList('[REGEXPTITLE:\d+ - ' & $s_Title & ']')
	_ArraySort($windows_array, 0, 1)
	For $windows_index = 1 To $windows_array[0][0]
		WinSetTitle($windows_array[$windows_index][1], '', StringFormat('%03d', $windows_index) & ' - ' & $s_Title)
	Next
	WinSetTitle($s_Title, '', StringFormat('%03d', $windows_index) & ' - ' & $s_Title)
EndFunc   ;==>_CheckWnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Поочередное переименование окон при пропущеном порядковом номере.

StarWash,
Может быть, создаются скрытые окна? Я не знаю. Попробуйте тогда примерно так.
Код:
Opt('MustDeclareVars', 1)

Global $fExit, $aWnd[1]

HotKeySet('{Esc}', '_Exit')
AdlibRegister('_CheckWnd', 250)

While Not $fExit
	Sleep(1000)
;~ 	рандомный запуск-закрытие окон блокнота для проверки, уберите эти строки
;~ 	---------------------------------------------------------------------------
	Switch $aWnd[0]
		Case 0 To 1
			Run('notepad.exe');
		Case 2 To 14
			Run('notepad.exe')
			If Random(0, 4, 1) = 4 Then WinClose($aWnd[Random(1, $aWnd[0], 1)])
		Case Else
			WinClose($aWnd[Random(1, $aWnd[0], 1)])
	EndSwitch
;~ 	---------------------------------------------------------------------------
WEnd
;~ закрываем все окна блокнота, можно убрать.
_CloseAllWinsdows()

Func _CheckWnd()
	Local $s_Title = 'Блокнот', $s_Search = '[REGEXPTITLE:.*' & $s_Title & '.*;CLASS:Notepad]', $a_Win, $s_StrHandle = '|', $i_Max = 100, _
			$a_NewWnd[$i_Max + 1], $s_NewTitle
;~ 	поменяйте на Ваш кусок заголовка и класс окна
	If $aWnd[0] Then
		For $i = 1 To $aWnd[0]
			If (WinExists($aWnd[$i])) And (BitAND(WinGetState($aWnd[$i]), 2)) Then
				$s_StrHandle &= $aWnd[$i] & '|'
				$a_NewWnd[0] += 1
				If $a_NewWnd[0] > $i_Max Then
					$i_Max += 100
					ReDim $a_NewWnd[$i_Max + 1]
				EndIf
				$a_NewWnd[$a_NewWnd[0]] = $aWnd[$i]
				If $a_NewWnd[0] <> $i Then
					$s_NewTitle = $a_NewWnd[0] & ' - ' & $s_Title;номер в начале
;~ 					$s_NewTitle = $s_Title & ' - ' & $a_NewWnd[0];номер в конце
					WinSetTitle($a_NewWnd[$a_NewWnd[0]], '', $s_NewTitle)
				EndIf
			EndIf
		Next
	EndIf
	$a_Win = WinList($s_Search)
	If Not $a_Win[0][0] Then
		ReDim $a_NewWnd[$a_NewWnd[0] + 1]
		$aWnd = $a_NewWnd
		Return
	EndIf
	For $i = 1 To $a_Win[0][0]
		If StringInStr($s_StrHandle, '|' & $a_Win[$i][1] & '|') Then
			ContinueLoop
		EndIf
		$a_NewWnd[0] += 1
		If $a_NewWnd[0] > $i_Max Then
			$i_Max += 100
			ReDim $a_NewWnd[$i_Max + 1]
		EndIf
		$a_NewWnd[$a_NewWnd[0]] = $a_Win[$i][1]
		$s_NewTitle = $a_NewWnd[0] & ' - ' & $s_Title;номер в начале
;~ 		$s_NewTitle = $s_Title & ' - ' & $a_NewWnd[0];номер в конце
		WinSetTitle($a_NewWnd[$a_NewWnd[0]], '', $s_NewTitle)
	Next
	ReDim $a_NewWnd[$a_NewWnd[0] + 1]
	$aWnd = $a_NewWnd
	_WinMove($aWnd);можно убрать
EndFunc   ;==>_CheckWnd

Func _Exit()
	AdlibUnRegister('_CheckWnd')
	$fExit = True
EndFunc   ;==>_Exit

Func _CloseAllWinsdows()
	Local $a_Wnd

	For $j = 1 To 5
		$a_Wnd = WinList('[REGEXPTITLE:.*Блокнот.*;CLASS:Notepad]')
		If Not $a_Wnd[0][0] Then Return
		For $i = 1 To $a_Wnd[0][0]
			WinClose($a_Wnd[$i][1])
		Next
	Next
EndFunc   ;==>_CloseAllWinsdows

Func _WinMove($a_Wnd)
	Local Static $i__StepX = 0, $i__StepY = 0, $i__W = 0, $i__H = 0
	Local $i_X, $i_Y, $i_Count

	If Not $i__StepX Then $i__StepX = Int(@DesktopWidth / 5)
	If Not $i__StepY Then $i__StepY = Int(@DesktopHeight / 3)
	If Not $i__W Then $i__W = $i__StepX - 5
	If Not $i__H Then $i__H = $i__StepY - 5

	For $j = 0 To 2
		$i_Y = $j * $i__StepY
		For $i = 0 To 4
			$i_Count += 1
			$i_X = $i__StepX * $i
			WinMove($a_Wnd[$i_Count], '', $i_X, $i_Y, $i__W, $i__H)
			If $i_Count = $a_Wnd[0] Then Return
		Next
	Next
EndFunc   ;==>_WinMove
 
Автор
S

StarWash

Новичок
Сообщения
27
Репутация
0
Re: Поочередное переименование окон при пропущеном порядковом номере.

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


Добавлено:
Сообщение автоматически объединено:

http://autoit-script.ru/index.php/topic,47.0.html - я пробовал использовать эту библиотеку, но что-то никак не могу заставить её работать. Может с ней получится?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Поочередное переименование окон при пропущеном порядковом номере.

StarWash,
С такой постановкой вопроса Вам надо в Стол заказов. Переоформите тему в соответствии с Правилами обязательного оформления тем в разделе "Стол заказов" и я ее туда перенесу.

И подробно опишите как запускаются процессы, которые открывают эти окна, с какой частотой, и т.д. и т.п...
 
Верх