1

Тема: AHK: Неминимизируемое окно Gui

Хочу создать окно, которое игнорировало бы команду Windows "Свернуть все окна". Только возможно ли?

Gui +LastFound -Caption
Gui, Add, Text,, %computername%
Gui, Show, x20 y20

OnMessage(0x112, "WM_SYSCOMMAND")
Return

WM_SYSCOMMAND(wParam) {
  If (A_Gui && wParam = 0xF020) { ; SC_MINIMIZE
    SoundBeep
    Return 0
  }
}

На Win+M не реагирует и при клике на трее не сворачивается (как и задумано), но при клике на стандартном ярлыке "Свернуть все окна" сворачивается вместе со всеми остальными
Причем, SoundBeep слышно в любом случае - т.е. команда SC_MINIMIZE перехватывается, но почему то все равно выполняется.
Вариант с Gui +AlwaysOnTop +ToolWindow прошу не предлагать, т.к. хотя он и работает, но не хочется чтобы данное окно всегда перекрывало остальные.

2

Re: AHK: Неминимизируемое окно Gui

У меня ваш скрипт только при клике на кнопке в Панели задач пикает (окно остаётся). Win+M, Win+D и кнопка свернуть все окна сворачивают его молча. Это в 10-ке.

3

Re: AHK: Неминимизируемое окно Gui

Можно только с помощью костыля:

EVENT_SYSTEM_MINIMIZESTART := 0x16

Gui +LastFound -Caption +hwndhGui
Gui, Add, Text,, % A_ComputerName
Gui, Show, x20 y20

SetWinEventHook(EVENT_SYSTEM_MINIMIZESTART, EVENT_SYSTEM_MINIMIZESTART, 0, RegisterCallback("HookProc", "F", 3, hGui), 0, 0, 0)
Return

HookProc(hWinEventHook, event, hwnd)  {
   if (hwnd = A_EventInfo)  {
      timer := Func("WatchMinimizing").Bind(hwnd)
      SetTimer, % timer, 10
   }
}

