开发者

Detect height of a window's title bar

开发者 https://www.devze.com 2023-01-26 15:15 出处:网络
I am using ClipCursor to lock a mouse in a window. How do I detect the height of the window\'s title bar and border of the window (so the only place the mouse can\'t click 开发者_JAVA百科the title bar

I am using ClipCursor to lock a mouse in a window. How do I detect the height of the window's title bar and border of the window (so the only place the mouse can't click 开发者_JAVA百科the title bar and the minimize, restore and maximize button)?

  • The height of the title bar depends on OS (I can't give a definite value for this).
  • I'm not sure if the borders have different widths with different operating systems.
  • I'm using windows XP on classic mode.
  • When I change to themed mode the height of the title bar changes so it won't work.
  • No specific language used.


You can use AutoIt.

You don't have to deal with that specific titlebar height and border width. Instead try to set the MouseCoordMode to relative client position, move the mouse to the top/left position and get the window client size. This is the exact area you want your mouse to be trapped into.

These values can then be used in the _MouseTrap function. It should be similar to your ClipCursor().

The old mouse Position could be saved and restored but it won't make sense as your mouse might be repositioned into the trap field anyways so I commented this out.

#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


Would it work to get the window's client rect, rather than its full rect? I believe that will return the client area of the window, which is the window's rect minus the border and title bar.

If you go this route, you will need to convert the rect into screen coordinates before calling ClipCursor(), though.


I just found out a more specific answer to your problem while browsing the AutoIt help. In the description of the function _WinAPI_CreateRectRgn() there is the following way to get the wished sizes:

#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)


looks like

GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYSIZEFRAME) 

is the correct height of title bar


One solution in AutoHotKey is to simply remove the bar! That will still allow people to use short cuts to manipulate the window though...

^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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号