1

Тема: AHK: Скрытие заголовка приложения VLC Player

Помогите, пожалуйста, скрыть заголовок окна видеоплеера VLC в режиме отображения Minimal Interface (Ctrl+H).

+ Screenshot

http://puu.sh/v038b/0ff0335110.jpg

Заголовок служит для перемещения окна по экрану, поэтому, наверное, будет необходимо добавить возможность производить это действие без заголовка.

2

Re: AHK: Скрытие заголовка приложения VLC Player

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

3

Re: AHK: Скрытие заголовка приложения VLC Player

KusochekDobra. рассматривается не полноэкранный режим.

4 (изменено: KusochekDobra, 2017-03-27 19:38:08)

Re: AHK: Скрытие заголовка приложения VLC Player


i:=0
f2::
	if (i) {
		WinSet, Style, +0xC00000, A
	} else {
		WinSet, Style, -0xC00000, A
	}
	i:=!i
return

!LButton::
	if (GetKeyState("LButton","P")) {
		WinGetPos,x,y,,, A
		MouseGetPos, xx, yy,win_h
		while (GetKeyState("LButton","P")) {
			MouseGetPos, ww, hh
			if (ww >= xx && hh >= yy) { ; вниз вправо
				xResult:=x+(ww - xx),yResult:=y+(hh - yy)
			} else if (ww < xx && hh >= yy) { ; вниз влево
				xResult:=x-(xx - ww),yResult:=y+(hh - yy)
			} else if (hh < yy && ww >= xx) { ; вверх вправо
				xResult:=x+(ww - xx),yResult:=y-(yy - hh)
			} else if (ww < xx && hh < yy) { ; вверх влево
				xResult:=x-(xx - ww),yResult:=y-(yy - hh)
			}
			;Sleep, 10
			WinMove,ahk_id%win_h%,,xResult,yResult
		}
	}
return

Удерживая Alt, нажмите и держите ЛКМ. Активное окно будет перемещаться вслед за курсором. Пример с изменением стиля окна нашёл в справке для "WinSet".

5

Re: AHK: Скрытие заголовка приложения VLC Player

У меня ваш код дергает окно.
А этот нет:

SetWinDelay,2
CoordMode,Mouse
return

!LButton::
MouseGetPos,KDE_X1,KDE_Y1,KDE_id
WinGetPos,KDE_WinX1,KDE_WinY1,,,ahk_id %KDE_id%
Loop
{
    GetKeyState,KDE_Button,LButton,P ; Break if button has been released.
    If KDE_Button = U
        break
    MouseGetPos,KDE_X2,KDE_Y2 ; Get the current mouse position.
    KDE_X2 -= KDE_X1 ; Obtain an offset from the initial mouse position.
    KDE_Y2 -= KDE_Y1
    KDE_WinX2 := (KDE_WinX1 + KDE_X2) ; Apply this offset to the window position.
    KDE_WinY2 := (KDE_WinY1 + KDE_Y2)
    WinMove,ahk_id %KDE_id%,,%KDE_WinX2%,%KDE_WinY2% ; Move the window to the new position.
}
return

6

Re: AHK: Скрытие заголовка приложения VLC Player

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

7

Re: AHK: Скрытие заголовка приложения VLC Player

У Вас в примере указано:


SetWinDelay,2

С этой строкой и мой пример ведёт себя благопристойно, ничем не отличаясь от Вашего.

8

Re: AHK: Скрытие заголовка приложения VLC Player

Чтобы не дергалось нужно еще добавить в ваш код:

CoordMode,Mouse

9

Re: AHK: Скрытие заголовка приложения VLC Player

Да, у меня есть остальные строки вроде этой, или "#SingleInstance, Force", "#NoEnv" и прочих. Добавляю их по умолчанию в закомментированную часть начала каждого сценария и для разного применения снимаю комментарии с нужных. Но с этой ещё не встречался, поэтому за наводку спасибо. Вижу теперь, что не совсем корректно, не указывать используемые настройки в некоторых обсуждениях, из-за чего результат может толковаться иначе.

Век живи - век учись.

10 (изменено: svoboden, 2017-03-28 16:39:13)

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, в первый раз вижу такую запись: "CoordMode,Mouse", может, так надо: "CoordMode, Mouse, Screen" или "CoordMode, Mouse, Relative".

11

Re: AHK: Скрытие заголовка приложения VLC Player

svoboden, из справки, по последнему параметру:


If Param2 is omitted, it defaults to Screen.

12

Re: AHK: Скрытие заголовка приложения VLC Player

А, ну да, извиняюсь.

13

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, KusochekDobra, спасибо! Работает!
Жаль, что заголовок не скрывается полностью. Так понимаю, сделать это невозможно из-за особенностей приложения. Или потому, что у меня репак VLC (Ace Player)?

+ открыть спойлер

http://puu.sh/v0MC9/2d745e44e2.jpg

14

Re: AHK: Скрытие заголовка приложения VLC Player

Можно узнавать координаты нужного контрола и обрезать ненужное:

