1 (изменено: Clannad5, 2022-11-10 08:56:26)

Тема: AHK: Определить на какой стороне находится панель задач.

Здравствуйте!
Хотелось бы некоторой помощи по поводу панели задач.
Размер панели задач может отличаться от версии Windows, а так же отличаться стороной, на которой она находится (Левый край экрана, правый и т.д).

Мне хочется располагать окно GUI всегда справа внизу по стандарту, но так, чтобы она не задевала панель задач при появление.
То есть я хочу, чтобы когда GUI окно появилось, оно не перекрыло панель задач, т.к GUI находится поверх всех окон.

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

2

Re: AHK: Определить на какой стороне находится панель задач.

Ещё панель задач можно растягивать. И у неё бывает опция "автоматически скрывать", когда убираешь курсор. Скрипту придётся постоянно проверку и координат и размеров панели задач делать?

3

Re: AHK: Определить на какой стороне находится панель задач.

ypppu
нет, только во время 'Gui Show'.

4

Re: AHK: Определить на какой стороне находится панель задач.

SHAppBarMessage.

5 (изменено: Clannad5, 2022-11-10 19:12:55)

Re: AHK: Определить на какой стороне находится панель задач.

Malcev
Нашел, спасибо!


Loop
{
	Sleep, 30
	WinGetPos x, y, w, h, ahk_class Shell_TrayWnd
	ScreenCenterW:=(A_ScreenWidth/2)
	ScreenCenterH:=(A_ScreenHeight/2)

	TaskbarLoc:=( w<A_ScreenWidth?(x<ScreenCenterW?"Left":"Right"):(y<ScreenCenterH?"Top":"Bottom") )
	
	Tooltip, %TaskbarLoc%
}
Return

;ABM_GETSTATE message (Windows)
;https://msdn.microsoft.com/en-us/library/windows/desktop/bb787947(v=vs.85).aspx
;Note  As of Windows 7, ABS_ALWAYSONTOP is no longer returned because the taskbar is always in that state. Older code should be updated to ignore the absence of this value in not assume that return value to mean that the taskbar is not in the always-on-top state.

q:: ;taskbar - toggle auto-hide/always-on-top
vToggle := !vToggle * 0x3
;ABM_SETSTATE := 0xA
VarSetCapacity(APPBARDATA, A_PtrSize=8?48:36, 0)
NumPut(vToggle, &APPBARDATA, A_PtrSize=8?40:32, "UInt")
DllCall("shell32\SHAppBarMessage", UInt,0xA, Ptr,&APPBARDATA, UPtr)
return

w:: ;taskbar - get state - auto-hide/always-on-top
VarSetCapacity(APPBARDATA, A_PtrSize=8?48:36, 0)
;ABM_GETSTATE := 0x4
vState := DllCall("shell32\SHAppBarMessage", UInt,0x4, Ptr,&APPBARDATA, UPtr)

;from shellapi.h
;ABS_ALWAYSONTOP := 0x2 ;ABS_AUTOHIDE := 0x1
MsgBox, % "auto-hide: " (vState & 0x1 ? "on" : "off")
MsgBox, % "always-on-top: " (vState & 0x2 ? "on" : "off")
return

6 (изменено: Malcev, 2022-11-10 20:16:23)

Re: AHK: Определить на какой стороне находится панель задач.

Во втором коде вам надо посылать не ABM_GETSTATE, а ABM_GETTASKBARPOS.

7

Re: AHK: Определить на какой стороне находится панель задач.

Malcev
спасибо, учту.