1

Тема: AHK: OSD для любой программы. Убрать из OSD определенный текст

Решил прикрутить OSD к Media Player Classic на основе скрипта от Malcev, но столкнулся с проблемой, OSD виден только при активном окне, переделал немного, но не знаю как сделать обновление, не подскажете? Так-же Destroy при закрытии?

И возможно ли чтобы в OSD не отображался определенный текст, например, " - MPC-BE x64".

loop
{
   WinGetActiveTitle, title
   if (title ~= "- MPC-BE x64") and (isWindowFullScreen( "A" ) = 0)
   {
      CustomColor = EEAA99 ; Может быть любого RGB цвета (ниже он будет сделан прозрачным).
      Gui, +AlwaysOnTop +LastFound +Owner ; Опция +Owner мешает появлению кнопки на панели задач.
      Gui, Color, %CustomColor%
      Gui, Font, s12
      Gui, Add, Text, vMyText cLime, %title%   ; переменная которую получили с помощью WinGetActiveTitle
      ; Делаем все пиксели этого цвета прозрачными, а сам текст - полупрозрачным (150):
      WinSet, TransColor, %CustomColor% 220
      Gui, -Caption ; Удаляем границы и заголовок окна.
      Gui, Show, x960 y1042 NA
      loop
      {
         If (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
}

2

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

А что такое OSD?

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

3 (изменено: Ed, 2014-06-24 18:33:51)

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

teadrinker
Отразить текст из заголовка на любое место экрана, удобно, когда, например, плеер играет в фоне, а на панели задач название файла. В foobar2000 есть плагин, а благодаря AutoHotkey это можно реализовать с любым проигрывателем.

On-screen display

4

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

А можете точнее описать, как он должен работать? Когда должен быть виден, когда не виден, когда закрываться?

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

5

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

teadrinker
Все просто, включаем плеер, OSD появился, закрываем исчез, и оставался независимо от того, окно в фокусе/свернуто/в фоне, но в Fullscreen исчезал. Главное, авто-обновление, чтобы отражать название следующих композиций. Было бы хорошо иметь горячую клавишу, действующую в плеере, для отключения/включения OSD.

6

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Вот так вышло:

TextColor := "Lime"
TextSize := 12
FontName := "Verdana"
FontStyle := "norm"
Quality := 0

MainWindowClass := "ahk_class MediaPlayerClassicW"   ; указать класс окна, к которому OSD будет привязан

IniPath := RegExReplace(A_ScriptName, "(.*\.).*", "$1ini")
IniRead, GuiX, % IniPath, Coords, GuiX, % (A_ScreenWidth - 50)//2
IniRead, GuiY, % IniPath, Coords, GuiY, % A_ScreenHeight//2

Gui, +AlwaysOnTop +ToolWindow -Caption +LastFound
Gui, Margin, 0, 0
Gui, Color, EEAA99
WinSet, TransColor, EEAA99 220
Gui, Font, % "s" . TextSize . " q" . Quality . " " . FontStyle, % FontName
Gui, Add, Text, vText c%TextColor%
Gui, Show, Hide, OSD

SetTimer, Timer
OnMessage(0x201, "WM_LBUTTONDOWN")
Return

#If WinExist(MainWindowClass)
^Space:: HideWin := !HideWin

Timer:
   if (HideWin || !WinExist(MainWindowClass) || isWindowFullScreen("A"))
   {
      Gui, Show, Hide
      Return
   }
   
   WinGetTitle, Title, % MainWindowClass
   Title := RegExReplace(Title, " - MPC-BE x64")   ; текст, который будет изыматься из заголовка
   oSize := GetTextSize(Title, FontName, "s" . TextSize . " q" . Quality . " " . FontStyle)
   GuiControl, Move, Text, % "w" oSize.w " h" oSize.h
   GuiControl,, Text, % Title
   Gui, Show, % "x" GuiX " y" GuiY " w" oSize.w " h" oSize.h " NA"
   Return

GetTextSize(string, font, options)
{
   static Text
   Gui, TestGui:Font, % options, % FontName
   Gui, TestGui:Add, Text, vText, % string
   GuiControlGet, Text, TestGui:Pos
   Gui, TestGui:Destroy
   Return {w: TextW, h: TextH}
}

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
}

WM_LBUTTONDOWN()
{
   global GuiX, GuiY, IniPath
   PostMessage, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
   SetTimer, Timer, Off
   KeyWait, LButton
   WinGetPos, GuiX, GuiY
   SetTimer, Timer
   IniWrite, % GuiX, % IniPath, Coords, GuiX
   IniWrite, % GuiY, % IniPath, Coords, GuiY
}

Нужно указать класс окна программы, к которой OSD будет привязан. Изначально текст появляется в центре экрана, его можно перетащить мышью в любое место, новое положение будет записано в ini-файл. Горячая клавиша для показа/скрытия — Ctrl + Space, работает, когда существует связанное окно.

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

7

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Думаю принцип примерно такой:


CoordMode, ToolTip, Screen
Global Win := "ahk_exe opera.exe"   
    , tWin := WinExist(Win)
    , WinTitle, FS
     
OnExit, Exit
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc")

SetWinEventHook(0x800B, 0x800B, 0, RegisterCallback("WinEventHook", "F"),0,0,0)    ;    EVENT_OBJECT_LOCATIONCHANGE
OSD()
Return

Exit: 
    DllCall("DeregisterShellHookWindow", "UInt", A_ScriptHwnd)
    ExitApp

ShellProc(nCode, wParam)  {  
    If (nCode = 2 && wParam = tWin && !(tWin := 0)) ; HSHELL_WINDOWDESTROYED
        ToolTip 
    Else If (nCode = 1 && !tWin && (tWin := WinExist(Win))) ; HSHELL_WINDOWCREATED
        OSD()
    Else If (nCode = 6 && wParam = tWin) ; HSHELL_REDRAW
        OSD()  
}

WinEventHook(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)   {    
    if (tWin && hwnd = tWin)
        if (FS := isWindowFullScreen())
            ToolTip
        Else
            ToolTip % WinTitle, 1, 1
}

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")
}

OSD()  { 
    WinGetTitle, WinTitle, ahk_id %tWin%
    WinTitle := Rtrim(WinTitle, " - Opera")
    if !FS
        ToolTip % WinTitle, 1, 1
}

isWindowFullScreen() { 
    WinGet style, Style, ahk_id %tWin%
    WinGetPos, , , winW, winH, ahk_id %tWin%
    ; 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
}

Собственно:
- сообщения смены заголовка нужного окна.
- сообщения изменения положения и размеров окна (в некоторых случаях потребуется другой подход), для проверки полноэкранности, и показа \ скрытия OSD.
- сообщения о создании и удалении окна, для показа \ скрытия OSD.

Допиливать далее, стало не интересно, дерзайте.

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

8

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

teadrinker опередил.

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

9

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

serzh82saratov пишет:
Else If (nCode = 6 && wParam = tWin) ; HSHELL_REDRAW

Не знал, что при смене заголовка такое посылается.

- сообщения изменения положения и размеров окна

А что это за сообщения?

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

10

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Не знал, что при смене заголовка такое посылается.

Ещё при переходе некоторых окон в полноэкранный режим, ShellProc принимает nCode как 32772.

А что это за сообщения?

EVENT_OBJECT_LOCATIONCHANGE.

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

11

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Попробовал ради интереса через ShellHook — всё вроде работает, даже проверку на полноэкранное приложение осуществить можно (там новое окно создаётся и срабатывает HSHELL_WINDOWCREATED), одна проблема — если поместить над панелью задач и кликнуть по ней, то окно скроется за панелью, она ведь тоже AlwaysOnTop.

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

12

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

teadrinker, serzh82saratov
Спасибо большое, отлично, теперь к любому плееру можно прикрутить OSD.

13

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

teadrinker пишет:

Вот так вышло:

TextColor := "Lime"
TextSize := 12
FontName := "Verdana"
FontStyle := "norm"
Quality := 0

MainWindowClass := "ahk_class MediaPlayerClassicW"   ; указать класс окна, к которому OSD будет привязан

IniPath := RegExReplace(A_ScriptName, "(.*\.).*", "$1ini")
IniRead, GuiX, % IniPath, Coords, GuiX, % (A_ScreenWidth - 50)//2
IniRead, GuiY, % IniPath, Coords, GuiY, % A_ScreenHeight//2

Gui, +AlwaysOnTop +ToolWindow -Caption +LastFound
Gui, Margin, 0, 0
Gui, Color, EEAA99
WinSet, TransColor, EEAA99 220
Gui, Font, % "s" . TextSize . " q" . Quality . " " . FontStyle, % FontName
Gui, Add, Text, vText c%TextColor%
Gui, Show, Hide, OSD

SetTimer, Timer
OnMessage(0x201, "WM_LBUTTONDOWN")
Return

#If WinExist(MainWindowClass)
^Space:: HideWin := !HideWin

Timer:
   if (HideWin || !WinExist(MainWindowClass) || isWindowFullScreen("A"))
   {
      Gui, Show, Hide
      Return
   }
   
   WinGetTitle, Title, % MainWindowClass
   Title := RegExReplace(Title, " - MPC-BE x64")   ; текст, который будет изыматься из заголовка
   oSize := GetTextSize(Title, FontName, "s" . TextSize . " q" . Quality . " " . FontStyle)
   GuiControl, Move, Text, % "w" oSize.w " h" oSize.h
   GuiControl,, Text, % Title
   Gui, Show, % "x" GuiX " y" GuiY " w" oSize.w " h" oSize.h " NA"
   Return

GetTextSize(string, font, options)
{
   static Text
   Gui, TestGui:Font, % options, % FontName
   Gui, TestGui:Add, Text, vText, % string
   GuiControlGet, Text, TestGui:Pos
   Gui, TestGui:Destroy
   Return {w: TextW, h: TextH}
}

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
}

