1

Тема: AHK: Скрытие панели меню

Сценарий переключает видимость стандартной панели меню активного окна. Минус: если скрыть панель меню и перезагрузить скрипт, то переключение не работает. Т.е. необходимо переоткрыть окно программы. Можно ли это исправить?
Можно ли скрыть панель меню таким образом, чтобы оставалась возможность вызова пункта меню командой WinMenuSelectItem? Например, не скрывать панель, а развернув окно на весь экран, вынести панель меню за пределы видимости экрана вместе с заголовком окна.

^f12::
	ToggleMenu( WinExist("A") )
return

ToggleMenu( hWin )
{
	static hMenu, visible
	if hMenu =
		hMenu := DllCall("GetMenu", "uint", hWin)
	
	if !visible
			DllCall("SetMenu", "uint", hWin, "uint", hMenu)
	else	DllCall("SetMenu", "uint", hWin, "uint", 0)

	visible := !visible
}
Win10x64, AHK v1.1.25

2 (изменено: serzh82saratov, 2016-05-15 20:56:05)

Re: AHK: Скрытие панели меню

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

Не знаю как.

развернув окно на весь экран

Примерно так для главного монитора:


1::FullScreenMode()

FullScreenMode() {
	Static O := {}
	hWnd := WinExist("A")
	WinGet, Style, Style
	If (Style & 0x00C00000)  ; WS_CAPTION
	{
		WinGetPos, X, Y, Width, Height
		O[hWnd] := {X:X,Y:Y,Width:Width,Height:Height}
		WinSet, Style, -0x00C00000			; WS_CAPTION
		WinSet, Style, -0x00040000			; WS_SIZEBOX
		WinSet, Style, +0x80000000			; WS_POPUP
		SysGet, SM_CYMENU, 15 
		WinSet, Region, % "0-" SM_CYMENU " w" A_ScreenWidth " h" A_ScreenHeight
		WinMove, , , 0, -SM_CYMENU, A_ScreenWidth, A_ScreenHeight + SM_CYMENU
		WinSet, AlwaysOnTop, On
	}
	Else
	{
		WinSet, Region
		WinSet, Style, +0x00C00000
		WinSet, Style, +0x00040000
		WinMove, , , O[hWnd].X, O[hWnd].Y, O[hWnd].Width, O[hWnd].Height 
		WinSet, AlwaysOnTop, Off
	}
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

3

Re: AHK: Скрытие панели меню

Так лучше дружит с окнами которые максимизированы перед развёртыванием, но мелькает в таких случаях.


1::FullScreenMode()

FullScreenMode() {
	Static O := {}
	hWnd := WinExist("A")
	WinGet, Style, Style
	If (Style & 0x00C00000)  ; WS_CAPTION
	{ 
		WinGet, MinMax, MinMax
		If MinMax = 1
			WinRestore
		WinGetPos, X, Y, Width, Height
		O[hWnd] := {MinMax:MinMax,X:X,Y:Y,Width:Width,Height:Height}
		WinSet, Style, -0x00C00000			; WS_CAPTION
		WinSet, Style, -0x00040000			; WS_SIZEBOX
		WinSet, Style, +0x80000000			; WS_POPUP
		SysGet, SM_CYMENU, 15 
		WinSet, Region, % "0-" SM_CYMENU " w" A_ScreenWidth " h" A_ScreenHeight
		WinMove, , , 0, -SM_CYMENU, A_ScreenWidth, A_ScreenHeight + SM_CYMENU
		WinSet, AlwaysOnTop, On
	}
	Else
	{
		WinSet, Region
		WinSet, Style, +0x00C00000
		WinSet, Style, +0x00040000
		WinMove, , , O[hWnd].X, O[hWnd].Y, O[hWnd].Width, O[hWnd].Height
		If (O[hWnd].MinMax = 1)
			PostMessage, 0x112, 0xF030   ; 0x112 = WM_SYSCOMMAND, 0xF030 = SC_MAXIMIZE
		WinSet, AlwaysOnTop, Off
	}
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

4

Re: AHK: Скрытие панели меню

serzh82saratov, Спасибо! Второй вариант лучше, т.к. первый вариант некорректно срабатывает при обратном масштабировании, а именно панель задач перекрывает нижнюю часть окна при возвращении панели меню. Но главное, что работает WinMenuSelectItem. Если получится изменить во втором варианте анимацию масштабирования, т.е. убрать мелькание, то будет просто великолепно. Может, кто-то еще из разработчиков дополнит труды serzh82saratov?

Win10x64, AHK v1.1.25

5 (изменено: serzh82saratov, 2016-05-15 21:23:57)

Re: AHK: Скрытие панели меню


1::FullScreenMode()

FullScreenMode() {
	Static O := {}
	hWnd := WinExist("A")
	WinGet, Style, Style
	If (Style & 0x00C00000) 				; WS_CAPTION
	{ 
		WinGet, MinMax, MinMax
		If MinMax = 1
			WinSet, Style, -0x1000000		; WS_MAXIMIZE
		WinGetPos, X, Y, Width, Height
		O[hWnd] := {MinMax:MinMax,X:X,Y:Y,Width:Width,Height:Height}
		WinSet, Style, -0x00C00000			; WS_CAPTION
		WinSet, Style, -0x00040000			; WS_SIZEBOX
		WinSet, Style, +0x80000000			; WS_POPUP
		SysGet, SM_CYMENU, 15 
		WinSet, Region, % "0-" SM_CYMENU " w" A_ScreenWidth " h" A_ScreenHeight
		WinMove, , , 0, -SM_CYMENU, A_ScreenWidth, A_ScreenHeight + SM_CYMENU
		WinSet, AlwaysOnTop, On
	}
	Else
	{
		WinSet, Region
		WinSet, Style, +0x00C00000
		WinSet, Style, +0x00040000
		WinMove, , , O[hWnd].X, O[hWnd].Y, O[hWnd].Width, O[hWnd].Height
		If (O[hWnd].MinMax = 1)
			PostMessage, 0x112, 0xF030   ; 0x112 = WM_SYSCOMMAND, 0xF030 = SC_MAXIMIZE
		WinSet, AlwaysOnTop, Off
	}
}

Так не мелькает, но прежние размеры окна не восстанавливаются.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

6 (изменено: serzh82saratov, 2016-05-15 23:43:52)

Re: AHK: Скрытие панели меню

Сохраняет размеры, вроде без ошибок.


1::FullScreenMode()

FullScreenMode() {
	Static O := []
	hWnd := WinExist("A")
	WinGet, Style, Style
	If (Style & 0x00C00000)  ; WS_CAPTION
	{ 
		WinGetNormalPos(hWnd, X, Y, W, H) 
		WinGet, M, MinMax
		WinSet, Style, -0x00C00000			; WS_CAPTION
		WinSet, Style, -0x00040000			; WS_SIZEBOX
		WinSet, Style, +0x80000000			; WS_POPUP
		SysGet, SM_CYMENU, 15
		WinSet, Region, % "0-" SM_CYMENU " w" A_ScreenWidth " h" A_ScreenHeight
		WinMove, , , 0, -SM_CYMENU, A_ScreenWidth, A_ScreenHeight + SM_CYMENU 
		O[hWnd] := {M:M,X:X,Y:Y,W:W,H:H} 
		WinSet, AlwaysOnTop, On
	}
	Else
	{ 
		WinSet, Region
		WinSet, Style, +0x00C00000
		WinSet, Style, +0x00040000
		If (O[hWnd].M = 1)
		{
			WinSet, Style, -0x1000000		; WS_MAXIMIZE
			WinMaximize
		}
		WinSetNormalPos(hWnd, O[hWnd].X, O[hWnd].Y, O[hWnd].W, O[hWnd].H)
		WinSet, AlwaysOnTop, Off
	}
}

WinGetNormalPos(hwnd, ByRef x, ByRef y, ByRef w, ByRef h)  { 
    VarSetCapacity(wp, 44), NumPut(44, wp) 
    DllCall("GetWindowPlacement", "Ptr", hwnd, "Ptr", &wp) 
    x := NumGet(wp, 28, "int"), y := NumGet(wp, 32, "int") 
    w := NumGet(wp, 36, "int") - x,  h := NumGet(wp, 40, "int") - y
}

WinSetNormalPos(hwnd, x, y, w, h)  { 
	VarSetCapacity(wp, 44, 0), NumPut(44, wp, 0, "uint") 
	DllCall("GetWindowPlacement", "Ptr", hWnd, "Ptr", &wp) 
	NumPut(x, wp, 28, "int"), NumPut(y, wp, 32, "int")
	NumPut(w + x, wp, 36, "int"), NumPut(h + y, wp, 40, "int") 
	DllCall("SetWindowPlacement", "Ptr", hWnd, "Ptr", &wp)	
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

7

Re: AHK: Скрытие панели меню

serzh82saratov, последний вариант работает лучше всего. Спасибо!

Заметил такую особенность, что если скрывать меню из состояния, когда окно развернуто во весь экран, то остается пиксельная линия сверху. Если же скрывать меню из произвольного размера окна программы - то оно также разворчивается во весь экран со скрытой панелью меню и заголовком окна, но уже без всякой пиксельной линии. По крайне мере, это заметно при работе с окном программы Premiere Pro на экране ноутбука с разрешением 2048х1152.

Предполагая, что этот момент может не замечаться на Вашем компьютере и в тесте с другими окнами, готов смириться с тем, что перед вызовом работы сценария мне будет необходимо всякий раз придавать окну произвольный размер, но, в таком случае, хотелось бы, чтобы сценарий умел показывать еще и просто меню (без заголовка), т.е. чтобы переключаться из режима со скрытым заголовком и меню в режим со скрытым заголовком. Думаю, что это вероятно исключит появление пиксельной линии. Возможно ли реализовать такое?

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

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

Win10x64, AHK v1.1.25

8

Re: AHK: Скрытие панели меню

остается пиксельная линия сверху

Наверное от окон зависит, так попробуйте:

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

#SingleInstance Force
#NoEnv

1::FullScreenMode()

FullScreenMode() {
	Static O := []
	hWnd := WinExist("A")
	WinGet, Style, Style
	If (Style & 0x00C00000)  ; WS_CAPTION
	{ 
		WinGetNormalPos(hWnd, X, Y, W, H) 
		WinGet, M, MinMax 
		WinSet, Style, -0x1000000		; WS_MAXIMIZE
		WinSet, Style, -0x00C00000			; WS_CAPTION
		WinSet, Style, -0x00040000			; WS_SIZEBOX
		WinSet, Style, +0x80000000			; WS_POPUP
		SysGet, SM_CYMENU, 15
		WinSet, Region, % "0-" SM_CYMENU " w" A_ScreenWidth " h" A_ScreenHeight
		WinMove, , , 0, -SM_CYMENU, A_ScreenWidth, A_ScreenHeight + SM_CYMENU 
		O[hWnd] := {M:M,X:X,Y:Y,W:W,H:H} 
		WinSet, AlwaysOnTop, On
	}
	Else
	{ 
		WinSet, Region
		WinSet, Style, +0x00C00000
		WinSet, Style, +0x00040000
		If (O[hWnd].M = 1)
		{
			WinSet, Style, -0x1000000		; WS_MAXIMIZE
			WinMaximize
		}
		WinSetNormalPos(hWnd, O[hWnd].X, O[hWnd].Y, O[hWnd].W, O[hWnd].H)
		WinSet, AlwaysOnTop, Off
	}
}

WinGetNormalPos(hwnd, ByRef x, ByRef y, ByRef w, ByRef h)  { 
    VarSetCapacity(wp, 44), NumPut(44, wp) 
    DllCall("GetWindowPlacement", "Ptr", hwnd, "Ptr", &wp) 
    x := NumGet(wp, 28, "int"), y := NumGet(wp, 32, "int") 
    w := NumGet(wp, 36, "int") - x,  h := NumGet(wp, 40, "int") - y
}

WinSetNormalPos(hwnd, x, y, w, h)  { 
	VarSetCapacity(wp, 44, 0), NumPut(44, wp, 0, "uint") 
	DllCall("GetWindowPlacement", "Ptr", hWnd, "Ptr", &wp) 
	NumPut(x, wp, 28, "int"), NumPut(y, wp, 32, "int")
	NumPut(w + x, wp, 36, "int"), NumPut(h + y, wp, 40, "int") 
	DllCall("SetWindowPlacement", "Ptr", hWnd, "Ptr", &wp)	
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

9

Re: AHK: Скрытие панели меню

serzh82saratov, не помогло. А что если перед скрытием окна установить окну произволный размер, но равный параметрам моего дисплея? Т.е. произвольно задать окну высоту и ширину моего дисплея, визуально это должно быть равноценно окну, развернутому во весь экран без скрытия элементов. При помощи команды WinMove, у меня, почему-то, не получилось это сделать. Размер меняется, но выглядит это иначе, а именно, остается пространство с боковых сторон.

Win10x64, AHK v1.1.25

10

Re: AHK: Скрытие панели меню

+ Так как?

#SingleInstance Force
#NoEnv

1::FullScreenMode() 

FullScreenMode(Menu = 0) {
	Static O := []
	hWnd := WinExist("A")
	WinGet, Style, Style
	If (Style & 0x00C00000)
	{ 
		WinGetNormalPos(hWnd, X, Y, W, H) 
		WinGet, M, MinMax
		If M = 1
		{
			WinGetPos, wX, wY, wW, wH
			WinMove, , , wX, wY, wW, wH
		}
		; WinSet, Style, -0x1000000			; WS_MAXIMIZE
		WinSet, Style, -0x00C00000			; WS_CAPTION
		WinSet, Style, -0x00040000			; WS_SIZEBOX
		WinSet, Style, +0x80000000			; WS_POPUP
		If !Menu
		{
			SysGet, SM_CYMENU, 15
			WinSet, Region, % "0-" SM_CYMENU " w" A_ScreenWidth " h" A_ScreenHeight
			WinMove, , , 0, -SM_CYMENU, A_ScreenWidth, A_ScreenHeight + SM_CYMENU 
		}
		Else
			WinMove, , , 0, 0, A_ScreenWidth, A_ScreenHeight 
		O[hWnd] := {M:M,X:X,Y:Y,W:W,H:H} 
		WinSet, AlwaysOnTop, On
		; WinSetNormalPos(hWnd, X, Y, W, H)
	}
	Else
	{ 
		WinSet, Region
		WinSet, Style, +0x00C00000
		WinSet, Style, +0x00040000
		If (O[hWnd].M = 1)
		{
			WinSet, Style, -0x1000000		; WS_MAXIMIZE
			WinMaximize
		}
		WinSetNormalPos(hWnd, O[hWnd].X, O[hWnd].Y, O[hWnd].W, O[hWnd].H)
		WinSet, AlwaysOnTop, Off 
	}
}
 

WinGetNormalPos(hwnd, ByRef x, ByRef y, ByRef w, ByRef h)  { 
    VarSetCapacity(wp, 44), NumPut(44, wp) 
    DllCall("GetWindowPlacement", "Ptr", hwnd, "Ptr", &wp) 
    x := NumGet(wp, 28, "int"), y := NumGet(wp, 32, "int") 
    w := NumGet(wp, 36, "int") - x,  h := NumGet(wp, 40, "int") - y
}

WinSetNormalPos(hwnd, x, y, w, h)  { 
	VarSetCapacity(wp, 44, 0), NumPut(44, wp, 0, "uint") 
	DllCall("GetWindowPlacement", "Ptr", hWnd, "Ptr", &wp) 
	NumPut(x, wp, 28, "int"), NumPut(y, wp, 32, "int")
	NumPut(w + x, wp, 36, "int"), NumPut(h + y, wp, 40, "int") 
	DllCall("SetWindowPlacement", "Ptr", hWnd, "Ptr", &wp)	
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

11

Re: AHK: Скрытие панели меню

serzh82saratov, если перед вызовом работы сценария, окно имеет произвольный размер, то при скрытии меню отображается корректно. Если перед вызовом работы сценария окно развернуто во весь экран, т.е. максимизировано, то при скрытии меню остается линия сверху.

Win10x64, AHK v1.1.25

12 (изменено: serzh82saratov, 2016-05-16 01:58:18)

Re: AHK: Скрытие панели меню

Если перед вызовом работы сценария окно развернуто во весь экран, т.е. максимизировано, то при скрытии меню остается линия сверху.

То есть всё также как было?

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

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


#SingleInstance Force
#NoEnv

1::FullScreenMode()
2::FullScreenMode(1)

FullScreenMode(Menu = 0) {
	Static O := []
	hWnd := WinExist("A")
	WinGet, Style, Style
	If (Style & 0x00C00000 || (O[hWnd].Menu != "" && O[hWnd].Menu != Menu))
	{ 
		WinGetNormalPos(hWnd, X, Y, W, H)
		If (Style & 0x00C00000 || O[hWnd].M)
			WinGet, M, MinMax
		If M = 1
		{
			WinGetPos, wX, wY, wW, wH
			WinMove, , , wX, wY, wW, wH
		} 
		WinSet, Style, -0x01000000			; WS_MAXIMIZE 
		WinSet, Style, -0x00C00000			; WS_CAPTION
		WinSet, Style, -0x00040000			; WS_SIZEBOX
		WinSet, Style, +0x80000000			; WS_POPUP
		If (!Menu || (SM_CYMENU := 0))
			SysGet, SM_CYMENU, 15
		WinSet, Region, % "0-" SM_CYMENU " w" A_ScreenWidth " h" A_ScreenHeight
		WinMove, , , 0, -SM_CYMENU, A_ScreenWidth, A_ScreenHeight + SM_CYMENU  
		O[hWnd] := {M:M,X:X,Y:Y,W:W,H:H,Menu:Menu} 
		WinSet, AlwaysOnTop, On
		WinSet, Style, +0x01000000		; WS_MAXIMIZE 
		WinSetNormalPos(hWnd, X, Y, W, H)		 
	}
	Else
	{
		WinSet, Region
		WinSet, Style, +0x00C00000
		WinSet, Style, +0x00040000
		If (O[hWnd].M = 1)
		{
			WinGetNormalPos(hWnd, X, Y, W, H)
			WinSet, Style, -0x01000000		; WS_MAXIMIZE
			WinMaximize 
			WinSetNormalPos(hWnd, X, Y, W, H)
		} 
		Else 
			WinRestore
		WinSet, AlwaysOnTop, Off
		O[hWnd].Menu := ""
	}
}

WinGetNormalPos(hwnd, ByRef x, ByRef y, ByRef w, ByRef h)  { 
    VarSetCapacity(wp, 44), NumPut(44, wp) 
    DllCall("GetWindowPlacement", "Ptr", hwnd, "Ptr", &wp) 
    x := NumGet(wp, 28, "int"), y := NumGet(wp, 32, "int") 
    w := NumGet(wp, 36, "int") - x,  h := NumGet(wp, 40, "int") - y
}

WinSetNormalPos(hwnd, x, y, w, h)  { 
	VarSetCapacity(wp, 44, 0), NumPut(44, wp, 0, "uint") 
	DllCall("GetWindowPlacement", "Ptr", hWnd, "Ptr", &wp) 
	NumPut(x, wp, 28, "int"), NumPut(y, wp, 32, "int")
	NumPut(w + x, wp, 36, "int"), NumPut(h + y, wp, 40, "int") 
	DllCall("SetWindowPlacement", "Ptr", hWnd, "Ptr", &wp)	
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

13

Re: AHK: Скрытие панели меню

serzh82saratov пишет:

То есть всё также как было?

Да. Так же.
А сейчас практически идеально. Если перейти по кнопке 2 в режим без заголовка, а далее по клавише 1 в режим без заголовка и меню, то линии нет, даже если перед этим окно было максимизировано. Далее при переключении масштабирования клавишами  1 и 2 все отображается как надо. Подумал, что, наверное, удобнее было бы установить переключение между FullScreenMode() и FullScreenMode(1) одной клавишей, а другой клавишей возвращать окно в исходный вид.

Win10x64, AHK v1.1.25

14

Re: AHK: Скрытие панели меню

Если перейти по кнопке 2 в режим без заголовка, а далее по клавише 1 в режим без заголовка и меню, то линии нет

Это на всех окнах эта линия?

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

15 (изменено: serzh82saratov, 2016-05-27 18:52:36)

Re: AHK: Скрытие панели меню

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

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

#SingleInstance Force
#NoEnv

1::FullScreenMode(1)
2::FullScreenMode()

FullScreenMode(Mode = 0) {
	Static O := [], Bottom := 0
	hWnd := WinExist("A")
	WinGet, Style, Style
	If (Style & 0x00C00000 || Mode)
	{ 
		WinGetNormalPos(hWnd, X, Y, W, H)
		Menu := O[hWnd].Menu ? 0 : 1
		M := O[hWnd].M = "" ? (Style & 0x01000000) : O[hWnd].M  
		If M
		{
			WinGetPos, wX, wY, wW, wH
			WinMove, , , wX, wY, wW, wH
		}
		WinSet, Style, -0x01000000			; WS_MAXIMIZE 
		WinSet, Style, -0x00C00000			; WS_CAPTION
		WinSet, Style, -0x00040000			; WS_SIZEBOX
		WinSet, Style, +0x80000000			; WS_POPUP
		If (!Menu || (SM_CYMENU := 0))
			SysGet, SM_CYMENU, 15
		WinSet, Region, % "0-" SM_CYMENU " w" A_ScreenWidth " h" A_ScreenHeight + Bottom
		WinMove, , , 0, -SM_CYMENU, A_ScreenWidth, A_ScreenHeight + SM_CYMENU + Bottom
		O[hWnd] := {M:M,X:X,Y:Y,W:W,H:H,Menu:Menu} 
		WinSet, AlwaysOnTop, On
		WinSet, Style, +0x01000000		; WS_MAXIMIZE 
		WinSetNormalPos(hWnd, X, Y, W, H)		 
	}
	Else
	{
		WinSet, Region
		WinSet, Style, +0x00C00000
		WinSet, Style, +0x00040000
		If O[hWnd].M 
		{
			WinGetNormalPos(hWnd, X, Y, W, H)
			WinSet, Style, -0x01000000		; WS_MAXIMIZE
			WinMaximize 
			WinSetNormalPos(hWnd, X, Y, W, H)
		} 
		Else 
			WinRestore
		WinSet, AlwaysOnTop, Off
		O[hWnd].M := "", O[hWnd].Menu := 0
	}
}

WinGetNormalPos(hwnd, ByRef x, ByRef y, ByRef w, ByRef h)  { 
    VarSetCapacity(wp, 44), NumPut(44, wp) 
    DllCall("GetWindowPlacement", "Ptr", hwnd, "Ptr", &wp) 
    x := NumGet(wp, 28, "int"), y := NumGet(wp, 32, "int") 
    w := NumGet(wp, 36, "int") - x,  h := NumGet(wp, 40, "int") - y
}

WinSetNormalPos(hwnd, x, y, w, h)  { 
	VarSetCapacity(wp, 44, 0), NumPut(44, wp, 0, "uint") 
	DllCall("GetWindowPlacement", "Ptr", hWnd, "Ptr", &wp) 
	NumPut(x, wp, 28, "int"), NumPut(y, wp, 32, "int")
	NumPut(w + x, wp, 36, "int"), NumPut(h + y, wp, 40, "int") 
	DllCall("SetWindowPlacement", "Ptr", hWnd, "Ptr", &wp)	
} 

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

16

Re: AHK: Скрытие панели меню

Спасибо!

serzh82saratov пишет:

Это на всех окнах эта линия?

Замечаю только в окне Premiere Pro. Может, потому, что оно темное.

Win10x64, AHK v1.1.25

17

Re: AHK: Скрытие панели меню

serzh82saratov, скажите, Ваш сценарий работает исключительно с панелями и заголовками окон или же он умеет отрезать часть окна (сверху или снизу)? Можно ли схожим образом скрыть заданную высоту окна в нижней его части?

Win10x64, AHK v1.1.25

18

Re: AHK: Скрытие панели меню

В 15 добавил, переменная Bottom.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

19 (изменено: becauseim, 2016-05-27 19:14:32)

Re: AHK: Скрытие панели меню

serzh82saratov, спасибо, работает! Однако, не понимаю, почему, но не работает с программой Resolve. У нее панель меню нестандартная, однако не скрывается в т.ч. и заголовок окна. Не могу понять, с чем это связано.

Win10x64, AHK v1.1.25

20

Re: AHK: Скрытие панели меню

А что мне даёт ссылка, вы скриншот приведите.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

21 (изменено: becauseim, 2016-05-27 19:13:39)

Re: AHK: Скрытие панели меню

serzh82saratov, Скриншот.

Win10x64, AHK v1.1.25

22

Re: AHK: Скрытие панели меню

Там нет стандартного заголовка и меню. В глобальном массиве oFSM можно указать сколько откуда отступать для окна с указанным классом. Если для окна и так всё нормально, то его указывать не нужно.

+ Новая версия.

#SingleInstance Force
#NoEnv
Global oFSM := {"Notepad":{T:32,B:32,L:32,R:32}}

1::FullScreenMode(1)
2::FullScreenMode()

FullScreenMode(Mode = 0) {
	Static O := []
	hWnd := WinExist("A")
	WinGet, Style, Style
	If (Style & 0x00C00000 || Mode)
	{  
		WinGetNormalPos(hWnd, X, Y, W, H)
		Menu := O[hWnd].Menu ? 0 : 1
		M := O[hWnd].M = "" ? (Style & 0x01000000) : O[hWnd].M  
		If M
		{
			WinGetPos, wX, wY, wW, wH
			WinMove, , , wX, wY, wW, wH
		}
		WinSet, Style, -0x01000000			; WS_MAXIMIZE 
		WinSet, Style, -0x00C00000			; WS_CAPTION
		WinSet, Style, -0x00040000			; WS_SIZEBOX
		WinSet, Style, +0x80000000			; WS_POPUP
		WinGetClass, Class
		Top := oFSM[Class].T, !Top && Top := 0
		Bottom := oFSM[Class].B, !Bottom && Bottom := 0
		Left := oFSM[Class].L, !Left && Left := 0
		Right := oFSM[Class].R, !Right && Right := 0
		If (!Menu || (SM_CYMENU := 0))
			SysGet, SM_CYMENU, 15
		WinSet, Region, % 0 - Left "-" SM_CYMENU + Top " w" A_ScreenWidth  + Right  + Left " h" A_ScreenHeight + Bottom
		WinMove, , , 0 - Left, -(SM_CYMENU + Top), A_ScreenWidth + Left + Right, A_ScreenHeight + SM_CYMENU + Bottom + Top
		O[hWnd] := {M:M,X:X,Y:Y,W:W,H:H,Menu:Menu} 
		WinSet, AlwaysOnTop, On
		WinSet, Style, +0x01000000		; WS_MAXIMIZE 
		WinSetNormalPos(hWnd, X, Y, W, H)		 
	}
	Else
	{
		WinSet, Region
		WinSet, Style, +0x00C00000
		WinSet, Style, +0x00040000
		If O[hWnd].M 
		{
			WinGetNormalPos(hWnd, X, Y, W, H)
			WinSet, Style, -0x01000000		; WS_MAXIMIZE
			WinMaximize 
			WinSetNormalPos(hWnd, X, Y, W, H)
		} 
		Else 
			WinRestore
		WinSet, AlwaysOnTop, Off
		O[hWnd].M := "", O[hWnd].Menu := 0
	}
}

WinGetNormalPos(hwnd, ByRef x, ByRef y, ByRef w, ByRef h)  { 
    VarSetCapacity(wp, 44), NumPut(44, wp) 
    DllCall("GetWindowPlacement", "Ptr", hwnd, "Ptr", &wp) 
    x := NumGet(wp, 28, "int"), y := NumGet(wp, 32, "int") 
    w := NumGet(wp, 36, "int") - x,  h := NumGet(wp, 40, "int") - y
}

WinSetNormalPos(hwnd, x, y, w, h)  { 
	VarSetCapacity(wp, 44, 0), NumPut(44, wp, 0, "uint") 
	DllCall("GetWindowPlacement", "Ptr", hWnd, "Ptr", &wp) 
	NumPut(x, wp, 28, "int"), NumPut(y, wp, 32, "int")
	NumPut(w + x, wp, 36, "int"), NumPut(h + y, wp, 40, "int") 
	DllCall("SetWindowPlacement", "Ptr", hWnd, "Ptr", &wp)	
} 
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

23

Re: AHK: Скрытие панели меню

serzh82saratov, ввел данные в массив, но по-прежнему, с окном Resolve не работает, а с текстовым редактором - да.

Global oFSM :={"Qt5QWindowIcon":{T:32,B:32,L:32,R:32}
			,"SciTEWindow":{T:32,B:32,L:32,R:32}}
+ открыть спойлер

http://puu.sh/p72nH/4e6b4be0f9.png

Win10x64, AHK v1.1.25

24

Re: AHK: Скрытие панели меню

Тогда не знаю.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

25

Re: AHK: Скрытие панели меню

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

1::
if (A_ThisHotkey = "1") {
   mode := "video"
   effect := "fast color corrector"
}
SetBatchLines -1
ControlSetText, Edit2, %effect%, ahk_class Premiere Pro
ImageSearch, FXControlsX, FXControlsY, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\FXControls.png
loop 2
{
 ImageSearch, FXPresetX, FXPresetY, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\%mode%%A_Index%.png
 if !ErrorLevel
 {
  MouseClickDrag, Left, %FXPresetX%, %FXPresetY%, %FXControlsX%, %FXControlsY%, 0.5
  Sleep 100
  break
 }
}
return
Win10x64, AHK v1.1.25