Определить высоту строки заголовка окна - PullRequest
1 голос
/ 24 ноября 2010

Я использую ClipCursor для блокировки мыши в окне.Как определить высоту строки заголовка окна и границы окна (поэтому единственное место, где мышь не может щелкнуть строку заголовка и кнопку свертывания, восстановления и максимизации)?

  • высота строки заголовка зависит от ОС (я не могу дать для этого определенного значения).
  • Я не уверен, имеют ли границы разную ширину в разных операционных системах.
  • IЯ использую Windows XP в классическом режиме.
  • Когда я переключаюсь в тематический режим, высота строки заголовка изменяется, поэтому она не будет работать.
  • Не используется определенный язык.

Ответы [ 5 ]

2 голосов
/ 09 января 2012

Вы можете использовать AutoIt.

Вам не нужно иметь дело с этой конкретной высотой заголовка и шириной границы.Вместо этого попробуйте установить MouseCoordMode в относительное положение клиента, переместите мышь в верхнее / левое положение и получите размер окна клиента.Это именно та область, в которую вы хотите, чтобы ваша мышь попала в ловушку.

Эти значения затем можно использовать в функции _MouseTrap.Она должна быть похожа на вашу ClipCursor().

Старая позиция мыши может быть сохранена и восстановлена, но это не имеет смысла, так как ваша мышь в любом случае может быть перемещена в поле ловушки, поэтому я прокомментировал это.1010 *

#include <GuiConstantsEx.au3>
#include <Misc.au3>

Opt("MustDeclareVars", 1)

_Main()

Func _Main()
    Local $GUI, $oldMouseCoordMode, $topLeft, $size ;,$oldMousePos

    $GUI = GUICreate("Example MouseTrap", 392, 323)
    GUISetBkColor( 0xff0000, $GUI)

    GUISetState()

;~  $oldMousePos = MouseGetPos()
    $oldMouseCoordMode = Opt("MouseCoordMode", 2)
    MouseMove(0, 0, 0)
    Opt("MouseCoordMode", 1)
    $topLeft = MouseGetPos()
;~  MouseMove($oldMousePos[0], $oldMousePos[1], 0)
    $size = WinGetClientSize($GUI)
    Opt("MouseCoordMode", $oldMouseCoordMode)
    _MouseTrap($topLeft[0], $topLeft[1], $topLeft[0] + $size[0], $topLeft[1] + $size[1])

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case Else
                ;;;
        EndSwitch
    WEnd
    _MouseTrap()
    Exit
EndFunc   ;==>_Main
1 голос
/ 10 января 2012

Я только что нашел более конкретный ответ на вашу проблему при просмотре справки AutoIt. В описании функции _WinAPI_CreateRectRgn() есть следующий способ получить желаемые размеры:

#include <WinAPI.au3>

; get height of window title and width of window frame - may be different when
; XP theme is ON/OFF
Global $htit = _WinAPI_GetSystemMetrics($SM_CYCAPTION)
Global $frame = _WinAPI_GetSystemMetrics($SM_CXDLGFRAME)
1 голос
/ 24 ноября 2010

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

Если вы пойдете по этому маршруту, вам нужно будет преобразовать прямоугольник в координаты экрана перед вызовом ClipCursor() хотя.

0 голосов
/ 09 марта 2013

Одним из решений в AutoHotKey является простое удаление панели! Это все еще позволит людям использовать короткие пути для манипулирования окном, хотя ...

^F11:: ; Ctrl+F11 = Toggle show Window title bar
WinSet, Style, ^0xC00000, A  ; Toggle the active window's title bar (WS_CAPTION).
If (TopbarHide := !TopbarHide) ;
    ToolTip Topbar Ctrl F11,A_ScreenWidth/2-50,0
else
    Tooltip
Return
0 голосов
/ 08 марта 2013

выглядит как

GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYSIZEFRAME) 

- правильная высота строки заголовка

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