Sign in to follow this  
Followers 0
Suppir

How to catch hotkey only if my GUI is active?

5 posts in this topic

Hello!

I have a GUI program that uses hotkeys defined by hotkeyset().

But other programs use these hotkeys too. How to set these

hotkeys to work only if my program is active in this moment?

If it doesn't active, hotkeys should work in another program,

that active in this moment. Thanks.

Share this post


Link to post
Share on other sites



I use accelerator Keys so I don't have the problem you describe:

; Define two dummy Controls in your GUI
$ButtonStrgA = GUICtrlCreateDummy()
$ButtonStrgC = GUICtrlCreateDummy()
...
; Set accelerator keys for Strg+a and Strg+c
Global $asAccelKeys[2][2] = [["^a", $ButtonStrgA],["^c", $ButtonStrgC]]
GUISetAccelerators($asAccelKeys)
...
While 1
    $nMsg = GUIGetMsg(1)
    Select
        Case $nMsg[0] = $GUI_EVENT_CLOSE
            Exit
        Case $nMsg[0] = $ButtonStrgA
            _SelectAll()
        Case $nMsg[0] = $ButtonStrgC
            _Clipboard()
    EndSelect
WEnd

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

I use accelerator Keys so I don't have the problem you describe:

; Define two dummy Controls in your GUI
$ButtonStrgA = GUICtrlCreateDummy()
$ButtonStrgC = GUICtrlCreateDummy()
...
; Set accelerator keys for Strg+a and Strg+c
Global $asAccelKeys[2][2] = [["^a", $ButtonStrgA],["^c", $ButtonStrgC]]
GUISetAccelerators($asAccelKeys)
...
While 1
    $nMsg = GUIGetMsg(1)
    Select
        Case $nMsg[0] = $GUI_EVENT_CLOSE
            Exit
        Case $nMsg[0] = $ButtonStrgA
            _SelectAll()
        Case $nMsg[0] = $ButtonStrgC
            _Clipboard()
    EndSelect
WEnd

Thanks! I think this should be added to te AutoIt core. I mean the Hotkeyset() should parameters to choose:

0 = we want to hotkey working at any time (default)

1 = we want to hotkey working only if autoit program is active

Edited by Suppir

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Hi,

I think this is a completely different approach. My solution works like a hotkey (most of the time) but it uses the GUI to "mimic" the hotkey.

The helpfile states: "A hotkey-press *typically* interrupts the active AutoIt function/statement" whereas my solution has to query the GUI before it reacts.

Imagine your script does a lot of processing after the user presses the "process" button on your GUI. The hotkey interrupts (nearly) every AutoIt statement immediately.

The GUI approach works as soon as the processing has finished and the script checks the input to the GUI again.

In the help file you will find an example on how to pass the pressed keys to other applications. So you could define a hotkey, when triggerde check if your GUI is the active window and if not pass the hotkey to the other applications.

Hope I could make myself clear :-)

Edited by water

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Another way.

#Include <HotKey.au3>

Global Const $VK_OEM_PLUS = 0xBB
Global Const $VK_OEM_MINUS = 0xBD

Global $Form, $Label
Global $i = 0

$Form = GUICreate('MyGUI', 200, 200)
$Label = GUICtrlCreateLabel($i, 20, 72, 160, 52, 0x01)
GUICtrlSetFont(-1, 32, 400, 0, 'Tahoma')
GUISetState()

; Assign "CTRL-(+)" with MyFunc1() and "CTRL-(-)" with MyFunc2() for created window only
_HotKeyAssign(BitOR($CK_CONTROL, $VK_OEM_PLUS), 'MyFunc1', 0, $Form)
_HotKeyAssign(BitOR($CK_CONTROL, $VK_OEM_MINUS), 'MyFunc2', 0, $Form)

Do
Until GUIGetMsg() = -3

Func MyFunc1()
    $i += 1
    GUICtrlSetData($Label, $i)
EndFunc   ;==>MyFunc1

Func MyFunc2()
    $i -= 1
    GUICtrlSetData($Label, $i)
EndFunc   ;==>MyFunc2

HotKey.au3

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