1

Тема: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Здравствуйте, прочитал, что с помощью AutoHotkey можно творить чудеса, в том числе, удалять/скрывать любые элементы программ, правда ли это?

Пришла идея сделать супер минималистичный JPEGView (просмотр изображений), у окна в максимизированом виде есть только TitleBar, хотелось бы его убрать, оставив видимым TaskBar.

Нашел способ с горячей клавишей, но нужно чтобы это происходило автоматически при открытии любого файла изображения, подскажите пожалуйста как?

F11::
WinSet, Style, -0xC40000, A
WinMove, A, , 0, 0, 1920, 1040
;WinActivate, A
Return

И т.к. заголовок будет скрыт, возможно ли, текст оттуда наложить на TaskBar как OSD, т.е. задать определенные координаты?

2

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Это все можно определить в цикл с помощью loop.
Определить заголовок с помощью WinGetActiveTitle.
Сделать надпись с помощью Gui.
И начинать новую итерацию цикла с помощью WinWaitNotActive.

3

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Malcev
Спасибо за подсказки, но кто-нибудь может помочь реализовать это? Я, хотя и нашел код OSD, но как собрать все вышесказанное воедино.

; Пример: отображение выполняемых функций на экране (on-screen display).
; Данный скрипт требует версию 1.0.25.13 или выше.

CustomColor = EEAA99 ; Может быть любого RGB цвета (ниже он будет сделан прозрачным).
Gui, +AlwaysOnTop +LastFound +Owner ; Опция +Owner мешает появлению кнопки на панели задач.
Gui, Color, %CustomColor%
Gui, Font, s24
; XX & YY служит для того, чтобы автоматически задать размер окна.
Gui, Add, Text, vMyText cLime, XXXXX YYYYY
; Делаем все пиксели этого цвета прозрачными, а сам текст - полупрозрачным (150):
WinSet, TransColor, %CustomColor% 150
Gui, -Caption ; Удаляем границы и заголовок окна.
SetTimer, UpdateOSD, 200
Gosub, UpdateOSD ; Не ожидая таймера, делаем сразу первое обновление.
Gui, Show, x0 y400
return

UpdateOSD:
MouseGetPos, MouseX, MouseY
GuiControl,, MyText, X%MouseX%, Y%MouseY%
return

4

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Попробуй вбить в цикл:
1) IfWinActive, твое окно
2)  WinGetActiveTitle ; получаем название активного окна
3) твой код OSD

CustomColor = EEAA99 ; Может быть любого RGB цвета (ниже он будет сделан прозрачным).
Gui, +AlwaysOnTop +LastFound +Owner ; Опция +Owner мешает появлению кнопки на панели задач.
Gui, Color, %CustomColor%
Gui, Font, s24
Gui, Add, Text, vMyText cLime, %title%   ; переменная которую получили с помощью WinGetActiveTitle
; Делаем все пиксели этого цвета прозрачными, а сам текст - полупрозрачным (150):
WinSet, TransColor, %CustomColor% 150
Gui, -Caption ; Удаляем границы и заголовок окна.
Gui, Show, x0 y400 NA

4) WinWaitNotActive   ; Ждем когда окно деактивируется
5) Gui, Destroy

5

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Все не могу найти, как указывать скрипту, чтобы автоматически отрабатывал только в определенной программе, ahk_class тоже не работает. Может быть есть тема, где пользователи выкладывают свои скрипты с описанием? В форуме "Коллекция скриптов и идей", в основном, специализированные примеры.

IfWinActive ahk_class #3277

WinSet, Style, -0xC40000, A
WinMove, A, , 0, 0, 1920, 1040
;WinActivate, A

WinGetActiveTitle, Title

CustomColor = EEAA99 ; Может быть любого RGB цвета (ниже он будет сделан прозрачным).
Gui, +AlwaysOnTop +LastFound +Owner ; Опция +Owner мешает появлению кнопки на панели задач.
Gui, Color, %CustomColor%
Gui, Font, s24
Gui, Add, Text, vMyText cLime, %title%   ; переменная которую получили с помощью WinGetActiveTitle
; Делаем все пиксели этого цвета прозрачными, а сам текст - полупрозрачным (150):
WinSet, TransColor, %CustomColor% 150
Gui, -Caption ; Удаляем границы и заголовок окна.
Gui, Show, x0 y400 NA

WinWaitNotActive

Gui, Destroy

return

6

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Можно указать в начале скрипта часть названия окна.
window := "Notepad"
Потом выставить правильный SeTitleMatchMode
В данном случае:
SeTitleMatchMode, 2
Потом

