2010-11-24 2 views
1

Я использую ClipCursor для блокировки мыши в окне. Как определить высоту строки заголовка окна и границы окна (так что единственное место, куда мышь не может щелкнуть строку заголовка и кнопку «Свернуть, восстановить и увеличить»)?Определить высоту строки заголовка окна

  • Высота строки заголовка зависит от ОС (я не могу дать для этого определенного значения).
  • Я не уверен, что границы имеют разную ширину с разными операционными системами.
  • Я использую Windows XP в классическом режиме.
  • Когда я перехожу в тематический режим, высота строки заголовка изменяется, поэтому она не будет работать.
  • Не используется какой-либо конкретный язык.

ответ

1

Будет ли это работать, чтобы получить клиентский интерфейс окна, а не его полный прямоугольник? Я верю, что вернет клиентскую область окна, которая является прямоугольником окна за вычетом границы и строки заголовка.

Если вы идете по этому маршруту, вам нужно будет преобразовать прямоугольник в координаты экрана, прежде чем звонить ClipCursor().

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

Я только что узнал более конкретный ответ на вашу проблему при просмотре справки 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) 
0

выглядит как

GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYSIZEFRAME) 

правильной высота заголовок

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