f2::
SetTitleMatchMode 2
WinGet, ActiveControlList, ControlList, VLC media player
Loop, Parse, ActiveControlList, `n
{
   if InStr(A_LoopField, "VLC MSW video")
   {
      ControlGetPos, CtrlX, CtrlY, CtrlW, CtrlH, %A_LoopField%, VLC media player
      WinSet, Region, % CtrlX "-" CtrlY " W" CtrlW " H" CtrlH, VLC media player
      break
   }
}
return

15

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, спасибо! А куда необходимо вводить значения "ненужного"?

16

Re: AHK: Скрытие заголовка приложения VLC Player

А разве я писал, что надо вводить ненужное.
WinSet, Region - тоже самое, что crop в фотошопе.

17

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, не понимаю, что я делаю неправильно, но не замечаю каких-либо изменений. Вероятно, неправильно задал координаты?

f2::
SetTitleMatchMode 2
WinGet, ActiveControlList, ControlList, ahk_exe ace_player.exe
Loop, Parse, ActiveControlList, `n
{
   if InStr(A_LoopField, "VLC MSW video")
   {
      ControlGetPos, CtrlX, CtrlY, CtrlW, CtrlH, %A_LoopField%, ahk_exe ace_player.exe
      WinSet, Region, % 100 "-" 200 " W" 10 " H" 10, ahk_exe ace_player.exe
      break
   }
}
return

18 (изменено: Malcev, 2017-03-28 18:03:36)

Re: AHK: Скрытие заголовка приложения VLC Player

А зачем вы задаете координаты?
Вы алгоритм кода поняли?
Вот эта строка лишена какого-либо смысла:

WinSet, Region, % 100 "-" 200 " W" 10 " H" 10, ahk_exe ace_player.exe

Зачем вы число 100 и остальные числа вставили как переменные?
Так попробуйте:

f2::
WinExist("ahk_exe ace_player.exe")
WinGet, ActiveControlList, ControlList
Loop, Parse, ActiveControlList, `n
{
   if InStr(A_LoopField, "VLC MSW video")
   {
      ControlGetPos, CtrlX, CtrlY, CtrlW, CtrlH, %A_LoopField%
      WinSet, Region, % CtrlX "-" CtrlY " W" CtrlW " H" CtrlH
      break
   }
}
return

19

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, по всей видимости, я не понял алгоритма. Последний вариант также не отображает каких-либо изменений при активном плеере и нажатии на горячую клавишу.

20

Re: AHK: Скрытие заголовка приложения VLC Player

Тогда вам придется понять алгоритм и попробовать применить его относительно ace_player.
У меня его нет, а на VLC код работает.

21 (изменено: becauseim, 2017-03-28 18:26:31)

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, так понимаю, код оставляет видимым только заданный контрол?

+ открыть спойлер

http://puu.sh/v1ccZ/a851a18404.jpg

f2::
WinExist("ahk_exe notepad.exe")
WinGet, ActiveControlList, ControlList
Loop, Parse, ActiveControlList, `n
{
   if InStr(A_LoopField, "edit1")
   {
      ControlGetPos, CtrlX, CtrlY, CtrlW, CtrlH, %A_LoopField%
      WinSet, Region, % CtrlX "-" CtrlY " W" CtrlW " H" CtrlH
      break
   }
}
return

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

22

Re: AHK: Скрытие заголовка приложения VLC Player

f2::
win := WinExist("ahk_exe ace_player.exe")
WinGet, ActiveControlList, ControlList
Loop, Parse, ActiveControlList, `n
{
   if InStr(A_LoopField, "VLC MSW video")
   {
      DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", win, "UInt", 2, "Int*", 1, "UInt", 4)
      ControlGetPos, CtrlX, CtrlY, CtrlW, CtrlH, %A_LoopField%
      WinSet, Region, % CtrlX "-" CtrlY " W" CtrlW " H" CtrlH
      break
   }
}
return

23

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, спасибо, работает! А какой командой вернуть окно в исходный вид?

24

Re: AHK: Скрытие заголовка приложения VLC Player

Читайте про WinSet, Region.

25

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, после выполнения WinSet с пустым параметром Region, окно становится отличным от первоначального. Это как-то можно исправить?

+ открыть спойлер

http://puu.sh/v1BCl/763b2bca10.jpg

26

Re: AHK: Скрытие заголовка приложения VLC Player

Надо еще окну вернуть первоначальное его отображение:

DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", win, "UInt", 2, "Int*", 0, "UInt", 4)

27

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, спасибо! Установил переключение одной клавишей, но возврат окна в исходное положение не работает после попытки заключить сценарий в функцию. Укажите на ошибку, пожалуйста.


f1::
ShowControl("Ace Player", "VLC MSW video")
return

ShowControl(wintitle, ctrl)
{
SetTitleMatchMode 2
if Toggle:=!Toggle
{
   win := WinExist(wintitle)
   WinGet, ActiveControlList, ControlList
   Loop, Parse, ActiveControlList, `n
   {
      if InStr(A_LoopField, ctrl)
      {
         DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", win, "UInt", 2, "Int*", 1, "UInt", 4)
         ControlGetPos, CtrlX, CtrlY, CtrlW, CtrlH, %A_LoopField%
         WinSet, Region, % CtrlX "-" CtrlY " W" CtrlW " H" CtrlH
         break
      }
}
} else {
   WinSet, Region, , % wintitle
   DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", win, "UInt", 2, "Int*", 0, "UInt", 4)
}
}

