Что нового

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

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
Здравствуйте, уважаемые форумчане.
Помогите пожалуйста со скриптом.

Имеется скрипт располагающий окна открытые окна блокнота в определенном порядке.
Как сделать так, чтобы внутри большого развернутого окна файла txt (со словом в названии title - "Блокнот - 1") располагались другие окна блокнотов, закрепленные поверх этого конкретного окна - со словами в названии title : "Блокнот А", "Блокнот - 2", "Блокнот - 3", "Блокнот -X" ?
Скрипт должен все время находится в трее. Если открывается окно со словом в названии "Блокнот - 1" - он тут же запускает мелкие окна и располагает их с привязкой к правому верхнему углу экрана.
Если окно со словом в названии "Блокнот - 1" закрывается - скрипт тут же закрывает мелкие окна, со словами в названии title : "Блокнот А", "Блокнот - 2", "Блокнот - 3", "Блокнот -X".
Если окно со словом в названии "Блокнот - 1" скрыть или загородить другим окном - он тут же скроет или загородит мелкие окна.

Сейчас скрипт выглядит так:
Код:

Код:
#include <WinAPISys.au3>

Opt("WinTitleMatchMode", 2)
Opt("WinWaitDelay", 10)

; область рабочего стола
$tRECT = _WinAPI_GetWorkArea()
$iWidth = $tRECT.Right - $tRECT.Left
$iHeight = $tRECT.Bottom - $tRECT.Top

; поиск окон
$aList = WinList("Блокнот")
If Not $aList[0][0] Then Exit MsgBox(0x40000, "", "Окна не найдены")

If $aList[0][0] = 4 Then
  ; размещение четырёх окон в два ряда
  $iDX = $iWidth / 2
  $iDY = $iHeight / 2
  WinMove($aList[1][1], "", 0, 0 , $iDX, $iDY)
  WinMove($aList[2][1], "", $iDX, 0 , $iDX, $iDY)
  WinMove($aList[3][1], "", 0, $iDY , $iDX, $iDY)
  WinMove($aList[4][1], "", $iDX, $iDY , $iDX, $iDY)
Else
  ; размещение окон в один ряд
  $iDelta = $iWidth / $aList[0][0]
  For $i = 1 To $aList[0][0]
    WinMove($aList[$i][1], "", $iDelta * ($i - 1), 0 , $iDelta, $iHeight)
  Next
EndIf

For $i = 1 To $aList[0][0]
  WinActivate($aList[$i][1])
Next
 

Вложения

  • Image 1.jpg
    Image 1.jpg
    174.1 КБ · Просмотры: 7
  • Архив.rar
    856 байт · Просмотры: 2

musicstashall

Знающий
Сообщения
322
Репутация
7
Чтобы получить и обработать события открытия или закрытия окон, нужно использовать оконный хук
Код:
#include <APISysConstants.au3>
#include <WinAPISysWin.au3>

Opt('TrayAutoPause', 0)

OnAutoItExitRegister('OnAutoItExit')

Global $g_hForm = GUICreate('')
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), 'WM_SHELLHOOK')
_WinAPI_RegisterShellHookWindow($g_hForm)

While 1
    Sleep(1000)
WEnd