WM_LBUTTONDOWN()
{
   global GuiX, GuiY, IniPath
   PostMessage, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
   SetTimer, Timer, Off
   KeyWait, LButton
   WinGetPos, GuiX, GuiY
   SetTimer, Timer
   IniWrite, % GuiX, % IniPath, Coords, GuiX
   IniWrite, % GuiY, % IniPath, Coords, GuiY
}

Нужно указать класс окна программы, к которой OSD будет привязан. Изначально текст появляется в центре экрана, его можно перетащить мышью в любое место, новое положение будет записано в ini-файл. Горячая клавиша для показа/скрытия — Ctrl + Space, работает, когда существует связанное окно.

Помогите пожалуйста дополнить код:
1) Удалить все относящееся к INI файлу и сделать, чтобы координаты добавлялись прямо в скрипт.
2) Никак не могу разобраться с RegEx, если ставить " - MPC-BE X64", то иногда пропадает последнее слово из заголовка, из Word Word - Word Word.mp4 пропадает Word.mp4 или остается тире " - " в конце. И чтобы не исправлять под каждую версию, как сделать чтобы исключалось все, что идет после " - MPC-BE X64". Общий заголовок выглядит так: "Название файла.mkv - MPC-BE X64 - 1.4.3 svn 5780 -beta".
3) Если скрыть OSD нажав Ctrl + Space, то при следующем старте плеера OSD скрыт, можно ли это исправить?
4) Можно ли добавить код, чтобы при старте плеера общая системная громкость устанавливалась на 25%, а после закрытия на 10%?

