Jump to content
Sign in to follow this  
ogrish

How to capture key press event without HotKeySet

Recommended Posts

ogrish

Hi,

I have a form with a button on it. When clicking the button, another form (form2) will appear (being always on top). Basically what I want is: when form2 is shown and the user press Ctrl + A, the current mouse position will be added to the text control of form2. Since I just want the behavior of Ctrl + A when form2 is shown on the screen. When the user close form2, I still want Ctrl + A as its default meaning, which is select all in most windows application. How to implement this? The following is my code.

Thanks.

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


$Form1 = GUICreate("Form1", 346, 214, 268, 504)
$b = GUICtrlCreateButton("OK", 263, 183, 75, 25)
GUISetState(@SW_SHOW)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $b
            get_mouse_position()
    EndSwitch
WEnd



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Get mouse position
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func get_mouse_position()

    Local $form = GUICreate("Get mouse position", 346, 214, 468, 204)
    Local $mouse_x = GUICtrlCreateLabel("Mouse X:", 8, 8, 65, 20)
    GUICtrlSetFont(-1, 12, 400, 0, "System")
    Local $mouse_y = GUICtrlCreateLabel("Mouse Y:", 169, 8, 66, 20)
    GUICtrlSetFont(-1, 12, 400, 0, "System")
    Local $edit = GUICtrlCreateEdit("", 8, 41, 329, 137)
    GUICtrlSetData(-1, "edit")
    Local $button_ok = GUICtrlCreateButton("OK", 263, 183, 75, 25)
    Local $Label1 = GUICtrlCreateLabel("Ctrl + A add mouse position to the upper text box.", 9, 187, 235, 17)
    Local $x = GUICtrlCreateLabel("x", 79, 10, 73, 17)
    Local $y = GUICtrlCreateLabel("y", 243, 10, 89, 17)
    GUISetState(@SW_SHOW)
    WinSetOnTop($form, "", 1)

    Local $nMsg

    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE, $button_ok
                ExitLoop

               
        EndSwitch
    WEnd

    GUIDelete()

    
EndFunc

Share this post


Link to post
Share on other sites
AdmiralAlkex

Do you want to capture the keys only when "form2" have focus? Then you want to use accelerators (see GUISetAccelerators() in helpfile). A more hack'ish approach would be to enable the HotKey when you open the gui and disable it when it closes (see HotKeySet() in helpfile).

Share this post


Link to post
Share on other sites
Melba23

ogrish,

Use an Accelerator key - they are only active while their related GUI is active. Look for the <<<<<<<< lines as usual: :mellow:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Get mouse position
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func get_mouse_position()

    Local $form = GUICreate("Get mouse position", 346, 214, 468, 204)
    Local $mouse_x = GUICtrlCreateLabel("Mouse X:", 8, 8, 65, 20)
    GUICtrlSetFont(-1, 12, 400, 0, "System")
    Local $mouse_y = GUICtrlCreateLabel("Mouse Y:", 169, 8, 66, 20)
    GUICtrlSetFont(-1, 12, 400, 0, "System")
    Local $edit = GUICtrlCreateEdit("", 8, 41, 329, 137)
    GUICtrlSetData(-1, "edit")
    Local $button_ok = GUICtrlCreateButton("OK", 263, 183, 75, 25)
    Local $Label1 = GUICtrlCreateLabel("Ctrl + A add mouse position to the upper text box.", 9, 187, 235, 17)
    Local $x = GUICtrlCreateLabel("x", 79, 10, 73, 17)
    Local $y = GUICtrlCreateLabel("y", 243, 10, 89, 17)
    ; Create a dummy control for the accel key to action
    $hDummy = GUICtrlCreateDummy() ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    GUISetState(@SW_SHOW)
    WinSetOnTop($form, "", 1)

    ; Set accel key Ctrl+a ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    Local $AccelKeys[1][2] = [["^a", $hDummy]]
    GUISetAccelerators($AccelKeys)

    Local $nMsg

    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE, $button_ok
                ExitLoop
            ; Action the dummy when the accel key is pressed
            Case $hDummy ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                Local $aMPos = MouseGetPos()
                GUICtrlSetData($x, $aMPos[0])
                GUICtrlSetData($y, $aMPos[1])
        EndSwitch
    WEnd

    ; Clear the accel key
    GUISetAccelerators(1) ; <<<<<<<<<<<<<<<<<<<<<<<<

    GUIDelete()

EndFunc

All clear? :)

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites
ogrish

Thanks Melba23 and AdmiralAlkex, you guys solved my problem. I never know the accelerator keys and the dummy control. Now I know them and my problem is solved. Thanks! :mellow:

Share this post


Link to post
Share on other sites
H4CK3D

Try:

_IsPressed
but that must be in the loop

Share this post


Link to post
Share on other sites
univer

Thank you all! That's what I am looking for.

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  

×