Func WM_SHELLHOOK($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg

    Switch $hWnd
        Case $g_hForm
            Local $sTitle = WinGetTitle($lParam)
            Switch $wParam
                Case $HSHELL_REDRAW
                    If IsString($sTitle) Then
                        ConsoleWrite('Redrawn: ' & $sTitle & @CRLF)
                    EndIf
                Case Else
                    If BitAND($wParam, $HSHELL_WINDOWACTIVATED) = $HSHELL_WINDOWACTIVATED And IsString($sTitle) Then
                        ConsoleWrite('Activated: ' & $sTitle & @CRLF)
                    EndIf
            EndSwitch
    EndSwitch
EndFunc   ;==>WM_SHELLHOOK

Func OnAutoItExit()
    _WinAPI_DeregisterShellHookWindow($g_hForm)
EndFunc   ;==>OnAutoItExit

Другие константы событий, не используемые в примере:
$HSHELL_WINDOWCREATED
$HSHELL_WINDOWDESTROYED
 
Автор
R

RipVanWinkel

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

Запускаю скрипт - ничего не происходит.
Запускаю все пять окон блокнота - тоже ничего не происходит.
 

musicstashall

Знающий
Сообщения
322
Репутация
7
Я привел пример использования хука окон. Это такая процедура, которая реагирует на создание, закрытие и активацию окон на рабочем столе. Тебе следует использовать такую процедуру, поиграй с ней, потестируй. Тебе следует добавить в конструкцию Switch еще два события $HSHELL_WINDOWCREATED — событие создания окна и $HSHELL_WINDOWDESTROYED — событие закрытия окна. Затем в секциях Case уже будешь выполнять свои какие-то перемещения.
Код:
Switch $wParam
   Case $HSHELL_WINDOWCREATED
        ; открыто какое-то окно, его хэндл в переменной $lParam
        WinGetTitle($lParam) ; получаем заголовок этого окна
       _WinAPI_GetClassName($lParam) ; получаем класс окна
       _ProcessGetName(WinGetProcess($lParam)) ; получаем имя процесса этого окна
   Case $HSHELL_WINDOWDESTROYED
        ; какое-то окно закрыто, его хэндл в переменной $lParam
         WinGetTitle($lParam) ; получаем заголовок этого окна
         _WinAPI_GetClassName($lParam) ; получаем класс окна
       _ProcessGetName(WinGetProcess($lParam)) ; получаем имя процесса этого окна
EndSwitch
 
Последнее редактирование:
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
musicstashall, так вы пример-то рабочий можете привести ?
хотя бы для одного окна.
(А остальные я сам сделаю)
 

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 $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 $title = 'Блокнот - 1' 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 = 2 To 5
                 $file = @DesktopDir & '\Блокнот - ' & $i & '.txt' ; путь и имя заменить на свои (@ScriptDir, @TempDir), число устанавливается по-умолчанию
                 _FileCreate($file)
                 Run('notepad.exe ' & $file)
              Next
           ElseIf $procc = 'notepad.exe' And ($title = 'Блокнот - 2' Or $title = 'Блокнот - 3' Or $title = 'Блокнот - 4' Or $title = 'Блокнот - 5') Then ; имена файлов заменить на установленные выше
              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)
              $X = $pos[2] - $W
           EndIf
        Case $HSHELL_WINDOWACTIVATED

        Case $HSHELL_WINDOWDESTROYED
           If $lParam = $aList[0] Then
              For $i = 1 To 4
                 WinClose($aList[$i]) ; если использовалась функция _WinAPI_SetParent, то всю эту секцию можно не использовать
              Next
           EndIf
    EndSwitch
EndFunc   ;==>WM_SHELLHOOK

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

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
musicstashall, Подскажите, а как запускать этот скрипт ?

Я вот заменил все названия и пути - на нужные, запускаю скрипт - ничего не происходит.
Запускаю все окна файлов txt - тоже ничего не происходит.
Запускаю скрипт - при открытых заранее окнах - тоже ничего не происходит.

Ошибки скрипт не выдает - просто висит в трее и ничего не делает.
 

musicstashall

Знающий
Сообщения
322
Репутация
7
Запускаешь скрипт и открываешь главный файл, в примере он обозначен как Блокнот - 1.txt, затем скрипт создает другие файлы и помещает их внутрь главного окна. Ты бы для начала ничего не изменял в скритпе, а наоборот подстроился бы под него, понял как работает, а потом уже подбил бы под себя.
 
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
musicstashall
запустил скрипт, затем открыл главный файл (Блокнот - 1.txt ).
Далее ничего не происходит - скрипт ничего не делает.
 

musicstashall