14

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Esc пишет:

Удалить все относящееся к INI файлу и сделать, чтобы координаты добавлялись прямо в скрипт.

А чем ini-файл мешает?

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

15

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

teadrinker
Если добавлять его в Автозагрузку, то при старте запускается блокнот, ну и в целом, во всех программах OSD на своих определенных местах, поэтому INI излишен. И спасибо за скрипт.

16

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Тогда я не совсем понял

сделать, чтобы координаты добавлялись прямо в скрипт.

Сами добавлялись? или если нужно их записать только один раз, то в чём проблема?

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

17

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Только один раз, я пробовал убрать все относящееся к INI и у меня в OSD отражается только первая буква названия.

TextColor := "Lime"
TextSize := 12
FontName := "Verdana"
FontStyle := "norm"
Quality := 0

MainWindowClass := "ahk_class MPC-BE"   ; указать класс окна, к которому OSD будет привязан

Gui, +AlwaysOnTop +ToolWindow -Caption +LastFound
Gui, Margin, 0, 0
Gui, Color, EEAA99
WinSet, TransColor, EEAA99 220
Gui, Font, % "s" . TextSize . " q" . Quality . " " . FontStyle, % FontName
Gui, Add, Text, vText c%TextColor%
Gui, Show, Hide, OSD

SetTimer, Timer
OnMessage(0x201, "WM_LBUTTONDOWN")
Return

#If WinExist(MainWindowClass)
^Space:: HideWin := !HideWin

Timer:
   if (HideWin || !WinExist(MainWindowClass) || isWindowFullScreen("A"))
   {
      Gui, Show, Hide
      Return
   }
   
   WinGetTitle, Title, % MainWindowClass
   Title := RegExReplace(Title, "MPC-BE x64 - v1.4.3 svn 5780")   ; текст, который будет изыматься из заголовка
   oSize := GetTextSize(Title, FontName, "s" . TextSize . " q" . Quality . " " . FontStyle)
   GuiControl, Move, Text, % "w" oSize.w " h" oSize.h
   GuiControl,, Text, % Title
   Gui, Show, x1080 y1053 NA
   Return

GetTextSize(string, font, options)
{
   static Text
   Gui, TestGui:Font, % options, % FontName
   Gui, TestGui:Add, Text, vText, % string
   GuiControlGet, Text, TestGui:Pos
   Gui, TestGui:Destroy
   Return {w: TextW, h: TextH}
}

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
}