loop
{
   IfWinActive, % window
   {
      пихаем весь ваш код, кроме return
      WinWaitNotActive, % window
      Gui, Destroy
   }
   sleep, 100
}   

7

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Malcev
Ого, заработало, супер, спасибо большущее! Единственное, есть небольшие проблемы.

1) При старте изображения, оно не всегда растягивается по вертикали, непонятно от чего это зависит, может Redraw можно сделать?

2) При переходе на следующее изображение не перерисовывается заголовок, он меняется только при переключении на другую программу и обратно.

3) При заходе и выходе из Fullscreen тоже самое, на окно не отрабатывает скрипт.

window := "JPEGView"
SetTitleMatchMode, 2

loop
{
   IfWinActive, %window%
   {
WinSet, Style, -0xC40000, A
WinMove, A, , 0, 0, 1920, 1040
;WinActivate, A

WinGetActiveTitle, Title

CustomColor = EEAA99 ; Может быть любого RGB цвета (ниже он будет сделан прозрачным).
Gui, +AlwaysOnTop +LastFound +Owner ; Опция +Owner мешает появлению кнопки на панели задач.
Gui, Color, %CustomColor%
Gui, Font, s14
Gui, Add, Text, vMyText cLime, %title%   ; переменная которую получили с помощью WinGetActiveTitle
; Делаем все пиксели этого цвета прозрачными, а сам текст - полупрозрачным (150):
WinSet, TransColor, %CustomColor% 150
Gui, -Caption ; Удаляем границы и заголовок окна.
Gui, Show, x1000 y1040 NA

      WinWaitNotActive, % window
      Gui, Destroy
   }
   sleep, 100
} 

8

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

А так?

loop
{
   WinGetActiveTitle, title
   if (title ~= "JPEGView")
   {
      WinSet, Style, -0xC40000, A
      WinMove, A, , 0, 0, 1920, 1040
      CustomColor = EEAA99 ; Может быть любого RGB цвета (ниже он будет сделан прозрачным).
      Gui, +AlwaysOnTop +LastFound +Owner ; Опция +Owner мешает появлению кнопки на панели задач.
      Gui, Color, %CustomColor%
      Gui, Font, s14
      Gui, Add, Text, vMyText cLime, %title%   ; переменная которую получили с помощью WinGetActiveTitle
      ; Делаем все пиксели этого цвета прозрачными, а сам текст - полупрозрачным (150):
      WinSet, TransColor, %CustomColor% 150
      Gui, -Caption ; Удаляем границы и заголовок окна.
      Gui, Show, x1000 y1040 NA
      WinWaitNotActive, % title
      Gui, Destroy
   }
   sleep, 100
} 

9

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Malcev
Отлично, теперь скрипт отрабатывает при перелистывании картинок, заголовок обновляется. Правда, теперь из Fullscreen-а выходит, но это, наверное уже не решить?

Можно было бы сделать первый клик F11 переход в Fullscreen, а после второго, с задержкой, клавиша, активирующая скрипт.

10

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Попробуйте.
Из фуллскрина выходит наверное из-за:

      WinSet, Style, -0xC40000, A
      WinMove, A, , 0, 0, 1920, 1040

11

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Malcev
Да, точно, нужно выделить это в отдельный loop, можно их делать несколько? Так не работает и в Fullscreen не заходит.

#IfWinActive ahk_class #32770
F10::
window := "JPEGView"
SetTitleMatchMode, 2

loop
{
   IfWinActive, %window%
   {
WinSet, Style, -0xC40000, A
WinMove, A, , 0, 0, 1920, 1040
   }
} 

loop
{
   WinGetActiveTitle, title
   if (title ~= "JPEGView")
   {
      CustomColor = EEAA99 ; Может быть любого RGB цвета (ниже он будет сделан прозрачным).
      Gui, +AlwaysOnTop +LastFound +Owner ; Опция +Owner мешает появлению кнопки на панели задач.
      Gui, Color, %CustomColor%
      Gui, Font, s14
      Gui, Add, Text, vMyText cLime, %title%   ; переменная которую получили с помощью WinGetActiveTitle
      ; Делаем все пиксели этого цвета прозрачными, а сам текст - полупрозрачным (150):
      WinSet, TransColor, %CustomColor% 150
      Gui, -Caption ; Удаляем границы и заголовок окна.
      Gui, Show, x1000 y1040 NA
      WinWaitNotActive, %title%
      Gui, Destroy
   }
   sleep, 100
}

12

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Не понимаю задачи.

