1 (изменено: carenov, 2017-08-26 04:12:12)

Тема: Warface: Переименовка окон UPDATE 26.08.17

Доброго времени суток всем обитателям форума

Стоит такая нетривиальная задача:
Есть N-ное количество окон с игрой, нужно по горячей клавише активировать переименование всех запущенных окон с игрой (К примеру "WF1 - WF10").
Класс окон везде разный. Одинаковые названия самих окон и ехешник.
Желательно переименование должно быть по порядку (слева направо в панели задач)
И самое основное, допустим из 10 окон, 8ое закроется, при его перезапуске оно снова будет иметь стандартное название, и нужно по второй горячей клавише, сделать поиск и восстановить имя 8ому окну (если рассматривать мой пример "WF8"). Это второй хоткей.

Я сделал уже более 10 разных команд в своем скрипте, и на переименовании застопорился...
Прошу помощи, заранее огромное спасибо!

UPDATE 25.08.17

Получилось сделать первую часть, пока что так:

WinGet, WinMass, List, ahk_class КЛАСС программки ;(можно посмотреть программой Window Spy).
Loop %WinMass%
{
    WinList .= WinMass%A_Index%
    TmpID := WinMass%A_Index%
    WinGetTitle, WinTitle, ahk_id%TmpID%
    WinSetTitle, ahk_id%TmpID%,, Bot%A_Index%
    WinList .= "(%A_Index%)"| n
}

Дело в том, что у игры все классы разные, а если ставить вместо класса ехешник, переименовка будет через 1 число (1,3,5,9,11 итд)
Не знаю почему, тестил на другом окне с одинаковым классом, все работает и переименовывает по порядку.

2 (изменено: serzh82saratov, 2017-08-26 03:14:31)

Re: Warface: Переименовка окон UPDATE 26.08.17

carenov пишет:

по второй горячей клавише, сделать поиск и восстановить имя 8ому окну

Со второй клавишей не пошло, потому всё на одной.


exe = notepad.exe  ;	можно полный путь

Win := {}, Win.Free := {}, Win.Count := 0

Loop 10
	Run notepad
Sleep 333
WinGet, List, List, ahk_exe %exe% 
Loop %List%
	WinMove, % "ahk_id" List%A_Index%, , 1500, % A_Index * 40, 300, 30
Return

1:: 
	For k, v in Win 
		(k + 0 && !WinExist("ahk_id" k) 
		&& (Win.Free[Win.Delete(k)] := 1)
		&& Win.Count--)
	WinGet, List, List, ahk_exe %exe%
	Loop %List%
	{ 
		hwnd := List%A_Index%
		If !DllCall("IsWindowVisible", "Ptr", hwnd) || Win.Haskey(hwnd)
			Continue
		Min := Win.Free.MinIndex()
		i := (Min ? Min : Win.Count + 1)
		WinSetTitle, ahk_id %hwnd%, , WF%i%
		(Min && Win.Free.Delete(Min))
		Win[hwnd] := i, Win.Count++
	}
	Return
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.28.02 (Unicode 32-bit).

3

Re: Warface: Переименовка окон UPDATE 26.08.17

serzh82saratov
Ваш скрипт полностью рабочий.
Фишка в том, что окна игры УЖЕ запущены.
Я понимаю, можно убрать запуск с скрипта, но дело не в этом.
Если окна уже запущены, и запустить скрипт, они все равно каким-то магическим образом начинают переименовываться через один. (1,3,5,7,9 итд)
ПРИЧЕМ! В блокноте всё работает как надо, по порядку и так и так. А в игре и нескольких еще прогах (для теста чисто проверил) через один.
Даже и не знаю что делать уже...) прошу помощи

4

Re: Warface: Переименовка окон UPDATE 26.08.17

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.28.02 (Unicode 32-bit).

5 (изменено: carenov, 2017-08-26 04:03:57)

Re: Warface: Переименовка окон UPDATE 26.08.17

serzh82saratov
Проверил новый код - тоже самое.
Заметил одну интересную вещь, Вы правы, если оставить строку с WinMove, окна идут по порядку и появляются в столбике и все скрытые окна (которые закрываются при закрытии их основного окна)
Если же строку с WinMove убрать скрытых не видно.
Но факт в том, что так, что так, все осталось как и было, переименовка основных окон идет не по порядку.

