<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: обтекание определенного окна Windows другими окнами]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=16615&amp;type=atom" />
	<updated>2021-09-28T19:54:46Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=16615</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149788#p149788" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong>,&nbsp; Вообщем отследить их смог, но было куча мороки, долго игрался чтобы они корректно видоизменялись. <br />Наконец-то закончил весь код:<br /></p><div class="codebox"><pre><code>
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

;список окон IE. 
global My_Array := Array()

;id целевого окна (ОБТЕКАЕМОГО)
global mainWinId := 0

;Получить размеры рабочей области экрана
getMonitor(){
	cArray := Array()
	SysGet, Monitor, Monitor, 1
	SysGet, MonitorWorkArea, MonitorWorkArea, 1
	WinGetPos,,,_w_, _h_, ahk_class Shell_TrayWnd   ;получить размеры панели управления
	
	cArray.1 := MonitorWorkAreaRight
	cArray.2 := MonitorBottom - _h_
	
	return cArray
}	

;Ширина и высота изначально рабочей области экрана
c_Array := getMonitor()
global scrWorkArea_w := c_Array.1
global scrWorkArea_h := c_Array.2

;Ширина и высота рамки блокируемой области
global frame_w := 500		
global frame_h := 200

;проверяем является ли окном IE
Check_id(id_old){
	ch := false
	for index, element in My_Array
	{
		if(id_old == element){
			ch := true
		}
	}
	return ch
}

;двигаем все окна кроме целевого
moveOrdWin(){
	
	;обрабатываем окна IE
	IfWinExist, ahk_class IEFrame        
	{
		WinGet, id, list, ahk_exe iexplore.exe
		Loop, %id% {
			this_id := id%A_Index%
			My_Array.Push(this_id)			;добавляем в список окон IE. Окна IE надо обрабатывать отдельно от др. окон
			if(this_id != mainWinId){
				WinGetPos, X, Y, , , ahk_id %this_id%
				if((X&lt;frame_w)and(Y&lt;frame_h)){			;если находится в блокируемой области 
					WinActivate, ahk_id %this_id%
					SysGet, m1, Monitor, 1
					
					;у IE окна не только класса IEFrame, поэтому надо 2 раза фигачить WinMove на всякий случай
					WinMove, ahk_class IEFrame,, frame_w+1, 0, scrWorkArea_w-frame_w-1, scrWorkArea_h
					WinMove,,, frame_w+1, 0, scrWorkArea_w-frame_w-1, scrWorkArea_h	
					
				}
			}
		}
	}
	
	;обрабатываем все остальные окна 
	WinGet, id, list,,, Program Manager
	Loop, %id% {
		this_id := id%A_Index%
		if(this_id != mainWinId){
			go := Check_id(this_id)
			if(go == false){			;проверяем если не окно IE
				WinGetPos, X, Y, , , ahk_id %this_id%
				if((X&lt;frame_w)and(Y&lt;frame_h)){				
					WinGet, WinStatus, MinMax, ahk_id %this_id%
					if (WinStatus != 0)
						WinRestore, ahk_id %this_id%
					WinMove, ahk_id %this_id%,, frame_w+1, 0, scrWorkArea_w-frame_w-1, scrWorkArea_h	
				}
			}
		}
	}
}

;Включить отслеживание открытия нового окна
DllCall(&quot;RegisterShellHookWindow&quot;, Ptr, A_ScriptHwnd) 
OnMessage(DllCall(&quot;RegisterWindowMessage&quot;, Str, &quot;SHELLHOOK&quot;), &quot;ShellProc&quot;) 
OnExit(&quot;Exit&quot;)
Return

