Jump to content

How to capture key press event without HotKeySet


 Share

Recommended Posts

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
Link to comment
Share on other sites

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).

Link to comment
Share on other sites

  • Moderators

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

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see 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

 

Link to comment
Share on other sites

  • 2 weeks later...
  • 3 months later...

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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...