Знающий
Сообщения
322
Репутация
7
Именно Блокнот - 1.txt? Не может быть, проверь имя файла, чтобы соответствовало.
Сообщение автоматически объединено:

 
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
@musicstashall, еще раз проверяю.
Запустил скрипт, затем открыл главный файл (Блокнот - 1.txt ).
Далее ничего не происходит - скрипт ничего не делает.
Вот код с моими названиями окон.

Код:
#include <APISysConstants.au3>
#include <WinAPISysWin.au3>
#include <Process.au3>
#include <File.au3>
#include <Array.au3>
#include <Math.au3>

Opt('TrayAutoPause', 0)

OnAutoItExitRegister('OnAutoItExit')

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 $title = 'Блокнот - 1' 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 = 2 To 5
                 $file = @ScriptDir & '\Блокнот - 1.txt' ; путь и имя заменить на свои (@ScriptDir, @TempDir), число устанавливается по-умолчанию
                 _FileCreate($file)
                 Run('notepad.exe ' & $file)
              Next
           ElseIf $procc = 'notepad.exe' And ($title = 'Блокнот А' Or $title = 'Блокнот - 2' Or $title = 'Блокнот - 3' Or $title = 'Блокнот -X') Then ; имена файлов заменить на установленные выше
              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)
              $X = $pos[2] - $W
           EndIf
        Case $HSHELL_WINDOWACTIVATED

        Case $HSHELL_WINDOWDESTROYED
           If $lParam = $aList[0] Then
              For $i = 1 To 4
                 WinClose($aList[$i]) ; если использовалась функция _WinAPI_SetParent, то всю эту секцию можно не использовать
              Next
           EndIf
    EndSwitch
EndFunc   ;==>WM_SHELLHOOK

Func OnAutoItExit()
    _WinAPI_DeregisterShellHookWindow($g_hForm)
EndFunc   ;==>OnAutoItExit

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

Даже ваш скрипт запускал, ничего в нем не меняя - все равно ничего не работает.
 
Последнее редактирование:

musicstashall

Знающий
Сообщения
322
Репутация
7
Ты неправильно сделал! Внимательнее. Запусти исходный скрипт, затем открой в блокноте текстовый файл Блокнот - 1.txt и наблюдай процесс. Ты текстовые файлы в стандартном блокноте открываешь? В заголовке окна блокнота с открытым файлом присутствует имя файла?
Сообщение автоматически объединено:

Поставь после строки
Case $HSHELL_WINDOWCREATED
эту строку: ConsoleWrite('Title: ' & $title & @CR)
и смотри в консоли, какие сообщения будет писать, когда ты окна открываешь.
А это сообщение покажет тебе, какому процессу принадлежит окно: ConsoleWrite('Procc: ' & $procc & @CR)
Скрипт расчитан работать с окнами от notepad.exe
Сообщение автоматически объединено:

У тебя с твоим последним кодом должно было произойти смертельное зацикливание с безостановочным заваливанием окнами рабочего стола)) Наверняка не в блокноте открываешь файлы. Иначе бы прочувствовал все прелести своего скрипта))
Здесь $file = @ScriptDir & '\Блокнот - 1.txt' формируется имя файла вообще-то. А ты что сделал?? Зачем написал имя полностью, когда в имя должно было вставляться число??? Ты думай маленько-то, старайся.
Эта функция _FileCreate($file) создает новый файл. File — файл, Create — Создать. For $i = 2 To 5 — это цикл, который считает от 2 до 5 и крутит в своем теле содержимое четыре раза, а переменная $i принимает число цикла от 2 до 5, здесь и создаются файлы от Блокнот - 2.txt до Блокнот - 5.txt, то есть четыре новых файла.
Run('notepad.exe ' & $file) открывает созданный текстовый файл в программе notepad.exe
 
Последнее редактирование:
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
musicstashall, Написал данную строку.
В консоли выдался ответ :
Title: Блокнот - 1 — Блокнот
Дальше ничего не происходит.