WatchMinimizing(hwnd)  {
   static i := 0
   WinGet, MinMax, MinMax, ahk_id %hwnd%
   if (MinMax = -1)
      WinRestore, ahk_id %hwnd%
   
   if (++i = 50)  {
      SetTimer,, Delete
      i := 0
   }
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
   return DllCall("SetWinEventHook", UInt, eventMin , UInt, eventMax , Ptr, hmodWinEventProc
            , Ptr, lpfnWinEventProc , UInt, idProcess , UInt, idThread, UInt, dwFlags, Ptr)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Неминимизируемое окно Gui

teadrinker, спасибо!
На 10ке Ваш скрипт работает аналогично моему, а вот на 7ке (что для меня - принципиально) - все отлично!
Насколько я понимаю, Ваш скрипт подсовывает вместо стандартного обработчика системного события сворачивания окон свой, исключающий из списка сворачиваемых мое окно? Проскакивала и у меня такая мысль, но знаний AHK для реализации не хватило. Спасибо!

5 (изменено: Malcev, 2017-03-04 22:10:50)

Re: AHK: Неминимизируемое окно Gui

teadrinker, у меня твой скрипт ненадёжно работает.
То есть иногда окно минимизируется при нажатии Show Desktop.
А вот такой вариант работает стабильно:

WinGet, IdDesktop, ID, ahk_class Progman

Gui Child: -dpiscale -Caption 0x400000 	
Gui Child: Add, Text,, I am a Child

Gui Child: +LastFound
IdChild := WinExist()

DllCall("SetParent", ptr, IdChild, ptr, IdDesktop)  

Gui Child: Show

6

Re: AHK: Неминимизируемое окно Gui

Так это окно не видно поверх других.

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

7

Re: AHK: Неминимизируемое окно Gui

mozers пишет:

Насколько я понимаю, Ваш скрипт подсовывает вместо стандартного обработчика системного события сворачивания окон свой, исключающий из списка сворачиваемых мое окно?

Не-а, он просто проверяет при начале минимизации окна в течение полсекунды его состояние, если минимизировано — разворачивает. Я ж говорю — костыль.

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

8

Re: AHK: Неминимизируемое окно Gui

Malcev, спасибо!
Работает (на Win7) - черт с ней, с 10кой - люблю простые решения.
А то, что окно срыто под другими (в центре экрана сразу и не нашел) - для меня не важно - в релизе оно будет справа/вверху прозрачным с крупным текстом (имя компа/логин и имя пользователя) - замена BGInfo от Sysinternals.

teadrinker,а реализация подмены стандартного EVENT_SYSTEM_MINIMIZESTART пользовательским скриптом (который свернет все окна кроме этого) потребует еще больше кода? Или сама идея - гнилая?

9

Re: AHK: Неминимизируемое окно Gui

mozers, дело в том, что при нажатии «свернуть все окна» минимизация происходит не одномоментно, а то ли в течение какого-то времени, то ли в несколько попыток, я не совсем понял. Поэтому отслеживать его, как единичное событие не получается.

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

10

Re: AHK: Неминимизируемое окно Gui

Malcev
Многочисленные попытки приспособить Ваш вариант к успеху не привели. Либо - прозрачное, но сворачиваемое окно, либо - несворачиваемое, но непрозрачное

bgcolor = 000000
Gui Child: Color, %bgcolor%
Gui Child: Font, s16 cFFFFFF bold

; cn := ComObjCreate("ADSystemInfo").UserName
; Loop, parse, cn,`,,CN=
; {
; 	Gui Child: Add, Text,, %A_LoopField%
; 	break
; }
linespace = y+8
Gui Child: Add, Text,%linespace%, Имя АРМ: %A_ComputerName%
Gui Child: Add, Text,%linespace%, Пользователь: %A_UserName%
Gui Child: +LastFound
; WinSet, TransColor, %bgcolor% 255
Gui Child: -DPIScale -Caption +ToolWindow
xpos := A_ScreenWidth - 550
Gui Child: Show, x%xpos% y20

WinGet, IdDesktop, ID, ahk_class Progman
IdChild := WinExist()
DllCall("SetParent", ptr, IdChild, ptr, IdDesktop)

11 (изменено: mozers, 2017-03-05 20:40:38)

Re: AHK: Неминимизируемое окно Gui

teadrinker
Попробовал приспособить упрощенный вариант Вашего алгоритма


Gui +LastFound -Caption +hwndhGui

bgcolor = 000000
Gui, Color, %bgcolor%
Gui, Font, s16 cFFFFFF bold
linespace = y+8
Gui, Add, Text,%linespace%, Имя АРМ: %A_ComputerName%
Gui, Add, Text,%linespace%, Пользователь: %A_UserName%

WinSet, TransColor, %bgcolor% 255

xpos := A_ScreenWidth - 550
Gui, Show, NoActivate AutoSize x%xpos% y20

timer := Func("CheckMin").Bind(hGui)
SetTimer, % timer, 3000

Return

CheckMin(hwnd)  {
	WinGet, mm, MinMax, ahk_id %hwnd%
	If (mm = -1) {
		SoundBeep
		WinRestore ahk_id %hwnd%
	}
}

Великолепно работает даже на 10ке. Но, стоит добавить в первую строчку +ToolWindow (ну чтобы прозрачный фон получить и от кнопки в панели задач избавиться) так сразу перестает не только детектировать MinMax, но и команда WinRestore ahk_id %hwnd% (даже выполненная с закомментированным условием) свернутое окно не восстанавливает. Только SoundBeep попискивает. Какое то странное это Gui окно...

12

Re: AHK: Неминимизируемое окно Gui

Дочерние окна не могут быть прозрачными.
Хотя, при отключенном desktop composition - работает.
При +ToolWindow и нажатии Show Desktop, как я понимаю окно не минимизируется, а просто перекрывается десктопом.
Поэтому можно сделать так:

SetWinDelay -1
Gui +LastFound -Caption +toolwindow +hwndhGui

bgcolor = 000000
Gui, Color, %bgcolor%
Gui, Font, s16 cFFFFFF bold
linespace = y+8
Gui, Add, Text,%linespace%, Имя АРМ: %A_ComputerName%
Gui, Add, Text,%linespace%, Пользователь: %A_UserName%

WinSet, TransColor, %bgcolor% 255

xpos := A_ScreenWidth - 550
Gui, Show, NoActivate AutoSize x%xpos% y20
loop
{
   WinWaitActive, ahk_class WorkerW
   loop 2
      WinSet, AlwaysOnTop, Toggle, ahk_id %hGui%
   WinWaitNotActive, ahk_class WorkerW
}

13

Re: AHK: Неминимизируемое окно Gui

Malcev, спасибо, простой и надежный вариант!
Добавил только #NoTrayIcon и строчку для получения полных ФИО (чтоб сразу было видно к кому ты по удаленке подключился)

Gui Add, Text,, % ComObjGet("LDAP://" . ComObjCreate("ADSystemInfo").UserName).cn

Все! Выбрасываю Русиновичевский BGInfo

14

Re: AHK: Неминимизируемое окно Gui

Потестировал - не совсем он надёжный оказался.
Так понадёжней:

SetWinDelay -1
hDesktop := WinExist("ahk_class WorkerW")
Gui +LastFound -Caption +toolwindow +hwndhGui

bgcolor = 000000
Gui, Color, %bgcolor%
Gui, Font, s16 cFFFFFF bold
linespace = y+8
Gui, Add, Text,%linespace%, Имя АРМ: %A_ComputerName%
Gui, Add, Text,%linespace%, Пользователь: %A_UserName%

WinSet, TransColor, %bgcolor% 255

xpos := A_ScreenWidth - 550
Gui, Show, NoActivate AutoSize x%xpos% y20
loop
{
   WinWaitActive, ahk_class WorkerW
   DllCall("SetWindowPos", "ptr", hDesktop, "ptr", hGui, "int", 0, "int", 0, "int", 0, "int", 0, "uint", 3) ;3 = SWP_NOSIZE|SWP_NOMOVE
   WinWaitNotActive, ahk_class WorkerW
}
return

#if WinActive("ahk_class WorkerW")
~#vk44::   ; d
~#vk4D::   ; m
sleep 50
DllCall("SetWindowPos", "ptr", hDesktop, "ptr", hGui, "int", 0, "int", 0, "int", 0, "int", 0, "uint", 3) ;3 = SWP_NOSIZE|SWP_NOMOVE
return
#if

15

Re: AHK: Неминимизируемое окно Gui

mozers, напомню, смайлик точку не заменяет.

У нас не чат, мы пишем аккуратно. Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.

16

Re: AHK: Неминимизируемое окно Gui

Malcev
И предыдущий вариант - хорош. Даже на 10ке заработал.
За новый - спасибо - буду тестировать/изучать. Как въеду в смысл написанного - так буду использовать.

17

Re: AHK: Неминимизируемое окно Gui

mozers, на Ваше письмо отвечаю:
1) По правилам русского языка в конце предложения должны быть знаки препинания. Заглавные буквы и точки - это минимальное требование по грамотности на форуме, но соблюдать его обязательно для всех. Отсутствие точки не компенсируется наличием смайлика.
2) Каждый пользователь при написании сообщения может поставить галочку "Не показывать графические смайлики". Либо в профиле "Показывать смайлы как изображения " (если Вы это имели в виду).
Пользоваться смайлами никто не запрещал. Речь идёт об отсутствии точек.

18

Re: AHK: Неминимизируемое окно Gui

mozers пишет:

И предыдущий вариант - хорош

У меня он глючил в 2 случаях:
1) Если при максимизированном окне (тестировал на фаерфоксе) быстро нажимать win+d, то в какой-то момент надпись появлялась поверх фаерфокса, поэтому я заменилил AlwaysOnTop на SetWindowPos, чтобы надпись была только поверх десктопа.
2) Если при  активном десктопе и каком нибудь развернутом приложении нажать win+d, то надпись пропадала, поэтому я вставил условие для горячих кнопок при активном десктопе.

19

Re: AHK: Неминимизируемое окно Gui

Тоже был такой вопрос, никак не решил. В смысле такие же костыли. Может из z - order как то удалять окно, не уверен...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20 (изменено: Malcev, 2017-03-07 20:41:45)

Re: AHK: Неминимизируемое окно Gui

Проблема в том, что прозрачность можно установить только 3 способами:
1) SetLayeredWindowAttributes
https://msdn.microsoft.com/en-us/library/ms633540.aspx
Эту функцию использует автохотки в WinSet, TransColor.
Но она работает с дочерними окнами при включенном desktop composition только в Win8.
Возможно в десятке тоже, про нее ничего не сказано.
2) UpdateLayeredWindow
https://msdn.microsoft.com/en-us/library/ms633556.aspx
Тоже самое.
3) Через Direct3D
https://msdn.microsoft.com/en-us/library/ms893092.aspx
Вот там вроде как можно установить прозрачность дочерним окнам.

21

Re: AHK: Неминимизируемое окно Gui

Malcev, виноват, тормознул с ответом, но, к сожалению, Ваш последний вариант (в отличии от предпоследнего) у меня не работает ни на Win7 ни на Win10. Окошко скрывается по "Свернуть все окна".
Повторю, предпоследний вариант у меня стабильно работает и с фаерфоксом и с win+d и на win7 и на win10.

22 (изменено: Malcev, 2017-03-07 23:07:00)

Re: AHK: Неминимизируемое окно Gui

А так?

SetWinDelay -1
DetectHiddenWindows on
WinGet, list, list, ahk_class WorkerW
hDesktop := list%list%
Gui +LastFound -Caption +toolwindow +hwndhGui

bgcolor = 000000
Gui, Color, %bgcolor%
Gui, Font, s16 cFFFFFF bold
linespace = y+8
Gui, Add, Text,%linespace%, Имя АРМ: %A_ComputerName%
Gui, Add, Text,%linespace%, Пользователь: %A_UserName%

WinSet, TransColor, %bgcolor% 255

xpos := A_ScreenWidth - 550
Gui, Show, NoActivate AutoSize x%xpos% y20
loop
{
   WinWaitActive, ahk_class WorkerW
   DllCall("SetWindowPos", "ptr", hDesktop, "ptr", hGui, "int", 0, "int", 0, "int", 0, "int", 0, "uint", 3) ;3 = SWP_NOSIZE|SWP_NOMOVE
   WinWaitNotActive, ahk_class WorkerW
}
return

#if WinActive("ahk_class WorkerW")
~#vk44::   ; d
~#vk4D::   ; m
sleep 50
DllCall("SetWindowPos", "ptr", hDesktop, "ptr", hGui, "int", 0, "int", 0, "int", 0, "int", 0, "uint", 3) ;3 = SWP_NOSIZE|SWP_NOMOVE
return
#if

23

Re: AHK: Неминимизируемое окно Gui

Так сворачивается по «Свернуть все окна».

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

24

Re: AHK: Неминимизируемое окно Gui

Malcev, очень интересный вариант.
Сначала (Win10) - не работало (окно сворачивалось). Перенес на Win7 - заработало со 2 запуска. Потом вновь запускал и на Win10 и на Win7 - работает (не сворачивается). Но почему то иногда (~1 раз из 10) не срабатывает. Пытался поймать закономерность (запускал напрямую из кода, предварительно откомпилировав, во всех случаях кроме Тотала и SciTE дополнительные открытые окна закрывал) - никакой зависимости так и не обнаружил. Вот сейчас - работает. Уже раз 20 перезапустил...

25

Re: AHK: Неминимизируемое окно Gui

SetWinDelay -1
SetBatchLines -1
Gui +LastFound -Caption +toolwindow +hwndhGui -
bgcolor = 000000
Gui, Color, %bgcolor%
Gui, Font, s16 cFFFFFF bold
linespace = y+8
Gui, Add, Text,%linespace%, Имя АРМ: %A_ComputerName%
Gui, Add, Text,%linespace%, Пользователь: %A_UserName%

WinSet, TransColor, %bgcolor% 255
xpos := A_ScreenWidth - 550
Gui, Show, NoActivate AutoSize x%xpos% y20

loop
{
   WinGet, list, list
   if !hDesktop := WinExist("ahk_class WorkerW")
   {
      list--
      if (list%list% != hGui)
         WinSet, Bottom,, ahk_id %hGui%
   }
   else
   {
      loop % list
      {
         if (List%A_Index% = hGui)
            break
         WinGetClass, class, % "ahk_id " List%A_Index%
         if (class = "WorkerW") or (class = "")
         {
            loop 2
               WinSet, AlwaysOnTop,, ahk_id %hGui%
            break
         }
      }
   }
   sleep 50
}

26

Re: AHK: Неминимизируемое окно Gui

Malcev
Этот вариант работает очень стабильно (и Win7 и Win10). Спасибо!