28

Re: AHK: Скрытие заголовка приложения VLC Player

Объявите переменные toggle и win как статические.

Статические переменные: чтобы сохранить значение переменной между вызовами, ее можно объявить статической

http://www.script-coding.com/AutoHotkey/Functions.html

29

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, спасибо, работает! А по какому признаку в данном примере становится ясно, что переменные необходимо объявить статическими? Иными словами, как понять необходимость сохранения их значений между вызовами?

30

Re: AHK: Скрытие заголовка приложения VLC Player

У вас в коде при каждом обращении к функции проверяется if Toggle:=!Toggle.
То есть, если мы не будем сохранять текущее значение toggle, то результат всегда будет 1.

toggle := ""
Toggle:=!Toggle
msgbox % Toggle

Переменная же win высчитывается только в первом случае, хотя используется в обоих:

DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", win, "UInt", 2, "Int*", 0, "UInt", 4)

31

Re: AHK: Скрытие заголовка приложения VLC Player

Подскажите, пожалуйста, как задать нужный размер и расположение на экране выделенному контролу? В данном случае, это изображение видеоряда в плеере VLC. Окну VLC задаю нужный мне размер и расположение следующей командой:

WinMove, ahk_class QWidget , , 1180, 628, 870, 490

Но необходио, чтобы данному размеру и расположению соответствовала именно область изображения плеера, которая осталась в результате:


ShowControl("Ace Player", "VLC MSW video")

ShowControl(wintitle, ctrl){
   static Toggle
   win := WinExist(wintitle)
   WinGet, ActiveControlList, ControlList
   if Toggle:=!Toggle
   {
      Loop, Parse, ActiveControlList, `n
      {
         if InStr(A_LoopField, ctrl)
         {
            DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", win, "UInt", 2, "Int*", 1, "UInt", 4)
            ControlGetPos, CtrlX, CtrlY, CtrlW, CtrlH, %A_LoopField%
            WinSet, Region, % CtrlX "-" CtrlY " W" CtrlW " H" CtrlH
            break
         }
      }
   } else {
      WinSet, Region, , % wintitle
      DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", win, "UInt", 2, "Int*", 0, "UInt", 4)
      }
}

32

Re: AHK: Скрытие заголовка приложения VLC Player

controlmove.

33

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, а как присвоить имя найденному контролу в функции (контролу, с содержанием в имени "VLC MSW video")?

34

Re: AHK: Скрытие заголовка приложения VLC Player

А вы поняли как работает скрипт из 31 поста?
Там этот момент учитывается.

35

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, я только понял, что скрипт получает список всех контролов, далее находит в них контрол с необходимым содержанием в имени. В качестве имени контрола я вижу там только %A_LoopField%, когда скрипт получает его координаты расположения в окне.

36

Re: AHK: Скрытие заголовка приложения VLC Player

Вы можете посмотреть, чему равна переменная A_LoopField с помощью msgbox.

37

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, контрол перемещается внутри окна. Мне необходимо разместить контрол на экране аналогично размещению окна.
Название контрола указывал как постоянное, хотя оно меняется. А как указать найденное в функции опытным путем имя - не знаю, т.е. не знаю, как присвоить ему постоянное значение.

#SingleInstance Force
SetTitleMatchMode 2
CoordMode, screen
1::
   ShowControl("Ace Player", "VLC MSW video")
   ControlMove, VLC MSW video 0DDE90801, 1180, 628, 870, 490
return

ShowControl(wintitle, ctrl){
   static Toggle
   win := WinExist(wintitle)
   WinGet, ActiveControlList, ControlList
   if Toggle:=!Toggle
   {
      Loop, Parse, ActiveControlList, `n
      {
         if InStr(A_LoopField, ctrl)
         {
            DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", win, "UInt", 2, "Int*", 1, "UInt", 4)
            ControlGetPos, CtrlX, CtrlY, CtrlW, CtrlH, %A_LoopField%
            WinSet, Region, % CtrlX "-" CtrlY " W" CtrlW " H" CtrlH
 			MsgBox % A_LoopField 
         break
         }
      }
   } else {
      WinSet, Region, , % wintitle
      DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", win, "UInt", 2, "Int*", 0, "UInt", 4)
      }
}

38

Re: AHK: Скрытие заголовка приложения VLC Player

Вставьте ControlMove в функцию.

39

Re: AHK: Скрытие заголовка приложения VLC Player

Malcev, изначально ф-ия подразумевалась для универсальности скрипта (для работы с разными окнами). Предлагаете задавать координаты для перемещения контрола в параметрах ф-ии наряду с именем окна и контрола? Т.е. вынести найденый контрол с присвоением переменной за пределы функции невозможно?

40

Re: AHK: Скрытие заголовка приложения VLC Player

msgbox % f("a")

f(var)
{
   title := "ok"
   return title
}