我正在使用ClipCursor在窗口中鎖定鼠標。如何檢測窗口標題欄和窗口邊框的高度(因此只有鼠標不能點擊標題欄和最小化,恢復和最大化按鈕)?檢測窗口標題欄的高度
- 標題欄的高度取決於操作系統(我無法給出明確的值)。
- 我不確定邊界在不同的操作系統下是否有不同的寬度。
- 我在經典模式下使用Windows XP。
- 當我更改爲主題模式時,標題欄的高度發生變化,因此無法使用。
- 沒有使用特定的語言。
我正在使用ClipCursor在窗口中鎖定鼠標。如何檢測窗口標題欄和窗口邊框的高度(因此只有鼠標不能點擊標題欄和最小化,恢復和最大化按鈕)?檢測窗口標題欄的高度
它會工作得到窗戶的客戶端矩形,而不是它的完整矩形?我相信這將返回窗口的客戶區,這是窗口的矩形減去邊框和標題欄。
如果你走這條路線,你需要在調用ClipCursor()
之前將rect轉換成屏幕座標。
您可以使用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
我在瀏覽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)
看起來像
GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYSIZEFRAME)
是標題欄的正確高度
在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