1

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

  • 标题栏的高度取决于操作系统(我不能给出一个明确的值)。
  • 我不确定边框是否具有不同操作系统的不同宽度。
  • 我在经典模式下使用 Windows XP。
  • 当我更改为主题模式时,标题栏的高度会发生变化,因此它不起作用。
  • 没有使用特定的语言。
4

5 回答 5

2

您可以使用 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
于 2012-01-09T16:40:58.973 回答
1

在浏览 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)
于 2012-01-10T16:23:35.883 回答
1

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

但是,如果您走这条路线,则需要在调用之前将 rect 转换为屏幕坐标ClipCursor()

于 2010-11-24T20:11:48.587 回答
0

好像

GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYSIZEFRAME) 

是标题栏的正确高度

于 2013-03-08T18:11:24.283 回答
0

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
于 2013-03-09T11:13:42.663 回答