Что нового

Как скриптом расположить окна блокнотов в определенном порядке - поверх другого конкретного большого окна блокнота

musicstashall

Знающий
Сообщения
322
Репутация
7
Код:
#include <APISysConstants.au3>
#include <WinAPISysWin.au3>
#include <Process.au3>
#include <File.au3>
#include <Array.au3>
#include <Math.au3>

Opt('TrayAutoPause', 0)

OnAutoItExitRegister('OnAutoItExit')

Global $MainName = 'Блокнот - 1' ; главный файл, имя задай здесь
Global $FileList[4] = ['Блокнот А', 'Блокнот - 2', 'Блокнот - 3', 'Блокнот - X'] ; прочие файлы, имя задай здесь (без расширения .txt)
Global $Path = @ScriptDir & '\' ; путь к файлам, задай свой

Global $g_hForm = GUICreate('')
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), 'WM_SHELLHOOK')
_WinAPI_RegisterShellHookWindow($g_hForm)
Global $aList[1], $pos, $X, $Y, $W, $H
While 1
    Sleep(1000)
WEnd

Func WM_SHELLHOOK($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg
    Local $procc = _ProcessGetName(WinGetProcess($lParam))
    Local $class = _WinAPI_GetClassName($lParam), $file
    Local $title = StringSplit(WinGetTitle($lParam), '.txt', 3)[0]
    Switch $wParam
        Case $HSHELL_WINDOWCREATED
           If $procc = 'notepad.exe' And StringInStr($title, $MainName) Then
              $aList[0] = $lParam
              WinSetState($lParam, '', @SW_MAXIMIZE)
              $pos = WinGetPos($lParam)
              $W = $pos[2]/4
              $H = $pos[3]/4
              $X = $pos[2] - $W
              $Y = -$H
              For $i = 0 To Ubound($FileList) -1
                 Run('notepad.exe ' & $Path & $FileList[$i] & '.txt')
              Next
           ElseIf $procc = 'notepad.exe' And StringInStr(_ArrayToString($FileList), $title) Then
              If UBound($aList) = 5 Then Return 1 ; число 5 в этой строке — это общее количество файлов, включая главный, можно заменить на Ubound($FileList) +1, тогда автоматом будет ставить
              Local $index = _ArrayAdd($aList, $lParam)
              If _MathCheckDiv($index, 2) = 1 Then $Y += $H
              If _MathCheckDiv($index, 2) = 2 Then $X -= $W
              ;_WinAPI_SetParent($lParam, $aList[0])
              WinMove($lParam, '', $X, $Y, $W, $H)
              WinSetOnTop($lParam, '', 1)
              $X = $pos[2] - $W
           EndIf
        Case $HSHELL_WINDOWDESTROYED
           If $lParam = $aList[0] Then
              For $i = 1 To Ubound($aList) -1
                 WinClose($aList[$i])
              Next
           EndIf
        Case Else
           If Not BitAND($wParam, $HSHELL_WINDOWACTIVATED) = $HSHELL_WINDOWACTIVATED Then Return 1
           ; здесь можно обрабатывать активированные окна, поставь сюда ConsoleWrite(....) и смотри, что происзодит в этой секции
    EndSwitch
EndFunc   ;==>WM_SHELLHOOK

Func OnAutoItExit()
    _WinAPI_DeregisterShellHookWindow($g_hForm)
EndFunc   ;==>OnAutoItExit
 
Последнее редактирование:
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
musicstashall,теперь скрипт работает - очень даже ничего.
Однако остается один вопрос.

Вот эти мелкие окна - запускаются сразу поверх всех открытых на компьютере окон.
Тогда как они должны быть открыты лишь поверх окна "Блокнот - 1", и сворачиваться вместе с ним (сейчас они только открываются вместе с ним и закрываются тоже).
Но они также должны и сворачиваться-разворачиваться вместе с тем окном к которому привязаны.
 

musicstashall

Знающий
Сообщения
322
Репутация
7
Тогда замени или допиши еще это:
Код:
;$Y = -$H
$Y = -$H + _WinAPI_GetSystemMetrics(4)


И это:
Код:
;$H = $pos[3]/4
$H = ($pos[3]-_WinAPI_GetSystemMetrics(4))/4

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

Строку замените
Хорошо бы еще к дочерним окнам применить стиль $WS_EX_MDICHILD
Код:
_WinAPI_SetWindowLong($lParam, $GWL_EXSTYLE, BitOR(_WinAPI_GetWindowLong($lParam, $GWL_EXSTYLE), $WS_EX_MDICHILD))

Но не получается зацепить дочерние
 
Последнее редактирование:
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
А как сделать, чтобы при открытии скрипт - сразу запускалось главное окно, а при закрытии окна - закрывался скрипт ?
 

musicstashall

Знающий
Сообщения
322
Репутация
7
А как сделать, чтобы при открытии скрипт - сразу запускалось главное окно
Ну есть ведь всё у тебя уже, смотри. Всё объяснял тебе. Run('notepad.exe ' & $Path & $FileList[$i] & '.txt') — как раз открывает файлы. Немного измени пути, имена, вставь строку куда следует. Если надо, чтобы при запуске скрипта открывался, то, соответственно, в начало скрипта. $FileList — это массив с именами файлов, в котором нет главного файла. Следовательно, убрать $FileList и заменить строкой с именем главного файла: 'Блокнот - 1.txt'
а при закрытии окна - закрывался скрипт
Дальше смотри, где у тебя окна закрываются? Это секция события $HSHELL_WINDOWDESTROYED, в ней цикл, он крутит в себе весь массив с окнами и закрывает их по очереди. Тебе следует после цикла добавить еще одну строку — Exit. Сделай что нибудь сам.
 
Последнее редактирование:
Верх