Текстовые файлы я открываю в блокноте, разумеется (В чем же еще их можно открывать).
В заголовке окна блокнота с открытым файлом - естественно присутствует имя файла.
У меня стоит - самая обыкновенная программа notepad.exe


Нет, у меня смертельного зацикливания не происходит. Просто скрипт запускается и ничего не делает. И не реагирует на окно "Блокнот - 1".

Со скриптом я сейчас ничего не делаю (не дописываю ничего своего внутри него, а просто пытаюсь запустить).


И еще я не понимаю - зачем создавать 4 новых файла txt, когда файлы txt - уже есть, лежат рядом со скриптом и их просто нужно запустить ?
 

musicstashall

Знающий
Сообщения
322
Репутация
7
Title: Блокнот - 1 — Блокнот
А должно быть просто Блокнот - 1. В названии скрипт ищет вхождение в строку «.txt» и возвращает часть строки слева до этого вхождения StringSplit(WinGetTitle($lParam), '.txt', 3)[0], должно получиться Блокнот - 1. Когда ты открываешь текстовый файл, в заголовке у тебя так же написано, как у меня? Смотри скрин: имя.расширение - Блокнот. В заголовке окна должно присутствовать .txt, по всей видимости, ты открываешь файлы не содержащие .txt

И еще я не понимаю - зачем создавать 4 новых файла txt, когда файлы txt - уже есть, лежат рядом со скриптом и их просто нужно запустить ?
Ты же писал, что скрипт запускает мелкие окна. Это и не важно сейчас, основную задачу сначала реши, потом будешь изменять.
 
Последнее редактирование:
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
А должно быть просто Блокнот - 1.
Файл и называется "Блокнот - 1"
Notepad самостоятельно приписывает к нему дополнительное слово.

Я же специально в первом сообщении написал:
со словом в названии title - "Блокнот - 1"
Слово "Блокнот - 1" - в названии Title - сейчас имеется.
 

musicstashall

Знающий
Сообщения
322
Репутация
7
Файл и называется "Блокнот - 1"
Notepad самостоятельно приписывает к нему дополнительное слово.

Я же специально в первом сообщении написал:

Слово "Блокнот - 1" - в названии Title - сейчас имеется.
Ты жутко невнимателен. Я просил убедиться, присутствует ли в заголовке «.txt»??? Текстовые файлы имеют расширение .txt???
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Чтобы в заголовке окна блокнота отображалось расширение txt нужно в свойствах папок отключить опцию "Скрывать расширения для зарегистрированных типов файлов". По умолчанию данная опция включена и расширение txt в заголовке блокнота не отображается.
 
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
musicstashall, понятно.
Теперь окна запустились.

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

Также эти окна как-то странно отображаются - достаточно щелкнуть по основному окну - и мелкие окна исчезают из поля зрения.
 

musicstashall

Знающий
Сообщения
322
Репутация
7
войствах папок отключить опцию "Скрывать расширения для зарегистрированных типов файлов"
Как раз только об этом подумал и решил написать))
Сейчас попробую получать имя файла от системы непосредственно, где-то видел такие примеры.
Сообщение автоматически объединено:

musicstashall, понятно.
Теперь окна запустились.

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

Также эти окна как-то странно отображаются - достаточно щелкнуть по основному окну - и мелкие окна исчезают из поля зрения.
Понятное дело. Теперь подробнее опиши, что ты хочешь от файлов, какие имена и принципиально ли имя, сколько планируется файлов, может ли быть больше четырех или меньше и тд...
 
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
musicstashall
от файлов хочу вот чего:
Они (эти файлы txt) лежат в папке со скриптом. У них имена - не по порядку идут, чтобы их можно было проиндексировать.
Названия такие: "Блокнот А", "Блокнот - 2", "Блокнот - 3", "Блокнот -X".
Может быть - этих окон - больше или меньше четырех (то есть соответственно как и файлов). Но никогда не бывает меньше двух или больше восьми.
 
Верх