<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6617</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6617&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: скрытие и отображение активного окна по горячим клавишам».]]></description>
		<lastBuildDate>Tue, 15 Sep 2015 12:37:25 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=97456#p97456</link>
			<description><![CDATA[<div class="codebox"><pre><code>
WinWait, Program Window
Winhide, Program Window
WinWaitClose, Program Window
...</code></pre></div><p>В сценарии используется ожидание закрытия окна как условия. В то же время хотелось бы, чтобы само окно было невидимым. Используя представленный вариант окно появляется на короткий промежуток времени. Можно ли предотвратить появление окна, чтобы оно было невидимым с начала активности?<br /><span style="color: grey">Допускается вариант, при котором останется невозможным опираться на условие закрытия данного окна, т.к. параллельно с ним может использоваться другое окно, которое закрывается одновременно с ним.</span></p>]]></description>
			<author><![CDATA[null@example.com (becauseim)]]></author>
			<pubDate>Tue, 15 Sep 2015 12:37:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=97456#p97456</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55225#p55225</link>
			<description><![CDATA[<p><strong>teadrinker</strong>,<br />У меня вопрос по вашему коду:<br />Я его изменил вот так:<br /></p><div class="codebox"><pre><code>global ArrayMinimisedID := []
global EVENT_SYSTEM_MINIMIZESTART := 0x16
global EVENT_SYSTEM_MINIMIZEEND := 0x17

WinGet, List, List
Loop % List
{
    WinGet, MinMax, MinMax, % &quot;ahk_id&quot; List%A_Index%
    if MinMax = -1
        ArrayMinimisedID.Insert(List%A_Index%)
}

DllCall(&quot;SetWinEventHook&quot;, UInt, EVENT_SYSTEM_MINIMIZESTART
                        , UInt, EVENT_SYSTEM_MINIMIZEEND
                        , UInt, 0
                        , UInt, RegisterCallback(&quot;HookProc&quot;, &quot;F&quot;)
                        , UInt, 0 , UInt, 0 , UInt, 0)
Return
 
HookProc(hWinEventHook, event, hwnd)
{
    if (event = EVENT_SYSTEM_MINIMIZESTART)
        ArrayMinimisedID.Insert(1, hwnd)

    if (event = EVENT_SYSTEM_MINIMIZEEND)
        for k, v in ArrayMinimisedID
            if (v = hwnd)
                ArrayMinimisedID.Remove(k, k)
}

~*#Ctrl::
    WinGetClass, class, A
    if !(class ~= &quot;Progman|WorkerW|Shell_TrayWnd|Button&quot;)
        WinMinimize, A
    Return


^LWin::
    ID := ArrayMinimisedID.1
    WinRestore, % &quot;ahk_id &quot; ID
    WinActivate, % &quot;ahk_id &quot; ID
    Return</code></pre></div><p>Чем такой подход хуже вашего?</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Sun, 01 Jan 2012 15:25:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55225#p55225</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55215#p55215</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>2.Б. Прозреваю, что возможен конфликт с хоткеем Win+Ctrl, которого хотелось бы избежать.</p></blockquote></div><p>Я так понимаю, что этого можно избежать проверкой через <strong>A_PriorKey</strong>?</p><p><strong>Добавление:</strong><br />А, не важно: добавил<br /></p><div class="codebox"><pre><code>if !GetKeyState(&quot;LShift&quot;, &quot;P&quot;)
{
...
}</code></pre></div><p>проверку при выполнении кода LWin+LCtrl, так что он не выполняется, если в этот момент нажат шифт, тем самым избежал конфликта.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Sun, 01 Jan 2012 00:41:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55215#p55215</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55146#p55146</link>
			<description><![CDATA[<p>Спасибо большое.<br />Осталась просьба только по пункту 2.<br />Вот такой код:<br /></p><div class="codebox"><pre><code>#Ctrl::GoSub, Label1
#+Ctrl::GoSub, Label2

Label1:
WinGetClass, class, A
If (class = WorkerW) {
return
} Else {
WinMinimize, A
}
return

Label2:
   Send, #d
return</code></pre></div><p>работает без коллизий.<br />Привёл этот код в надежде, что с его помощью вам или кому-то ещё - всё-таки удастся добавить выпрашиваемую мной функцию без глюков.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 29 Dec 2011 22:12:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55146#p55146</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55145#p55145</link>
			<description><![CDATA[<p>1. Это можно, код в конце.<br />2. Это проблематично, действительно могут возникнуть нестыковки, лучше использовать другую комбинацию. Нужные команды — <a href="http://l.autohotkey.net/docs/commands/WinMinimizeAll.htm">WinMinimizeAll и WinMinimizeAllUndo</a>.<br />3. Можно в самый конец кода.<br />4. В данном случае они не нужны, читай хелп по ним.<br />5. При использовании Ctrl, Alt и Shift в качестве хоткеев лучше указывать конкретную клавишу, можешь поэкспериментировать с ними. Горячей клавиши Win не существует.<br />6. Прокомментировал, но для новичка будет сложновато.<br /></p><div class="codebox"><pre><code>global ArrayMinimisedID := []   ; в этот массив будут записываться все минимизированные окна
global EVENT_SYSTEM_MINIMIZESTART := 0x16
global EVENT_SYSTEM_MINIMIZEEND := 0x17
; создаём изначально отключённую горячую клавишу LWin, которую будем включать при необходимости.
Hotkey, *LWin, Win, Off   

WinGet, List, List
Loop % List
{
   WinGet, MinMax, MinMax, % &quot;ahk_id&quot; List%A_Index%
   if MinMax = -1
      ArrayMinimisedID.Insert(List%A_Index%)  ; записываем в массив все минимизированные до начала работы скрипта окна
}
; устанавливаем хук, отслеживающий события минимизации и восстановления
; информация — http://msdn.microsoft.com/en-us/library/windows/desktop/dd373640%28v=vs.85%29.aspx
DllCall(&quot;SetWinEventHook&quot;, UInt, EVENT_SYSTEM_MINIMIZESTART
                         , UInt, EVENT_SYSTEM_MINIMIZEEND
                         , UInt, 0
                         , UInt, RegisterCallback(&quot;HookProc&quot;, &quot;F&quot;)
                         , UInt, 0 , UInt, 0 , UInt, 0)
Return

HookProc(hWinEventHook, event, hwnd)
{
   if (event = EVENT_SYSTEM_MINIMIZESTART)
      ArrayMinimisedID.Insert(1, hwnd)   ; при минимизации какого-л. окна записываем его идентификатор в массив

   if (event = EVENT_SYSTEM_MINIMIZEEND)  ; при восстановлении какого-л. окна исключаем его идентификатор из массива
      for k, v in ArrayMinimisedID
         if (v = hwnd)
            ArrayMinimisedID.Remove(k, k)
}

~*LCtrl::
   if !GetKeyState(&quot;LWin&quot;, &quot;P&quot;)
   {
      Hotkey, *LWin, On
      Return
   }

   WinGetClass, class, A
   if !(class ~= &quot;Progman|WorkerW|Shell_TrayWnd&quot;)
      WinMinimize, A
   Return

~*LCtrl Up:: Hotkey, *LWin, Off

Win:
   ID := ArrayMinimisedID.1
   WinRestore, % &quot;ahk_id &quot; ID
   WinActivate, % &quot;ahk_id &quot; ID
   Return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 29 Dec 2011 21:41:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55145#p55145</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55143#p55143</link>
			<description><![CDATA[<p>Поправка для 2-ого пункта: лучше посылать не Win+D, а Win+M и Win+Shift+M как обратное действие.<br />Вспомнил, что после нажатия Win+D часто открытие какой-нибудь папки может не только открыть окно этой папки, но в некоторых случаях и другие окна.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 29 Dec 2011 21:18:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55143#p55143</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55141#p55141</link>
			<description><![CDATA[<p>Спасибо, работает, но выбран плохой подход: этот скрипт делает невозможным использование любых системных хоткеев начинающихся с Win, если использовать левую Win. Для меня это не допустимо.<br />Мне также интересно и самому научиться скриптить на AHK, а потому имеется ряд вопросов и просьб.<br />1. Пожалуйста, исправьте скрипт таким образом, чтобы избежать конфликта, приводящего к невозможности использования Win+... хоткеев, при нажатии LWin.<br />2.А. Прикрутите пожалуйста к скрипту массовое действие если используется Shift:<br />Win+Shift+Ctrl = сделать так, чтобы посылался Win+D (ну или, может быть, лучше будет не ссылаться на системный хоткей, а просто назначить выполнение этой же функции. Ну а повторное нажатие - чтобы их, естественно, возвращало обратно (как это делает и повторное нажатие Win+D).<br />2.Б. Прозреваю, что возможен конфликт с хоткеем Win+Ctrl, которого хотелось бы избежать.<br />3. И можно ещё тогда сразу же попросить приделать к скрипту ещё 1 функцию?<br />У меня уже имеется написанный для неё код, но я не знаю куда его было бы правильно вписать:<br /></p><div class="codebox"><pre><code>#`::Winset, Alwaysontop, , A</code></pre></div><p>4. Почему в начале скрипта нет никаких общих строк типа <br />SetBatchLines, -1<br />#SingleInstance force<br />#NoEnv<br />SetBatchLines, -1<br />SendMode Input<br />и т.д.? Если честно я понимаю предназначение не каждой из них, но они есть во многих скриптах.<br />5. Почему выбрано ограничение на только левые Win и Ctrl? Если я изменю LWin и LCtrl на Win и Ctrl - это чем-то чревато?<br />6. По возможности - прокомментируйте код, чтобы можно было использовать его в качестве материала для изучения новичками.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 29 Dec 2011 20:58:09 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55141#p55141</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55140#p55140</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Хотелось бы Win+Ctrl на сворачивание и Ctrl+Win на разворачивание.</p></blockquote></div><p>Так как-нибудь:<br /></p><div class="codebox"><pre><code>global ArrayMinimisedID := []
global EVENT_SYSTEM_MINIMIZESTART := 0x16
global EVENT_SYSTEM_MINIMIZEEND := 0x17

WinGet, List, List
Loop % List
{
   WinGet, MinMax, MinMax, % &quot;ahk_id&quot; List%A_Index%
   if MinMax = -1
      ArrayMinimisedID.Insert(List%A_Index%)
}

DllCall(&quot;SetWinEventHook&quot;, UInt, EVENT_SYSTEM_MINIMIZESTART
                         , UInt, EVENT_SYSTEM_MINIMIZEEND
                         , UInt, 0
                         , UInt, RegisterCallback(&quot;HookProc&quot;, &quot;F&quot;)
                         , UInt, 0
                         , UInt, 0
                         , UInt, 0)
Return
                         
HookProc(hWinEventHook, event, hwnd)
{
   if (event = EVENT_SYSTEM_MINIMIZESTART)
      ArrayMinimisedID.Insert(1, hwnd)

   if (event = EVENT_SYSTEM_MINIMIZEEND)
      for k, v in ArrayMinimisedID
         if (v = hwnd)
            ArrayMinimisedID.Remove(k, k)
}

~*LCtrl::
   if !GetKeyState(&quot;LWin&quot;, &quot;P&quot;)
      Return
      
   WinGetClass, class, A
   if !(class ~= &quot;Progman|WorkerW|Shell_TrayWnd&quot;)
      WinMinimize, A
   Return

*LWin::
   if !GetKeyState(&quot;LCtrl&quot;, &quot;P&quot;)
      Return
      
   ID := ArrayMinimisedID.1
   WinRestore, % &quot;ahk_id &quot; ID
   WinActivate, % &quot;ahk_id &quot; ID
   Return</code></pre></div><p>Только на левые Win и Ctrl.<br />Требует <a href="http://l.autohotkey.net/#Get_It">AHK_L</a> v1.1.05+</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 29 Dec 2011 20:10:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55140#p55140</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55137#p55137</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Если ты свернул окно горячей клавишей, а потом другое окно мышью, то что должно происходить при повторном нажатии горячей клавиши?</p></blockquote></div><p>Хороший вопрос.<br />Очевидно, что на сворачивание текущего окна и на разворачивание последнего свёрнутого окна должны быть выставлены 2 разных хоткея.<br />Хотелось бы Win+Ctrl на сворачивание и Ctrl+Win на разворачивание.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 29 Dec 2011 18:34:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55137#p55137</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55134#p55134</link>
			<description><![CDATA[<p><strong>Grey</strong>, не стоило так торопиться, лучше было бы сначала выслушать коллегу <strong>Drugoy</strong>. По твоему коду, если свернуть окно горячей клавишей, потом развернуть мышью, затем снова нажать горячую клавишу — то ничего не происходит.<br />Потом, функция <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms644989%28v=vs.85%29.aspx">RegisterShellHookWindow()</a>:<br /></p><div class="quotebox"><blockquote><p>[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]</p></blockquote></div><p>Есть альтернативные варианты.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 29 Dec 2011 17:51:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55134#p55134</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55133#p55133</link>
			<description><![CDATA[<div class="codebox"><pre><code>SetBatchLines, -1
DllCall(&quot;RegisterShellHookWindow&quot;, &quot;UInt&quot;, A_ScriptHwnd)
MsgNum:=DllCall(&quot;RegisterWindowMessage&quot;, &quot;Str&quot;,&quot;SHELLHOOK&quot;)
OnMessage(MsgNum, &quot;ShellMessage&quot;)
OnExit, ExitScript
Return

!vkC0:: ; alt+tilde
   If hwndback
   {
      WinRestore, % &quot;ahk_id&quot;hwndback
      WinActivate, % &quot;ahk_id&quot;hwndback
      hwndback:=
   }
   Else
      WinMinimize, A
   KeyWait, vkC0
   Return

ShellMessage(wParam, lParam)
{
   global
   If wParam=5
   {
      hwnd:=NumGet(lParam+0)
      If DllCall(&quot;IsIconic&quot;, &quot;Ptr&quot;, hwnd)
         hwndback:=hwnd
   }
}

ExitScript:
   DllCall(&quot;DeregisterShellHookWindow&quot;, &quot;UInt&quot;, A_ScriptHwnd)
   ExitApp</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Grey)]]></author>
			<pubDate>Thu, 29 Dec 2011 17:35:47 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55133#p55133</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55132#p55132</link>
			<description><![CDATA[<p>Если ты свернул окно горячей клавишей, а потом другое окно мышью, то что должно происходить при повторном нажатии горячей клавиши? Разворачиваться первое окно? Второе? В каком случае окна по горячей клавише должны сворачиваться, если существуют уже несколько свёрнутых ранее мышью? В общем, нужно алгоритм работы поподробнее.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 29 Dec 2011 17:33:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55132#p55132</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55129#p55129</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>чтобы я мог восстановить последнее окно, которое я скрыл, например, мышью.</p></blockquote></div><p>В скрипте идёт речь о скрытии/показе окна, мышью же можно либо минимизировать, либо вовсе закрыть окно, а как раз скрыть нельзя (если это специально не предусмотрено в приложении). Ты какое действие имел в виду?</p></blockquote></div><p>Спасибо, что указали мне на мою невнимательность. Я-то подумал, что под скрытием имеется в виду процесс сворачивания окна.<br />Тогда, просьбу немного подкорректирую - можно ли аналогичный скрипт, который вместо скрытия окна - его сворачивает. Ну и изначальной требование то же: чтобы запоминались и те окна, которые я сворачивал мышью.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 29 Dec 2011 16:44:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55129#p55129</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55122#p55122</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Где найти эту &quot;Разработку ...&quot;? Здесь разве не тот раздел, в который следовало обращаться?</p></blockquote></div><p>Именно этот самый, где и находится эта тема. В оригинале это был один раздел, называвшийся «Разработка скриптов». Потом его «раздраконили» на подразделы по тематике. Так что — тут всё правильно. Я, скорее, имел в виду, что просто report&#039;ить смысла нет, надо именно создавать новую (или поднимать существующую) тему в «Разработке …».</p><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>…просто это не логично вообще.</p></blockquote></div><p>Про более логичные варианты — милости прошу в эту: <a href="http://forum.script-coding.com/viewtopic.php?id=4270">OFF: организационные вопросы</a> тему. Всё обсуждаемо.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 29 Dec 2011 13:27:47 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55122#p55122</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: скрытие и отображение активного окна по горячим клавишам]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55117#p55117</link>
			<description><![CDATA[<div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>Где найти эту &quot;Разработку ...&quot;? Здесь разве не тот раздел, в который следовало обращаться?</p></blockquote></div><p><strong>Drugoy</strong>, всё правильно, ты обратился, куда нужно было.</p><p>По теме.<br /></p><div class="quotebox"><cite>Drugoy пишет:</cite><blockquote><p>чтобы я мог восстановить последнее окно, которое я скрыл, например, мышью.</p></blockquote></div><p>В скрипте идёт речь о скрытии/показе окна, мышью же можно либо минимизировать, либо вовсе закрыть окно, а как раз скрыть нельзя (если это специально не предусмотрено в приложении). Ты какое действие имел в виду?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 29 Dec 2011 12:55:10 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55117#p55117</guid>
		</item>
	</channel>
</rss>
