1

Тема: AHK: Как узнать толщину рамки окна?

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

Искал в интернете, но ничего не нашёл!

В документации на офф сайте ahk нашёл только это:
(Проблема в лишь том, что он рассматривается относительно рабочего стола, а не клиентской части окна)


; Источник: https://www.autohotkey.com/docs/commands/DllCall.htm
; Structure Example: Pass the address of a RECT structure to GetWindowRect(), which sets the structure's
; members to the positions of the left, top, right, and bottom sides of a window (relative to the screen).

Run Notepad
WinWait Untitled - Notepad  ; This also sets the "last found window" for use with WinExist() below.
VarSetCapacity(Rect, 16)  ; A RECT is a struct consisting of four 32-bit integers (i.e. 4*4=16).
DllCall("GetWindowRect", Ptr, WinExist(), Ptr, &Rect)  ; WinExist() returns an HWND.
MsgBox % "Left " . NumGet(Rect, 0, "Int") . " Top " . NumGet(Rect, 4, "Int")
    . " Right " . NumGet(Rect, 8, "Int") . " Bottom " . NumGet(Rect, 12, "Int")

https://d.radikal.ru/d10/1811/b8/887f4a0741c0.jpg

2

Re: AHK: Как узнать толщину рамки окна?

А зачем эта толщина вам нужна?

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

3 (изменено: Jew, 2018-11-30 00:55:36)

Re: AHK: Как узнать толщину рамки окна?

teadrinker

Я использую клиентскую часть окна через CoordMode, но функция WinGetPos использует координаты всего окна.
(К примеру: клиентская часть имеет разрешение 800х600, но окно с рамкой 816x638)

Для чего мне это надо?
1. Делать скриншот активного окна


; Источник: http://forum.script-coding.com/viewtopic.php?pid=121790#p121790
...
WinGetPos, X, Y, Width, Height, ahk_pid %PID_Process%
SaveScreenshotToFile(X+3, Y+25, Width-3, Height-3, A_ScriptDir . "\test.png")
...

2. Рисовать границы с помощью Splashimage.


;~ Где:
;~ r_X	:= %A_LoopField%.1 ; координата Х относительно клиентской части
;~ r_Y	:= %A_LoopField%.2 ; координата Y относительно клиентской части
;~ r_W	:= %A_LoopField%.3 ; координата W относительно клиентской части
;~ r_H  := %A_LoopField%.4 ; координата H относительно клиентской части

WinGetPos, p_X, p_Y, p_W, p_H, ahk_pid %PID_Process% ; найди длину,ширину и местоположение окна
Splashimage 1:,% "CWFFFF00 B1 W" r_W-r_X   "H1 X" p_X+r_X+3 "Y" p_Y+r_Y+25
Splashimage 2:,% "CWFFFF00 B1 W" r_W-r_X   "H1 X" p_X+r_X+3 "Y" p_Y+r_H+25
Splashimage 3:,% "CWFFFF00 B1 H" r_H-r_Y     "W1 X" p_X+r_X+3 "Y" p_Y+r_Y+25
Splashimage 4:,% "CWFFFF00 B1 H" r_H-r_Y+1 "W1 X" p_X+r_W+3 "Y" p_Y+r_Y+25

(Появляются относительно рабочего стола, а не окна или его клиентской части)

4 (изменено: teadrinker, 2018-11-30 02:21:49)

Re: AHK: Как узнать толщину рамки окна?

Проще сразу получить экранные координаты клиентской части окна:

Run, notepad,,, PID
WinWait, ahk_pid %PID%
pos := WinGetClientPos("ahk_pid" PID)
MsgBox, % "x = " . pos.x . "`n"
        . "y = " . pos.y . "`n"
        . "w = " . pos.w . "`n"
        . "h = " . pos.h

WinGetClientPos(winTitle)  {
   if !hWnd := WinExist(winTitle)  {
      MsgBox, winTitle is wrong
      Return
   }
   VarSetCapacity(WINDOWINFO, 60, 0)
   DllCall("GetWindowInfo", Ptr, hWnd, Ptr, &WINDOWINFO)
   Return { x: x := NumGet(WINDOWINFO, 20, "UInt")
          , y: y := NumGet(WINDOWINFO, 24, "UInt")
          , w: NumGet(WINDOWINFO, 28, "UInt") - x
          , h: NumGet(WINDOWINFO, 32, "UInt") - y }
}

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

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

5

Re: AHK: Как узнать толщину рамки окна?

teadrinker

Спасибо большое. Очень сильно помог.
Я просто в ahk пока не сильно силён, что бы писать такие функции, но я учусь

И всё же, как с помощью SysGet найди толщину рамки и заголовка?
Просто я уже пытался решить проблему через это, но почему то не получалось.

Заранее спасибо!

6

Re: AHK: Как узнать толщину рамки окна?

Нужно смотреть описание параметров:

SysGet, captionHeight, % SM_CYCAPTION := 4
MsgBox, % captionHeight

; Для окна без ресайзинга
SysGet, frameWidth, % SM_CXFIXEDFRAME := 7
SysGet, frameHeight, % SM_CYFIXEDFRAME := 8
MsgBox, % frameWidth

; Для окна с ресайзингом
SysGet, frameWidth, % SM_CXSMSIZE := 32
SysGet, frameHeight, % SM_CYSMSIZE := 33

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