13

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Malcev
Задача такая-же какая и была, просто нужно сделать, чтобы WinSet/WinMove применялись только при обращении к окну, а OSD заголовок при листании изображений. Плюс возможность WinSet/WinMove активировать горячей клавишей, чтобы она срабатывала при выходе из Fullscreen.

14

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Вот код с офф. форума, который определяет находится ли приложение в Fullscreen или нет

isFullScreen := isWindowFullScreen( "A" )
MsgBox % isFullScreen ? "Full Screen" : "Windowed"
Return

isWindowFullScreen( winTitle ) {
    ;checks if the specified window is full screen
    
    winID := WinExist( winTitle )

    If ( !winID )
        Return false

    WinGet style, Style, ahk_id %WinID%
    WinGetPos ,,,winW,winH, %winTitle%
    ; 0x800000 is WS_BORDER.
    ; 0x20000000 is WS_MINIMIZE.
    ; no border and not minimized
    Return ((style & 0x20800000) or winH < A_ScreenHeight or winW < A_ScreenWidth) ? false : true
}

15

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Malcev рекомендую SHELLHOOK. И создание окна, и активацию, и смену заголовка (насколько я понял при смене картинок поможет). Циклы не нужны. Пример думаю сможешь составить, в одной из твоих тем это было.
Ну а вообще мне кажется проще написать свой "супер минималистичный JPEGView", чем костыли городить.

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

16

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Да, тут было:
http://forum.script-coding.com/viewtopi … 399#p72399
Только, чем это лучше цикла в данной ситуации?
Все-равно придется проверять фуллскрин или нет.

17

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Malcev
К сожалению, не понимаю, куда поместить код Fullscreen-а, поможете?

И еще, может можно скрипт настроить на JPEGView.exe, а не заголовок, постоянно  срабатывает на браузер и проводник.

serzh82saratov пишет:

Ну а вообще мне кажется проще написать свой "супер минималистичный JPEGView", чем костыли городить.

Ну костыль весьма небольшой получается ведь, у меня у foobar2000 заголовок и границы тоже скрыты, а текущая композиция выводится посредством OSD, но там UI_Hacks и OSD плагины есть, не думал что подобное возможно сделать с любой программой.

18

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Попробуй так:

loop
{
   WinGetActiveTitle, title
   if (title ~= "- JPEGView")
   {
      CustomColor = EEAA99 ; Может быть любого RGB цвета (ниже он будет сделан прозрачным).
      Gui, +AlwaysOnTop +LastFound +Owner ; Опция +Owner мешает появлению кнопки на панели задач.
      Gui, Color, %CustomColor%
      Gui, Font, s14
      Gui, Add, Text, vMyText cLime, %title%   ; переменная которую получили с помощью WinGetActiveTitle
      ; Делаем все пиксели этого цвета прозрачными, а сам текст - полупрозрачным (150):
      WinSet, TransColor, %CustomColor% 150
      Gui, -Caption ; Удаляем границы и заголовок окна.
      Gui, Show, x1000 y1040 NA
      loop
      {
         if isWindowFullScreen( "A" ) = 0
         {
            WinSet, Style, -0xC40000, A
            WinMove, A, , 0, 0, 1920, 1040
         }
         IfWinNotActive, % title
         {
            Gui, Destroy
            break
         }
      }
   }
   sleep, 100
} 

isWindowFullScreen( winTitle ) {
    ;checks if the specified window is full screen
    
    winID := WinExist( winTitle )

    If ( !winID )
        Return false

    WinGet style, Style, ahk_id %WinID%
    WinGetPos ,,,winW,winH, %winTitle%
    ; 0x800000 is WS_BORDER.
    ; 0x20000000 is WS_MINIMIZE.
    ; no border and not minimized
    Return ((style & 0x20800000) or winH < A_ScreenHeight or winW < A_ScreenWidth) ? false : true
}

19

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Malcev
Спасибо большое, это то, что нужно и даже более, например, при выходе из Fullscreen-а окно не оставалось максимизированым, а принимало размер изображения, но теперь все отлично.

Еще хотелось бы, чтобы OSD был только в оконном режиме, попробовал сам, у меня либо не работает либо все как нужно, но OSD мигает.

Можно ли еще сделать, чтобы при клике на изображение, уже открытое окно, но в фоне, переходило на передний план или разворачивалось, если свернуто?

20

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Здравствуйте , вот ещё код .

#Persistent
#SingleInstance Off
DetectHiddenWindows, Off ;поиск в скрытых окнах
SetTitleMatchMode 2


mywin :=      ; название окна (можно любое приложение или окно)
interval := 100 

SetTimer, FrWin, 1000
return

#NoEnv



