我正在使用ClipCursor将鼠标锁定在窗口中。如何检测窗口标题栏和窗口边框的高度(因此鼠标无法单击标题栏以及最小化,恢复和最大化按钮的唯一位置)?
答案 0 :(得分: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
答案 1 :(得分:1)
是否可以使窗口的客户端直接,而不是完整的矩形?我相信会返回窗口的客户区域,即窗口的矩形减去边框和标题栏。
如果你走这条路线,你需要在调用ClipCursor()
之前将矩形转换为屏幕坐标。
答案 2 :(得分: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)
答案 3 :(得分:0)
看起来像
GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYSIZEFRAME)
是标题栏的正确高度
答案 4 :(得分: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