ShellProc(nCode, hWnd) {
   static HSHELL_WINDOWCREATED := 1
   if (nCode = HSHELL_WINDOWCREATED) {
		cX := frame_w + 1
		cY := 0
		WinGetClass, this_class, ahk_id %hWnd%
		if(this_class != &quot;#32770&quot;)
			WinMove, ahk_id %hWnd%,, frame_w+1, 0, scrWorkArea_w - frame_w - 1, scrWorkArea_h
   }
}

Exit()  {
   DllCall(&quot;DeregisterShellHookWindow&quot;, Ptr, A_ScriptHwnd)
}

;Включаем целевое окно
^+1:: 
	if(mainWinId == 0){
		WinGet, active_id, ID, A
		mainWinId := active_id
		WinGet, WinStatus, MinMax, ahk_id %active_id%
		if (WinStatus != 0)
			WinRestore, ahk_id %active_id%
		WinMove, ahk_id %active_id%,, 0, 0, frame_w, frame_h
		Winset, Alwaysontop, , ahk_id %active_id%
		moveOrdWin()
	} else {
		WinGetTitle, Title, ahk_id %mainWinId%
		MsgBox, Прежде выключите целевое окно: %Title%
	}
	
return

;Выключаем целевое окно
^+2:: 
	WinGet, active_id, ID, A
	if(mainWinId = active_id){
		mainWinId := 0
		Winset, Alwaysontop, , ahk_id %active_id%
	}
return

;двигаем все окна, кроме целевого
^3::moveOrdWin()

</code></pre></div><p>От идеи мониторинга перемещения всех окон отказался. Боюсь что будет грузить систему если он каждую секунду будет прозванивать десяток окон. Сделал передвижение окон по кнопке. </p><p>И еще, почему-то IE отказывается быть целевым окном. Я вроде добавляю его id в исключение(чтобы только его не видоизменять), а он каким-то образом после этого плодит себе копию с другим id. Фиг его знает что не так с этим IE. <br />Ну, мне всеравно, мне для работы надо чтобы Excel всегда был на виду. Работает - и это главное.</p><p><strong>teadrinker</strong>, спасибо еще раз за помощь! Тему можно закрывать</p>]]></content>
			<author>
				<name><![CDATA[mike.sunday19]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=42017</uri>
			</author>
			<updated>2021-09-28T19:54:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149788#p149788</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149776#p149776" />
			<content type="html"><![CDATA[<p>У интернет эксплорера есть сразу несколько отдельных окон, можете отследить их так:<br /></p><div class="codebox"><pre><code>Run iexplore.exe
WinWait, ahk_class IEFrame
Sleep, 3000
WinGet, id, list, ahk_exe iexplore.exe
Loop, %id% {
   this_id := id%A_Index%
   WinGetClass, this_class, ahk_id %this_id%
   WinGetTitle, title, ahk_id %this_id%
   MsgBox, % &quot;title: &quot; . title . &quot;`nclass: &quot; . this_class
}</code></pre></div><p>Точно не знаю почему, но манипуляции с этими окнами, кроме главного, и приводят к такому результату.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2021-09-26T17:07:38Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149776#p149776</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149772#p149772" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong> спасибо большое за код, очень помогли.<br />Однако я пытался доработать, чтобы изменять положение и размер окон по нажатию горячих клавиш, и у меня возникли проблемы с браузером Internet Explorer. Окна всех остальных приложений вроде изменяются как надо. А вот IE тупит. Вроде он изменился, но вот зайти в него после выполненного действия над ним, не могу.<br />Подскажите пожалуйста в чем проблема.<br />Выкладываю код:<br /></p><div class="codebox"><pre><code>
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.


;Получить размеры рабочей области экрана
getMonitor(){
	Array := Array()
	SysGet, Monitor, Monitor, 1
	SysGet, MonitorWorkArea, MonitorWorkArea, 1
	WinGetPos,,,_w_, _h_, ahk_class Shell_TrayWnd   ;получить размеры панели управления
	
	Array.1 := MonitorWorkAreaRight
	Array.2 := MonitorBottom - _h_
	
	return Array
}	

;Ширина и высота изначально рабочей области экрана
Array := Array()
Array := getMonitor()
global scrWorkArea_w := Array.1
global scrWorkArea_h := Array.2

;Ширина и высота рамки блокируемой области
global frame_w := 500		
global frame_h := 200



;Включить отслеживание открытия нового окна
DllCall(&quot;RegisterShellHookWindow&quot;, Ptr, A_ScriptHwnd) 
OnMessage(DllCall(&quot;RegisterWindowMessage&quot;, Str, &quot;SHELLHOOK&quot;), &quot;ShellProc&quot;) 
OnExit(&quot;Exit&quot;)
Return

ShellProc(nCode, hWnd) {
   static HSHELL_WINDOWCREATED := 1
   if (nCode = HSHELL_WINDOWCREATED) {
		;Sleep, 5000
		cX := frame_w + 1
		cY := 0
		WinMove, ahk_id %hWnd%,, cX, cY, scrWorkArea_w - frame_w - 1, scrWorkArea_h
   }
}

Exit()  {
   DllCall(&quot;DeregisterShellHookWindow&quot;, Ptr, A_ScriptHwnd)
}

^3::
	WinGet, id, list,,, Program Manager
	Loop, %id% {
		this_id := id%A_Index%
		
		WinGetPos, X, Y, , , ahk_id %this_id%
		if((X&lt;frame_w)and(Y&lt;frame_h)){
			WinGet, WinStatus, MinMax, ahk_id %this_id%
			WinGetClass, this_class, ahk_id %this_id%
			if (WinStatus != 0)
				WinRestore, ahk_id %this_id%
			cX := frame_w + 1
			cY := 0

			WinMove, ahk_id %this_id%,, cX, cY, scrWorkArea_w - frame_w - 1, scrWorkArea_h
		}
	}
return
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[mike.sunday19]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=42017</uri>
			</author>
			<updated>2021-09-26T15:28:13Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149772#p149772</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149749#p149749" />
			<content type="html"><![CDATA[<p>Вот так можно отследить возникновение нового окна и переместить его сразу куда-нибудь:<br /></p><div class="codebox"><pre><code>DllCall(&quot;RegisterShellHookWindow&quot;, Ptr, A_ScriptHwnd) 
OnMessage(DllCall(&quot;RegisterWindowMessage&quot;, Str, &quot;SHELLHOOK&quot;), &quot;ShellProc&quot;) 
OnExit(&quot;Exit&quot;)
Return

ShellProc(nCode, hWnd) {
   static HSHELL_WINDOWCREATED := 1
   if (nCode = HSHELL_WINDOWCREATED) {
      WinMove, ahk_id %hWnd%,, 100, 100
   }
}

Exit()  {
   DllCall(&quot;DeregisterShellHookWindow&quot;, Ptr, A_ScriptHwnd)
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2021-09-25T15:28:23Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149749#p149749</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149745#p149745" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>ypppu пишет:</cite><blockquote><p>Перефразирую. Надо чтобы другие окна не могли переходить границу целевого окна.</p></blockquote></div><p> все верно.</p><div class="quotebox"><cite>ypppu пишет:</cite><blockquote><p>Только тогда не понятно, что будет, если целевое окно появилось позже всех, и при этом произошло наложение. Оно должно раздвинуть соседние окна? И такой же вопрос - что будет, если целевое окно растягивать мышкой. Оно должно расталкивать остальные окна или упереться в них?</p></blockquote></div><p> Если честно так далеко я не задумывался <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" />. Сейчас думая об этом, чтобы сделать все проще - может просто выделить прямоугольную область в левом верхнем углу, в которую запрещен доступ всем окнам, кроме целевого? Можно даже выделить ее рамкой. Туда буду помещать целевое окно и вручную погнонять его размер под рамку. А изменять размеры рамки, если вдруг понадобится можно через параметры length и width при редактировании скрипта. <br />Однако если до включения скрипта в этой области были окна - надо все-таки чтобы рамка раздвинула эти окна. <br />Да, тогда все упрощается. Как вам идея?</p>]]></content>
			<author>
				<name><![CDATA[mike.sunday19]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=42017</uri>
			</author>
			<updated>2021-09-25T11:55:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149745#p149745</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149744#p149744" />
			<content type="html"><![CDATA[<p>Перефразирую. Надо чтобы другие окна не могли переходить границу целевого окна.<br />Только тогда не понятно, что будет, если целевое окно появилось позже всех, и при этом произошло наложение. Оно должно раздвинуть соседние окна? И такой же вопрос - что будет, если целевое окно растягивать мышкой. Оно должно расталкивать остальные окна или упереться в них?</p>]]></content>
			<author>
				<name><![CDATA[ypppu]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5974</uri>
			</author>
			<updated>2021-09-25T11:27:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149744#p149744</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149741#p149741" />
			<content type="html"><![CDATA[<p><strong>ypppu</strong>, Слово &quot;Обтекают&quot; я взял из Worda. Там когда вставляешь картинку, в ее форматировании есть способ &quot;обтекания текста&quot; вставленной картинки. По тому же принципу я хочу чтобы работали все окна относительно главного окна. <br />Ладно, тогда покажу в картинке. Выкладываю пример. В примере окном, которое должно всегда быть на виду и не мешать другим окнам - это окно Блокнот.<br />P.S. мда пожалуй в приведенном раньше примере панели управления меню Пуск я немного затупил. Окна ее не обтекают, они также заходят за нее.</p>]]></content>
			<author>
				<name><![CDATA[mike.sunday19]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=42017</uri>
			</author>
			<updated>2021-09-25T10:56:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149741#p149741</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149740#p149740" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>mike.sunday19 пишет:</cite><blockquote><p>другие окна должны просто обтекать</p></blockquote></div><p>Какое-то новое выражение. Это как? Можно пример в виде картинки?</p>]]></content>
			<author>
				<name><![CDATA[ypppu]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5974</uri>
			</author>
			<updated>2021-09-25T10:17:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149740#p149740</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149731#p149731" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong> этот хук будет производиться средствами AHK? <br />Дело в том, что админы у нас на работе ограничили возможности системы Windows для сотрудников. Я и так очень удивился, когда увидел что можно пользоваться AutoHotKey. Ну она наверно безобидная для системы.<br />В любом случае подскажите пожалуйста что за хук, а там посмотрим, может и он будет работать))</p>]]></content>
			<author>
				<name><![CDATA[mike.sunday19]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=42017</uri>
			</author>
			<updated>2021-09-25T09:19:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149731#p149731</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149729#p149729" />
			<content type="html"><![CDATA[<p>Если хотите поймать момент появления новых окон, существует специальный хук для этого, даже несколько. Попозже смогу провести пример.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2021-09-25T09:05:18Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149729#p149729</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149728#p149728" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong> для начал мне надо разобраться с алгоритмом. Вот что я пока придумал:<br /></p><div class="codebox"><pre><code>-Получить координаты и размер активного окна №1 (которое все остальные должны обтекать)
цикл (пока работает скрипт) {
	- Получить список всех других открытых окон
	- Задать для них координаты(переместить), не входящие в область, покрывающую окно №1
	- Пауза на 500 мс
}</code></pre></div><p>Однако я думаю может есть вариант по-проще, не заставляющий скрипт мониторить все окна каждые 500мс? Вдруг это будет нагружать осн. систему?<br />Мне интересно по такому же принципу написан код раб.стола Windows? Ведь окна не заходят ниже Панели задач, где меню Пуск. Панель их ограничивает, и они ее обтекают. Причем если панель не закреплена, можно изменить ее ширину и доступная область для окон сужается. Разработчики ОС так же все делали?<br />Я лишь начинающий в программировании, подскажите как лучше сделать?</p>]]></content>
			<author>
				<name><![CDATA[mike.sunday19]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=42017</uri>
			</author>
			<updated>2021-09-25T09:00:30Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149728#p149728</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149708#p149708" />
			<content type="html"><![CDATA[<p>Вы можете перемещать любые окна и изменять их размер с помощью команды WinMove.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2021-09-24T21:55:13Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149708#p149708</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: обтекание определенного окна Windows другими окнами]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149707#p149707" />
			<content type="html"><![CDATA[<p>Есть окно программы (назовем №1), которое всегда должно быть на виду, а также не загораживать другие окна. Т.е. другие окна должны просто обтекать окно №1.<br />Возможно ли такое реализовать с помощью AHK?<br />P.S. Нашел скрипт который делает окно всегда поверх других окон:<br /></p><div class="codebox"><pre><code>^+SPACE:: Winset, Alwaysontop, , A</code></pre></div><p>Но это не то. Т.к. когда открываются новые окна - окно №1 загораживает их, и приходится изменять положение&nbsp; и размер у каждого нового открытого окна. А в процессе работы их открываются много.</p>]]></content>
			<author>
				<name><![CDATA[mike.sunday19]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=42017</uri>
			</author>
			<updated>2021-09-24T21:19:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149707#p149707</id>
		</entry>
</feed>