18

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Ясно, завтра напишу, пока некогда.

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

19

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

teadrinker
Хорошо, спасибо.

Может быть кто-нибудь поможет с остальными вопросами, честно пару часов пытался разобраться с RegEx, перебирая варианты, но не получилось, ощущение, что проблемы в точках (поэтому пропадает последнее слово из названия Word.mp4) и тире, т.к. не знаю как обозначить, например, убирать все после третьего с конца тире.

2) Никак не могу разобраться с RegEx, если ставить " - MPC-BE X64", то иногда пропадает последнее слово из заголовка, из Word Word - Word Word.mp4 пропадает Word.mp4 или остается тире " - " в конце. И чтобы не исправлять под каждую версию, как сделать чтобы исключалось все, что идет после " - MPC-BE X64". Общий заголовок выглядит так: "Название файла.mkv - MPC-BE X64 - 1.4.3 svn 5780 -beta".
3) Если скрыть OSD нажав Ctrl + Space, то при следующем старте плеера OSD скрыт, можно ли это исправить?
4) Можно ли добавить код, чтобы при старте плеера общая системная громкость устанавливалась на 25%, а после закрытия на 10%?

20

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

А зачем считать тире, если ориентиром служит MPC-BE X64?


Src = Название файла.mkv - MPC-BE X64 - 1.4.3 svn 5780 -beta

RegExMatch( Src, ".*MPC-BE X64", Title )

MsgBox, % Title

21

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

YMP
Но ведь требуется убрать все относящееся к названию плеера. Зачастую даже "mkv.*" удаляет последнее слово из названия, но и файлы не только mkv. По идее же такой вариант должен работать "MPC-BE X64*" почти как нужно, оставляя "Название файла.mkv - ".

Так в заголовке:
Название файла.mkv - MPC-BE X64 - 1.4.3 svn 5780 -beta
А так в OSD:
Название файла.mkv

22

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Т.е. должно остаться только имя файла? Тогда так:


Src = Название файла.mkv - MPC-BE X64 - 1.4.3 svn 5780 -beta

RegExMatch( Src, ".+(?= - MPC-BE X64.*)", Title )

MsgBox, % Title

23

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Title = Название файла.mkv - MPC-BE X64 - 1.4.3 svn 5780 -beta

Title := RegExReplace(Title, " - MPC-BE X64.*")
 
MsgBox, % Title
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

YMP
Много читал про все эти ".+(?=", но так ничего итне добился, работает, но нужно то пррспособить под код, т.е. с RegExReplace.

serzh82saratov
Пробовал, такой вариант убирает последнее слово из названия, поэтому только промучался. Причем иногда убирает только пол буквы, оставляя I от B.

Так в заголовке:
MARIE MADELEINE - SWIMMING POOL.mp4 - MPC-BE X64 - 1.4.3 svn 5780 -beta
А так в OSD:
MARIE MADELEINE - SWIMMING

25

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Title = MARIE MADELEINE - SWIMMING POOL.mp4 - MPC-BE X64 - 1.4.3 svn 5780 -beta

Title := RegExReplace(Title, " - MPC-BE X64.*")
 
MsgBox, % Title

Пробовал, такой вариант убирает последнее слово из названия, поэтому только промучался. Причем иногда убирает только пол буквы, оставляя I от B.

Чудеса, да и только! Особенно про пол буквы. Может ваше окно не обновляет ширину для вмещения нового текста.

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

26 (изменено: Esc, 2015-01-08 22:50:51)

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

serzh82saratov
Сам удивляюсь, помоему дело не в этом, т.к. следующее название шире работает, но например из 2577533886.webm получается 2577533886.weI, а "MPC-BE x64.*" делает 2577533886.webr. Можете сами попробовать, есть портативная сборка.

http://forum.ru-board.com/topic.cgi?for … start=5340

27 (изменено: serzh82saratov, 2015-01-09 14:08:36)

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Можете сами попробовать, есть портативная сборка

На вашем коде не пробовал, допиленный из 7 поста вроде работает в соответствии с пожеланиями:


#SingleInstance Force