FrWin:
IfWinActive, %mywin%
{
WinMove, %mywin%,, 0, 0, 1280, 1024 ; параметры окна: x, y, w, h (выставляйте свое разрешение экрана)
WinSet, Style, -0xC00000, %mywin% ; убрать рамку
Sleep 300 
ExitApp
}
return
OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

21

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Можно ли еще сделать, чтобы при клике на изображение, уже открытое окно, но в фоне, переходило на передний план или разворачивалось, если свернуто?

Это вы уже сами попробуйте поковыряться.

loop
{
   WinGetActiveTitle, title
   if (title ~= "- JPEGView") and (isWindowFullScreen( "A" ) = 0)
   {
      WinSet, Style, -0xC40000, A
      WinMove, A, , 0, 0, 1920, 1040
      CustomColor = EEAA99 ; Может быть любого RGB цвета (ниже он будет сделан прозрачным).
      Gui, +AlwaysOnTop +LastFound +Owner ; Опция +Owner мешает появлению кнопки на панели задач.
      Gui, Color, %CustomColor%
      Gui, Font, s14
      Gui, Add, Text, vMyText cLime, %title%   ; переменная которую получили с помощью WinGetActiveTitle
      ; Делаем все пиксели этого цвета прозрачными, а сам текст - полупрозрачным (150):
      WinSet, TransColor, %CustomColor% 150
      Gui, -Caption ; Удаляем границы и заголовок окна.
      Gui, Show, x1000 y1040 NA
      loop
      {
         If !WinActive(title) or (isWindowFullScreen( "A" ) != 0)
         {
            Gui, Destroy
            break
         }
      }
   }
   sleep, 100
} 

isWindowFullScreen( winTitle ) {
    ;checks if the specified window is full screen
    
    winID := WinExist( winTitle )

    If ( !winID )
        Return false

    WinGet style, Style, ahk_id %WinID%
    WinGetPos ,,,winW,winH, %winTitle%
    ; 0x800000 is WS_BORDER.
    ; 0x20000000 is WS_MINIMIZE.
    ; no border and not minimized
    Return ((style & 0x20800000) or winH < A_ScreenHeight or winW < A_ScreenWidth) ? false : true
}

22

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Ядрён
Спасибо, пригодится.

Malcev
Вообщем респект, пришла идея, но даже не думал, что можно реализовать.

23

Re: AHK: Автоматически скрывать у вызываемого окна заголовок и границы

Подскажите пожалуйста, нет ли ошибки в этом коде, при активном режиме он потребляет от 5% до 10% процессора или это нормально? И что странно, ahk скрипт в этот момент становится активным процессом, хотя остальные все скрипты всегда фоновые. Но заметить это можно лишь когда JPEGView в фокусе, т.е. нужно Диспетчер задач установить "Поверх остальных окон".

#NoTrayIcon
loop
{
   WinGetActiveTitle, title
   if (title ~= "- JPEGView") and (isWindowFullScreen( "A" ) = 0)
   {
      WinSet, Style, -0xC40000, A
      WinMove, A, , 0, 0, 1920, 1040
      WinGetTitle, Title, % MainWindowClass
      Title := RegExReplace(Title, "- JPEGView")   ; текст, который будет изыматься из заголовка
      CustomColor = EEAA99 ; Может быть любого RGB цвета (ниже он будет сделан прозрачным).
      Gui, +AlwaysOnTop +LastFound +Owner ; Опция +Owner мешает появлению кнопки на панели задач.
      Gui, Color, %CustomColor%
      Gui, Font, s14
      Gui, Add, Text, vMyText cLime, %title%   ; переменная которую получили с помощью WinGetActiveTitle
      ; Делаем все пиксели этого цвета прозрачными, а сам текст - полупрозрачным (150):
      WinSet, TransColor, %CustomColor% 150
      Gui, -Caption ; Удаляем границы и заголовок окна.
      Gui, Show, x1000 y1040 NA
      loop
      {
         If !WinActive(title) or (isWindowFullScreen( "A" ) != 0)
         {
            Gui, Destroy
            break
         }
      }
   }
   sleep, 100
} 

isWindowFullScreen( winTitle ) {
    ;checks if the specified window is full screen
    
    winID := WinExist( winTitle )

    If ( !winID )
        Return false

    WinGet style, Style, ahk_id %WinID%
    WinGetPos ,,,winW,winH, %winTitle%
    ; 0x800000 is WS_BORDER.
    ; 0x20000000 is WS_MINIMIZE.
    ; no border and not minimized
    Return ((style & 0x20800000) or winH < A_ScreenHeight or winW < A_ScreenWidth) ? false : true
}