【问题标题】:Detect height of a window's title bar检测窗口标题栏的高度
【发布时间】:2011-05-15 07:55:00
【问题描述】:

我正在使用 ClipCursor 将鼠标锁定在窗口中。如何检测窗口标题栏和窗口边框的高度(所以鼠标不能点击标题栏和最小化、恢复、最大化按钮的唯一地方)?

  • 标题栏的高度取决于操作系统(我无法给出明确的值)。
  • 我不确定边框的宽度是否因操作系统不同而不同。
  • 我在经典模式下使用 Windows XP。
  • 当我更改为主题模式时,标题栏的高度会发生变化,因此无法正常工作。
  • 未使用特定语言。

【问题讨论】:

    标签: titlebar


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      看起来像

      GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYSIZEFRAME) 
      

      是标题栏的正确高度

      【讨论】:

        【解决方案3】:

        我刚刚在浏览 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)
        

        【讨论】:

          【解决方案4】:

          您可以使用 AutoIt。

          您不必处理特定的标题栏高度和边框宽度。而是尝试将MouseCoordMode 设置为相对客户端位置,将鼠标移动到顶部/左侧位置并获取窗口客户端大小。这是您希望鼠标被困在其中的确切区域。

          然后可以在_MouseTrap 函数中使用这些值。它应该类似于您的ClipCursor()

          旧的鼠标位置可以保存和恢复,但这没有意义,因为您的鼠标可能会重新定位到陷阱字段中,所以我将其注释掉。

          #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
          

          【讨论】:

            【解决方案5】:

            获取窗口的客户端矩形而不是完整的矩形会起作用吗?我相信这将返回窗口的客户区,即窗口的矩形减去边框和标题栏。

            如果你走这条路,你需要在调用ClipCursor()之前将矩形转换为屏幕坐标。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-08-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-05-31
              • 2011-01-25
              相关资源
              最近更新 更多