Sign in to follow this  
Followers 0
Ascend4nt

CrossHairs (full-screen)

7 posts in this topic

#1 ·  Posted (edited)

CrossHairs (Full-Screen)

This UDF utilizes GUI manipulation to simulate full-screen crosshairs.

Posted Image

Example code is included. An additional UDF is bundled in the package: _MouseCursorFuncs (not a full-featured UDF, just one with functions I use now and then).

Note that this would be better controlled using a Mouse Event Handler.

*edits 3/26/2010:

  • Added a new function to alter the properties of the Crosshairs (_XHairSetDisplayProps) - better than destroying/recreating the Crosshairs!
  • Updated the example to show how the new function can be used. It also shows a way to deal with Screen-resolution changes.
Example code:

#include <_CrossHairs.au3>
#include <_MouseCursorFuncs.au3>
; ===============================================================================================================================
; <TestCrossHairs.au3>
;
; Simple test of _Crosshairs UDF. Employs the _MouseCursorFuncs UDF as well
;
; Author: Ascend4nt
; ===============================================================================================================================

;#NoTrayIcon
AutoItSetOption("TrayAutoPause",0)

; ===============================================================================================================================
; GLOBAL VARIABLES
; ===============================================================================================================================

Global $bHKPressed=False,$bPropertyHKPressed=False,$iResolutionchangeMsg=0

; ===============================================================================================================================
; HOTKEY FUNCTIONS
; ===============================================================================================================================

; ESC Key Pressed:

Func _HotKeyPressed()
    $bHKPressed=True
EndFunc

; ALT-P Pressed:

Func _ChangeXHairProperties()
    ; 'Grow' the crosshairs and set them to Red, or alternately shrink them and set them to whitish
    If Not $bPropertyHKPressed Then
        _XHairSetDisplayProps(25,25,0xFF0000)
    Else
        _XHairSetDisplayProps(8,8,0xF0F0F0)
    EndIf
    $bPropertyHKPressed=Not $bPropertyHKPressed
EndFunc


; ===============================================================================================================================
; WINDOWS MESSAGE HANDLER FUNCTIONS
; ===============================================================================================================================


; ===============================================================================================================================
; Func _Resolutionchanged($hWnd,$iMsg,$wParam,$lParam)
;
; Note this registers multiple-monitor settings changes too, but will only report on the primary monitor's resolution
;   This is why we would need to call _WinAPI_GetSystemMetrics() to get the Virtual width/height
; ===============================================================================================================================

Func _Resolutionchanged($hWnd,$iMsg,$wParam,$lParam)
    $iResolutionchangeMsg+=1
    Return 'GUI_RUNDEFMSG'      ; From <GUIConstantsEx.au3> Global Const $GUI_RUNDEFMSG = 'GUI_RUNDEFMSG'
EndFunc


; ===================================================================================================================
;   START MAIN CODE
; ===================================================================================================================

Dim $aNewMousePos