WinTitle := "ahk_class MPC-BE ahk_exe mpc-be64.exe"  ; класс и процесс окна
wx := 5  ; x - координата показа osd
wy := 857  ; y - координата показа osd
TextColor := "FFFF00"
TextSize := 14
FontName := "Verdana"
FontStyle := "norm"
Quality := 0
Global tWin, hOSD
Gui, +AlwaysOnTop +ToolWindow -Caption -DPIScale +LastFound +E0x00000020 +HWNDhOSD
Gui, Color, EEAA99
WinSet, TransColor, EEAA99 220
Gui, Font, % "s" . TextSize . " q" . Quality . " " . FontStyle, % FontName
OnExit, Exit
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc")
SetWinEventHook(0x800B, 0x800B, 0, RegisterCallback("WinEventHook", "F"),0,0,0)    ;    EVENT_OBJECT_LOCATIONCHANGE
Loop  {
    WinWait, % WinTitle
    tWin := WinExist(WinTitle)
    GoSub isWindowFullScreen
    SoundSet 25
    WinWaitClose, % WinTitle 
    tWin := HideOSD := 0, GuiHide()
    SoundSet 10
}

#If tWin
^Space:: ((HideOSD := !HideOSD) ? GuiHide() : OSD())

OSD()  {
    Global
    if FS || HideOSD
        Return
    WinGetTitle, Title, ahk_id %tWin%
    Title := RegExReplace(Title, "( - )?MPC-BE x64.*")
    DllCall("DestroyWindow", "Ptr", hText)
    Gui, Add, Text, % "Center hwndhText c" TextColor " x" 0 " y" 0, % Title
    Gui, Show, NA AutoSize x%wx% y%wy%
    SetTimer OnTopTaskBar, 70
}

GuiHide()  {
    Gui, Show, Hide
    SetTimer OnTopTaskBar, Off
}

isWindowFullScreen:
    WinGet style, Style, ahk_id %tWin%
    WinGetPos, , , winW, winH, ahk_id %tWin%
    ; 0x800000 is WS_BORDER. 0x20000000 is WS_MINIMIZE. no border and not minimized
    FS := (!(style & 0x20800000) && winH = A_ScreenHeight && winW = A_ScreenWidth)
    (FS ? GuiHide() : OSD())
    Return

OnTopTaskBar: 
    Gui, +AlwaysOnTop
    Return

Exit:
    DllCall("DeregisterShellHookWindow", "UInt", A_ScriptHwnd)
    ExitApp

ShellProc(nCode, wParam)  {
    Critical
    If (nCode = 6 && wParam = tWin) ; HSHELL_REDRAW
        OSD()
}

WinEventHook(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)   {
    if (tWin && hwnd = tWin)
        SetTimer isWindowFullScreen, -100
}

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")
}

Закомментировал там вариант с RegExMatch, на случай если в плеере нет проигрываемого файла, то чтобы и осд отсутствовало.

Сделал окно осд насквозь кликабельным, думаю так удобнее.

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

28

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

serzh82saratov
Нет слов, на первый взгляд все идеально, а как так RegExReplace ведь тот же. И авто-громкость это просто годнота.

29

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

а как так RegExReplace ведь тот же

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

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

30

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

serzh82saratov
Ясно, а то я так промучался несколько часов, пытаясь разобраться, а оказывается это было невозможно. С Вашими навыками из винды можно сделать просто идеал эргономики.

31 (изменено: serzh82saratov, 2015-01-09 13:49:34)

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Поправил код.
Окно всегда поверх панели задач.
Нет файла в заголовке, нет осд.

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

32

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

serzh82saratov
Спасибо, но, к сожалению, при просмотре видео в полный экран, на миллисекунду появляется панель задач, за час произошло два раза. Но это я так, чтобы Вы знали, что вариант TopMost-а не идеальный. Я, наверное, это решу с помощью 7+ Taskbar Tweaker, когда-то я жутко мучался с OSD от foobar2000, боясь сделать клик по панели задач.

33

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

при просмотре видео в полный экран, на миллисекунду появляется панель задач, за час произошло два раза. Но это я так, чтобы Вы знали, что вариант TopMost-а не идеальный

Не вижу связи, появляется ведь панель задач, а TopMost делается только OSD.

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

34

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

serzh82saratov
Я еще потестирую на чистой системе и сообщу, но посмотрев с предыдущим скриптом без TopMost, такого не происходило.

35

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

Просто когда плеер в полный экран, OSD скрыто, и скрипт не производит никаких действий.

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

36

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

serzh82saratov
Сейчас на чистой системе посмотрел, все в порядке, видимо что-то подглючило у меня. Просто было впечатление, что скрипт обновляет OSD через определенный промежуток времени и тянет за собой таскбар, поэтому первая мысль была такая.

37

Re: AHK: OSD для любой программы. Убрать из OSD определенный текст

serzh82saratov
Здравствуйте, нашёл эту тему, т.к. в Вашем коде из 27 сообщения есть нужная мне функциональность изменения громкости, при запуске программ, могли бы Вы помочь в этой теме?