2010-11-24 2 views
1

J'utilise ClipCursor pour verrouiller une souris dans une fenêtre. Comment puis-je détecter la hauteur de la barre de titre de la fenêtre et la bordure de la fenêtre (donc le seul endroit où la souris ne peut pas cliquer sur la barre de titre et le bouton minimiser, restaurer et agrandir)?Détection de la hauteur de la barre de titre d'une fenêtre

  • La hauteur de la barre de titre dépend du système d'exploitation (je ne peux pas donner une valeur définie pour cela).
  • Je ne suis pas sûr si les frontières ont des largeurs différentes avec différents systèmes d'exploitation. J'utilise Windows XP en mode classique.
  • Lorsque je passe en mode à thème, la hauteur de la barre de titre change, cela ne fonctionne donc pas.
  • Aucune langue spécifique utilisée.

Répondre

1

Est-ce que cela fonctionnerait pour obtenir le rectangle client de la fenêtre, plutôt que son rect complet? Je crois que cela renverra la zone de client de la fenêtre, qui est le rect de la fenêtre moins la frontière et la barre de titre.

Si vous suivez cette route, vous devrez convertir le rect en coordonnées d'écran avant d'appeler ClipCursor().

2

Vous pouvez utiliser AutoIt.

Vous n'avez pas à gérer cette hauteur de barre de titre et cette largeur de bordure spécifiques. Au lieu de cela, essayez de définir le MouseCoordMode à la position relative du client, déplacez la souris vers la position supérieure/gauche et obtenez la taille du client de la fenêtre. C'est la zone exacte dans laquelle vous voulez que votre souris soit piégée.

Ces valeurs peuvent ensuite être utilisées dans la fonction _MouseTrap. Il devrait ressembler à votre ClipCursor().

L'ancienne position de la souris pourrait être sauvegardée et restaurée, mais cela n'a aucun sens puisque votre souris pourrait être repositionnée dans le champ de piège de toute façon, alors je l'ai commenté.

#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

Je viens de trouver une réponse plus spécifique à votre problème lorsque vous consultez l'aide d'AutoIt. Dans la description de la fonction _WinAPI_CreateRectRgn() il y a la façon suivante pour obtenir la taille souhaitée:

#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

ressemble

GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYSIZEFRAME) 

est la bonne hauteur de la barre de titre

0

Une solution à AutoHotKey est simplement enlever la barre! Cela permettra toujours aux gens d'utiliser des raccourcis pour manipuler la fenêtre si ...

^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 
Questions connexes