; Create the crosshairs (but don't make them visible yet)
_XHairInit(11,11)

HotKeySet("{ESC}","_HotKeyPressed")
; Alt-p switches between two alternate CrossHair properties
HotKeySet("!p","_ChangeXHairProperties")

; ----------------------------------------------------------------------------------------------------|
; Register Display-Mode changes to our function.
;   NOTE that a GUI (*any* GUI) MUST be created or else the WM_DISPLAYCHANGE message won't be received
;    Luckily, we've just created four GUI's using _XHairInit() and don't need to create any further
;   ALSO note that this is called for *every* GUI that is created (for *just* X-Hairs, thats 4 calls)
; ----------------------------------------------------------------------------------------------------|
GUIRegisterMsg(0x007E,"_Resolutionchanged") ;   WM_DISPLAYCHANGE 0x007E

_MouseHideAllCursors()
;~ _MouseReplaceAllCursors()    ; Alternatively replace all cursors with custom crosshair

While Not $bHKPressed
    ; 4 Messages are sent, 1 for each GUI created
    If $iResolutionchangeMsg>=4 Then
        ; Call with no arguments so that it will retain old properties but adjust to new resolution
        _XHairSetDisplayProps()
        $iResolutionchangeMsg=0
    EndIf
    $aNewMousePos=MouseGetPos()
    _XHairShow($aNewMousePos[0],$aNewMousePos[1])
    Sleep(5)
WEnd
; Unregister Display Mode change function
GUIRegisterMsg(0x007E,"")   ;   WM_DISPLAYCHANGE 0x007E
; Destroy Crosshairs
_XHairUnInit()
; And restore all system cursors back to normal
_MouseRestoreAllCursors()

Download the ZIP from my site

Ascend4nt's AutoIT Code License agreement:

While I provide this source code freely, if you do use the code in your projects, all I ask is that:

  • If you provide source, keep the header as I have put it, OR, if you expand it, then at least acknowledge me as the original author, and any other authors I credit
  • If the program is released, acknowledge me in your credits (it doesn't have to state which functions came from me, though again if the source is provided - see #1)
  • The source on it's own (as opposed to part of a project) can not be posted unless a link to the page(s) where the code were retrieved from is provided and a message stating that the latest updates will be available on the page(s) linked to.
  • Pieces of the code can however be discussed on the threads where Ascend4nt has posted the code without worrying about further linking.
Edited by Ascend4nt

Share this post


Link to post
Share on other sites



Thx Yashied, its good to be back around this great group of people again :(

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

---

Edited by playlet

Share this post


Link to post
Share on other sites

Thanks playlet :(

I just updated the code and example. Here's the changes:

*edits 3/26/2010:

  • Added a new function to alter the properties of the Crosshairs (_XHairSetDisplayProps) - better than destroying/recreating the Crosshairs!
  • Updated the example to show how the new function can be used. It also shows a way to deal with Screen-resolution changes.

Share this post


Link to post
Share on other sites

Thanks KaFu, and you are absolutely correct - this plus the GUIBox UDF makes selecting areas pretty easy. Of course, with a screen-magnify UDF it would be even better. Hmm.. who do I know that has one of those :(

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Similar Content

    • Darknightx37
      By Darknightx37
      Hay there i try to create a gui and delete them on my secound monitore when i was in a fullscreen application but i noticed that i got tabed out of the application every time i created a new gui
      how to fix that i get tabed out i already tryed with winsetontop("application", "", 1)
      thx
       
      --> @SW_SHOWNOACTIVATE
      sry im stupid
    • Valiante
      By Valiante
      Hi,
      I've searched but can only find posts from people with the opposite problem (asking how to get their GUI to display on top of a full-screen app, usually a game.
      I've created a toolbar which I use in a work environment, creating the GUI with the following styles;
      $hwnd = GUICreate($title, $toolbarWidth, $height, $left, $top, $WS_POPUPWINDOW, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))   I want it to have a TOPMOST style as it's supposed to behave like the Windows taskbar (which it does in all but one scenario).   If I start a full-screen RDP session, I can still see my toolbar and have to close it.  Is there a way I can make it appear on top of all windows *except* full-screen apps (in the same way the taskbar allows full-screen apps on top of it)?   Thanks in advance.   Val.
    • momar33
      By momar33
      I am seeing a buttons position change when the following happens.
      1. GUI created at 800 x 600
      2. GUI info is stored using WinGetPos
      3. GUI changed to full-screen using WinMove
      4. Button info is stored using ControlGetPos
      5. Button is deleted
      6. Button is re-created using the stored data from item 4.
      7. GUI is restored to the info gathered in item 2.
      The button starts with this info:
      Button Left:   408 Button Top:    84 Button Width:  80 Button Height: 24   and after the events above the button has this info: Button Left:   409 Button Top:    83 Button Width:  80 Button Height: 24   Here is some code that can reproduce the issue: (press space, f, space, f, then look in the console) #Region Includes #include <WindowsConstants.au3> #include <StaticConstants.au3> #include <GUIConstantsEx.au3> #include <Array.au3> #EndRegion Includes Const $HT_KEY_FULLSCREEN = "f" Const $HT_KEY_SPACE = "{SPACE}" Global $btnAddRebuy[21] Global $btnRemovePlayer[21] Global $fFullscreen = False Global $aGuiInfo Global $aGuiInfo2 Global $guiWidth = 800 Global $guiHeight = 600 #Region Dimensions for Settings Screen ; Player Global $lblPlayerTop = 60 Global $playerLabelSpace = 24 ; Add Rebuy Button Global $btnRebuyLeft = 320 Global $btnRebuyWidth = 80 Global $btnRebuyHeight = 24 ; Remove Player Global $btnRemoveLeft = 408 Global $btnRemoveWidth = 80 Global $btnRemoveHeight = 24 #EndRegion Dimensions for Settings Screen $hMain = GUICreate("Timer", $guiWidth, $guiHeight, -1, -1, BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_OVERLAPPEDWINDOW,$WS_TILEDWINDOW,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS)) For $i = 1 To 5 Step 1 $btnAddRebuy[$i] = GUICtrlCreateButton("Button", $btnRebuyLeft, $lblPlayerTop + ($playerLabelSpace * $i), $btnRebuyWidth, $btnRebuyHeight) GUICtrlSetResizing($btnAddRebuy[$i], $GUI_DOCKAUTO) GuiCtrlSetState($btnAddRebuy[$i], $GUI_DISABLE) $btnRemovePlayer[$i] = GUICtrlCreateButton("Button", $btnRemoveLeft, $lblPlayerTop + ($playerLabelSpace * $i), $btnRemoveWidth, $btnRemoveHeight) ;GUICtrlSetResizing($btnRemovePlayer[$i], $GUI_DOCKAUTO) Next GUISetState(@SW_SHOW) HotKeySet($HT_KEY_FULLSCREEN, "Fullscreen") HotKeySet($HT_KEY_SPACE, "Redraw") While 1 $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then ExitLoop EndIf WEnd Func Fullscreen() If WinActive($hMain) Then If $fFullscreen Then ;GUISetStyle(BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_OVERLAPPEDWINDOW,$WS_TILEDWINDOW,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS), Default, $hMain) $aGuiInfo2 = WinGetPos($hMain) ConsoleWrite("******* Fullscreen *******" & @LF) ConsoleWrite("Win Left: " & $aGuiInfo2[0] & @LF) ConsoleWrite("Win Top: " & $aGuiInfo2[1] & @LF) ConsoleWrite("Win Width: " & $aGuiInfo2[2] & @LF) ConsoleWrite("Win Height: " & $aGuiInfo2[3] & @LF & @LF) ;WinMove($hMain, Default, $aGuiInfo[0], $aGuiInfo[1], $aGuiInfo[2], $aGuiInfo[3]) WinMove($hMain, Default, 238, 179, 816, 638) $fFullscreen = False $aCtrlInfo = ControlGetPos($hMain, "", $btnRemovePlayer[1]) ConsoleWrite("******* Button Info after Restored *******" & @LF) ConsoleWrite("Button Left: " & $aCtrlInfo[0] & @LF) ConsoleWrite("Button Top: " & $aCtrlInfo[1] & @LF) ConsoleWrite("Button Width: " & $aCtrlInfo[2] & @LF) ConsoleWrite("Button Height: " & $aCtrlInfo[3] & @LF & @LF) Else ;GUISetStyle($WS_POPUP, Default, $hMain) $aGuiInfo = WinGetPos($hMain) ConsoleWrite("******* Start Size *******" & @LF) ConsoleWrite("Win Left: " & $aGuiInfo[0] & @LF) ConsoleWrite("Win Top: " & $aGuiInfo[1] & @LF) ConsoleWrite("Win Width: " & $aGuiInfo[2] & @LF) ConsoleWrite("Win Height: " & $aGuiInfo[3] & @LF & @LF) WinMove($hMain, Default, 0, 0, @DesktopWidth, @DesktopHeight) $fFullscreen = True $aCtrlInfo = ControlGetPos($hMain, "", $btnRemovePlayer[1]) ConsoleWrite("******* Button Info after Fullscreened *******" & @LF) ConsoleWrite("Button Left: " & $aCtrlInfo[0] & @LF) ConsoleWrite("Button Top: " & $aCtrlInfo[1] & @LF) ConsoleWrite("Button Width: " & $aCtrlInfo[2] & @LF) ConsoleWrite("Button Height: " & $aCtrlInfo[3] & @LF & @LF) EndIf Else HotKeySet($HT_KEY_FULLSCREEN) Send($HT_KEY_FULLSCREEN) HotKeySet($HT_KEY_FULLSCREEN, "Fullscreen") EndIf EndFunc Func Redraw() Local $aCtrlInfo $aCtrlInfo = ControlGetPos($hMain, "", $btnRemovePlayer[1]) ConsoleWrite("******* Button Info before Redraw *******" & @LF) ConsoleWrite("Button Left: " & $aCtrlInfo[0] & @LF) ConsoleWrite("Button Top: " & $aCtrlInfo[1] & @LF) ConsoleWrite("Button Width: " & $aCtrlInfo[2] & @LF) ConsoleWrite("Button Height: " & $aCtrlInfo[3] & @LF & @LF) GuiCtrlDelete($btnRemovePlayer[1]) $btnRemovePlayer[1] = GUICtrlCreateButton("Button", $aCtrlInfo[0], $aCtrlInfo[1], $aCtrlInfo[2], $aCtrlInfo[3]) ;GUICtrlSetResizing(-1, $GUI_DOCKAUTO) $aCtrlInfo = ControlGetPos($hMain, "", $btnRemovePlayer[1]) ConsoleWrite("******* Button Info after Redraw *******" & @LF) ConsoleWrite("Button Left: " & $aCtrlInfo[0] & @LF) ConsoleWrite("Button Top: " & $aCtrlInfo[1] & @LF) ConsoleWrite("Button Width: " & $aCtrlInfo[2] & @LF) ConsoleWrite("Button Height: " & $aCtrlInfo[3] & @LF & @LF) EndFunc Is there a way to fix this, or is the issue built in to how windows get resized?  
    • Scriptmaster
      By Scriptmaster
      I have had trouble with a gui I need to be full screen
      I have seen a lot of topics but they dont work for me.

      my GUI is a very simple window you can
      I now use @SW_MAXIMIZE
      but it covers up the taskbar.
      (not good)
      please help
      Thanks in advance
    • Schoening
      By Schoening
      I am Pretty Happy for my script so far
      It works as Intended.

      HotKeySet("f", "Poof") ;Triggers xxx HotKeySet("d", "Poof2") ;Triggers xxx MsgBox(0, "Running", "Running") ;MessageBox Informing that the Script is Running While 1 Sleep(100) WEnd Func Poof2() ;When User Presses D Do: Send("q") MouseClick("left") Send("{tab}") Sleep(10) EndFunc Func Poof() ;When User Presses F Do: Send("w") MouseClick("left") Send("{tab}") Sleep(10) Send("w") MouseClick("left") Send("{tab}") Sleep(10) Send("w") MouseClick("left") Send("{tab}") Sleep(10) Send("w") MouseClick("left") Send("{tab}") Sleep(10) Send("w") MouseClick("left") Send("{tab}") Sleep(10) Send("1") EndFunc
      But Not in FullScreen !
      It Simply Does Not Work in the Application it is supposed to Run in, when i Run the Application in Fullscreen !

      Why? I don't get it at all!
      Ive Beed Adviced to use
      ControlSend() So i did !
      And.. Nothing!


      ControlSend("Application", "", "", "{tab}") Works like Send (In Windowed, But not FullScreen)

      Send("w") MouseClick("left") I Got Mouseclick to work 50%
      ControlClick("Application", "", "" "right", 1) But To Work 100% The Mouseclick has to Occur at the Current Location of the Arrow, Not in the Center of the window. But It appears that ControlClick only is Capable of "Clicking" in a Set X, Y Position.
      So that can't be the right Command.. Perhaps Some form of Advanced ControlSend String?
      BUT AGAIN ! WORKS ONLY IN WINDOWED MODE !

      The Last one is Simple..
      ControlSend("Application", "", "", "d") "d" Is not the Correct Syntax.. Again.. I Would think this can be done by a Advanced ControlSend string.
      But Then Again.. Why Is Send AND ControlSend Not Working for me in FullScreen?




      Bonus Info: I Used AutoIt Window Info While the "Application" was in Windowed Mode, So i am fairly shure that i got the Name Right
      (It Works in Windowed Mode - Why Should the Name be Diffrent in FullScreen?)


      OK ! Here Is How i got it to work
      I Compiled it and
      !!! Run As Administrator !

      Sorry Guys ! Beginner Fail (My Third Day with Programming)
      It's Somewhat Tagged, So hope this will at least help other Newbies