1 (изменено: P@S@f, 2014-09-30 19:13:14)

Тема: AHK: WinGet List порядок

Хочу узнать, возможно ли получить список окон в порядке, в котором они были открыты (в котором они расположены на панели задач)?

Пробовал через панель задач, но в Win 7 что-то поменялось в этом плане, поэтому старые скрипты не работают.

Например:

TaskBar_GetSwbarId() {
    DetectHiddenWindows, On
    WinGet, ControlList, ControlList, ahk_class Shell_TrayWnd
    RegExMatch(ControlList, "(?<=ToolbarWindow32)\d+(?!.*ToolbarWindow32)", nTB)
    Loop, %nTB%
    {
        ControlGet, hWnd, hWnd,, ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
        hParent := DllCall( "GetParent", Ptr, hWnd )
        WinGetClass, sClass, ahk_id %hParent%
        If (sClass <> "MSTaskSwWClass")
            Continue
        ControlGet, hwndTB, hwnd, , ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
        Break
    }
 Return  hwndTB
}

MSTaskSwWClass в Windows 7 больше не является родителем ToolbarWindow32. Если напрямую обращаться к ToolbarWindow321 - получится доступ к области уведомлений (tray), а не к панели задач (taskbar).
При отсылании TB_BUTTONCOUNT к ToolbarWindow322, как и к ReBarWindow321, возвращается 0.

Может возможен вариант через PID? Правда я не знаком со схемой их генерации. Может ли произойти так что меньший PID освободился и новый процесс может его занять? Или они всегда идут инкрементом до 65535?

2

Re: AHK: WinGet List порядок

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

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

3

Re: AHK: WinGet List порядок

P@S@f пишет:

Хочу узнать, возможно ли получить список окон в порядке, в котором они были открыты (в котором они расположены на панели задач)?

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

4 (изменено: P@S@f, 2014-09-30 19:07:21)

Re: AHK: WinGet List порядок

Ах да, их же теперь можно перетаскивать...

teadrinker пишет:

получить время запуска процесса

А можно это делать как-то без COM объектов?

5

Re: AHK: WinGet List порядок

Скорее всего можно, но очень сложно, и как именно — не знаю.

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

6

Re: AHK: WinGet List порядок

Можно так:

PROCESS_QUERY_INFORMATION := 0x400

WinGet, PID, PID, A

hProc := DllCall("OpenProcess", UInt, PROCESS_QUERY_INFORMATION, UInt, 0, UInt, PID, Ptr)
DllCall("GetProcessTimes", Ptr, hProc, PtrP, CreationTime, PtrP, ExitTime, PtrP, KernelTime, PtrP, UserTime)
DllCall("CloseHandle", Ptr, hProc)

VarSetCapacity(SystemTime, 16)
DllCall("FileTimeToSystemTime", Ptr, &CreationTime, Ptr, &SystemTime)

Hour := NumGet(&SystemTime + 8, "UShort")
Min := NumGet(&SystemTime + 10, "UShort")
Sec := NumGet(&SystemTime + 12, "UShort")
MSec := NumGet(&SystemTime + 14, "UShort")

MsgBox, % Hour . Min . Sec . MSec

Urusal, свои комплексы вымещайте на кошках.

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

7

Re: AHK: WinGet List порядок

Немного поспешил, точнее будет так:

WinGet, PID, PID, A

hProc := DllCall("OpenProcess", UInt, PROCESS_QUERY_INFORMATION := 0x400, UInt, 0, UInt, PID, Ptr)
VarSetCapacity(CreationTime, 8)
DllCall("GetProcessTimes", Ptr, hProc, Ptr, &CreationTime, PtrP, ExitTime, PtrP, KernelTime, PtrP, UserTime)
DllCall("CloseHandle", Ptr, hProc)

VarSetCapacity(SystemTime, 16)
DllCall("FileTimeToSystemTime", Ptr, &CreationTime, Ptr, &SystemTime)

VarSetCapacity(LocalTime, 16)
DllCall("SystemTimeToTzSpecificLocalTime", Ptr, 0, Ptr, &SystemTime, Ptr, &LocalTime)

Year := NumGet(LocalTime, "UShort")
Month := SubStr("0" . NumGet(&LocalTime + 2, "UShort"), -1)
Day := SubStr("0" . NumGet(&LocalTime + 6, "UShort"), -1)
Hour := SubStr("0" . NumGet(&LocalTime + 8, "UShort"), -1)
Min := SubStr("0" . NumGet(&LocalTime + 10, "UShort"), -1)
Sec := SubStr("0" . NumGet(&LocalTime + 12, "UShort"), -1)

MsgBox, % Year . Month . Day . Hour . Min . Sec

Впрочем, чтобы просто выяснить, какой из процессов раньше запущен, достаточно сравнить их значение CreationTime. Однако, этот метод не подойдёт для окон проводника, т. к. все они относятся к одному процессу explorer.exe.

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