Momergil
Momergil

Reputation: 437

How can I make AutoHotkeys's functions stop working as soon as the .exe is closed?

I'm testing AutoHotkeys as a way to block user's usage of Ctrl, Alt and Windows Key while an application is running. To do this, I compiled the code:

LAlt::return
RAlt::return
LControl::return
RControl::return
RWin::Return
LWin::Return

into an .exe using the compiler that comes with AutoHotkeys.

My problem is that normally when I close the .exe file (either by code using TerminateProcess(,) or manually) the keys are not released immediately. The Windows Key, for example, may take something like 10 seconds to be finely "unlocked" and become able to be used again, and for me this is unacceptable.

So I got two questions:

Thanks,

Momergil

Upvotes: 0

Views: 991

Answers (2)

Robert Ilbrink
Robert Ilbrink

Reputation: 7953

I would use winactive to disable these keys. In this example the modyfier keys are disabled for "Evernote". As soon as you switch to another program the keys are restored and when you switch back to Evernote the modifier keys are disabled again.

SetTitleMatchMode, 2 ; Find the string Evernote anywhere in the windows title
#ifWinActive Evernote
    LAlt::return
    RAlt::return
    LControl::return
    RControl::return
    RWin::Return
    LWin::Return
#ifWinActive

Upvotes: 1

Brigand
Brigand

Reputation: 86220

AutoHotkey has a built-in command ExitApp for terminating your scripts.
This example makes Esc your termination hotkey:

Esc::ExitApp

It seems like the delay you are experiencing might be related to how long it's taking the process to close. You could try making the hotkeys conditional with the #If command*
(i.e. they are only blocked when Flag = 1).
Then you can have the script quickly change the context just before ExitApp by using OnExit. The OnExit subroutine is called when the script exits by any means (except when it is killed by something like "End Task"). You can call a subroutine with a hotkey by using the GoSub command.

Flag := 1
OnExit, myExit

Esc::GoSub, myExit

#If Flag
LAlt::return
LCtrl::return
x::return
#If

myExit:
Flag := 0
Exitapp

* The #If command requires Autohotkey_L.
The other option that will be more verbose, but work for AHK basic, is the hotkey command.


Another option is to have AutoHotkey run the target application, and upon application exit, AutoHotkey exits as well. Here's an example with Notepad. When the user closes Notepad, the script gracefully exits.

RunWait, Notepad.exe
ExitApp ; Run after Notepad.exe closes

LAlt::return
RAlt::return
LControl::return
RControl::return
RWin::Return
LWin::Return

Upvotes: 2

Related Questions