Благодарю за Вашу активную помощь, но пока ничего не выходит

6

Re: Warface: Переименовка окон UPDATE 26.08.17

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

WinGet, List, List, Одинаковый заголовок ahk_exe %exe% 
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.28.02 (Unicode 32-bit).

7

Re: Warface: Переименовка окон UPDATE 26.08.17

serzh82saratov
Также всё выходит.
Я придумал выход, только не знаю как реализовать.
В переименовке нужно чтобы сами числа отнимались по одному.
Т.е., WF1, далее WF(формула (переименованное 3)-1=2, итог WF2), WF3, далее (формула (переименованное 5)-1=4, итог WF4), и так далее
По сути, каждое нечетное число остается, а от каждого четного отнимается один и результат записывается в "WF(номер)".

8 (изменено: serzh82saratov, 2017-08-26 20:44:41)

Re: Warface: Переименовка окон UPDATE 26.08.17

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.28.02 (Unicode 32-bit).

9 (изменено: carenov, 2017-08-26 21:20:39)

Re: Warface: Переименовка окон UPDATE 26.08.17

serzh82saratov
Нарыл то что мне нужно на С++.
Проверил, полностью работает и окна переименовываются как надо
Вот основная, нужная мне, часть кода:

+ открыть спойлер
...
 
var
  Form8: TForm8;
  n: Integer;
 
...
 
function EnumWindowsProc(wHandle: HWND; Param: Pointer): BOOL; stdcall;
var
  Title, ClassName: array[0..255] of char;
begin
  GetWindowText(wHandle, Title, 255);
  GetClassName(wHandle, ClassName, 255);
  if IsWindowVisible(wHandle) and (Title = 'НазваниеОкна')
  then begin
       Inc(n);
       SetWindowText(wHandle, Format('Префикс %d', [n]));
       end;
  Result := True;
end;
 
procedure TForm8.Timer1Timer(Sender: TObject);
begin
  n := 0;
  EnumWindows(@EnumWindowsProc, 0);
end;
 
...

В С++ вообще не шарю, понимаю, что языки разные, но может вы поймете что есть в этом коде, чего нет в Вашем на АХК и сможете добавить?
Буду очень признателен 

10 (изменено: carenov, 2017-08-26 22:32:28)

Re: Warface: Переименовка окон UPDATE 26.08.17

serzh82saratov
UPDATE.

Не знаю в чем была проблема, но работает, и на отлично, следующий код:

exe = game.exe  ;	можно полный путь

Win := {}, Win.Free := {}, Win.Count := 0

F10::
	WinGet, List, List, ahk_exe %exe%
    Loop %List%
	{ 
		hwnd := List%A_Index%
		If !DllCall("IsWindowVisible", "Ptr", hwnd) || Win.Haskey(hwnd)
			Continue
		Min := Win.Free.MinIndex()
		i := (Min ? Min : Win.Count + 1)
		WinSetTitle, ahk_id %hwnd%, , WF%i%
		(Min && Win.Free.Delete(Min))
		Win[hwnd] := i, Win.Count++
	}
	  Return

F11::
	WinGet, List, List, ahk_exe %exe%
	Loop %List%
	{ 
		hwnd := List%A_Index%
		WinSetTitle, ahk_id %hwnd%, , Warface
    }
	Return

Огромное Вам спасибо за помощь, остался один маленький вопросик.
Как вы видите, в коде добавил возврат окон в стандартные, изначальные названия, на клавишу "Ф11".
Оно работает отлично, но только один раз.
Грубо говоря, запускаю скрипт, жму ф10, окна переименовывались как нужно, далее жму ф11, окна вернулись в первоначальное состояние.
Но при повторном нажатии ф10 и ф11, ни один из скриптов не работает, помогает только перезапуск AHK. В чем может быть проблема?

11

Re: Warface: Переименовка окон UPDATE 26.08.17

F11::
	Win := {}, Win.Free := {}, Win.Count := 0
	WinGet, List, List, ahk_exe %exe%
	Loop %List%
	{ 
		hwnd := List%A_Index%
		WinSetTitle, ahk_id %hwnd%, , Warface
    }
	Return
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.28.02 (Unicode 32-bit).

12

Re: Warface: Переименовка окон UPDATE 26.08.17

serzh82saratov
Еще раз больше спасибо за помощь
Все работает как часы