Fixing Keyboard shortcut send in Auto Hot Key - autohotkey

Hi this is a super easy question but I was hoping someone could help me solve two AutoHotKey questions.
I am trying to get the keys Cntrl, J and I to be a keyboard shortcut that sends alt,h,v, and f.
Thus far I have tried these two ways of typing it
^&j&i::Send, !&h&v&f
^ji::Send, !hvf
as well as each of those without the comma after send.
I am also looking to send these keys on a very small delay, such as 5ms between each key
I was thinking of using something like this
^&j&i::
{
Send, {! down}
sleep 5
Send, {h down}
sleep 5
Send, {v down}
sleep 5
Send< {f down}
}
but of course, that is not working either. Any help is appreciated

Refer to https://www.autohotkey.com/docs/Hotkeys.htm#combo
Combinations of three or more keys are not supported. With this in mind we need to check the key state of the control key before defining the hotkey.
A few other things to note: SendInput is the ideal send method, and you likely want those keys back into an up state which I've included in my example.
#if GetKeyState("LControl", "P")
{
j & i::
{
SendInput {Alt down}
sleep 5
SendInput {h down}
sleep 5
SendInput {v down}
sleep 5
SendInput {f down}
sleep 5
SendInput {Alt Up}
sleep 5
SendInput {h Up}
sleep 5
SendInput {v Up}
sleep 5
SendInput {f Up}
return
}
}

Related

I'm having trouble with GetKeyState in AHK

Below is an alt+tab program I wrote that, for some reason, won't work.
while x = 1
{
mb1 := GetKeyState(j)
mb2 := GetKeyState(k)
if (mb1 = 1) and (mb2 = 1)
{
Send, {Alt Down}
Send, {Tab Down}
sleep, 50
Send, {Alt Up}
Send, {Tab Up}
}
}
I've tried multiple methods of the loop and key detection to no avail.
You do not need to store the value of the keystate in a variable prior to the if-statement; you can check them during the if-statement itself.
So, you could implement this change with something like this:
Loop
{
if (GetKeyState("j") && GetKeyState("k"))
{
Send, {Alt Down}
Send, {Tab Down}
sleep, 50
Send, {Alt Up}
Send, {Tab Up}
}
}
However, if you need to save the value of the KeyStates for some reason, there are a couple of ways to do this:
Just save the values from the GetKeyStates while you are checking them in the if-statement.
Note: For both variables to always update every iteration, you need to replace the efficient && with the less efficient &, since the && will stop checking variables as soon as it determines the expression will be false.
This would look something like:
Loop
{
if (mb1:=GetKeyState("j") & mb2:=GetKeyState("k"))
{
Send, {Alt Down}
Send, {Tab Down}
sleep, 50
Send, {Alt Up}
Send, {Tab Up}
}
MsgBox During the last check, j was %mb1%, and k was %mb2%!
}
Use the alternative GetKeyState command syntax
Note: Although this version of the command makes it more straightforward to save the output of the command to a variable, it is depreciated and not recommended for use in new scripts.

Autohotkey, problems redefining keypress down state of mousekey

I am using the LButton (mouse left) in a keybind as a prefix key. I got it to work, problem is I now need to redefine the LButton as whatever it was in it's natural state...in Autohotkey's terms.
I read this: https://www.autohotkey.com/docs/commands/GetKeyState.htm.
And cameup with the following code, but it's not working at all the way I thought it would. Simply put, you can use $LButton::Send {Click Left} to emulate the basic mouse click. The problem is when you hold the button/key down, nothing happens. I thought the code to emulate, or define the 'pressed down' behaviour would be readily available, but what I've found isn't working.
$LButton::
if (GetKeyState("LButton", "P"))
Send, {Click Left Down} ;tried variants with {Click Left} etc alrdy
else
Send, {Click Left Up}
return
For person in comments:
LButton & ~RButton::
Send, 1{Click Right}{Click Left}{Click Right}{MButton}
Sleep 130 ;125
Send, 1
return
$LButton:: ;no idea what this shud be
SendInput {Click Left}
;Send, {Click Left Down}
;KeyWait, LButton
;Send, {Click Left Up}
return
RButton::
Send, 1{Click Right}{Click Left}{Click Right}{MButton}
Sleep 130 ;125
Send, 1
return
Not sure if I understood this correctly, but you want holding LButton, then clicking the RButton to run this code:
Send, 1{Click Right}{Click Left}{Click Right}{MButton}
Sleep 130 ;125
Send, 1
And just clicking RButton should run that code as well?
And if LButton is just pressed normally (not in combination with RButton) it should function as normal?
Well this would be it:
~LButton & RButton::
RButton::
Send, 1{Click Right}{Click Left}{Click Right}{MButton}
Sleep, 130
Send, 1
return
Basically just making use of the ~ modifier.
Although I can't speak for Send, 1{Click Right}{Click Left}{Click Right}{MButton}.
I don't know what it's supposed to do, but maybe/hopefully it's doing the right thing.
Pressing w or something that you define should do the job
w::
Send, {Click down}
Send, {Blind}1{Click Right}{Click}{Click Right}{MButton}
Sleep 130 ;125
Send, 1
return
Anyone looking for something similar could try in this direction
#SingleInstance force
#warn
r::Reload
x::ExitApp
w::
Send, {Click down}
Send, {Blind}1{Click Right}{Click}{Click Right}{MButton}
Sleep 130 ;125
Send, 1
return
just Pressing w should do the job
Alternately
, the below one will do the same
LButton::Send, {Click down}
RButton::
if GetKeyState("LButton", "P")
{
Send, {Blind}1{Click Right}{Click}{Click Right}{MButton}
Sleep 130 ;125
Send, 1
}
else
Send, {Click Right}
return

AHK: GetKeyState, can't send 2 commands

Basically what I want to do is: While I hold down the "a"-key the script automatically holds and releases the "a"-key over and over. It also has to press or hold/release the "h"-key. It causes me problems when I try to add the "h"-key (it spams the "h"-key whenever I activate the script instead of waiting for an "a"-press).
#Persistent
SetTimer, Clicking
F2::ExitApp
Clicking:
a::
if (GetKeyState("a", "P"))
Send {a down}
Send {h down}
Sleep 100
Send {h up}
Send {a up}
Sleep 475
Return
a up:: Send {a up}
Any help would be greatly appreciated! :-)
You need braces around your if block:
if (GetKeyState("a", "P"))
{
Send {a down}
Send {h down}
...
}

Autohotkey: Can't figure out why this is pushing Shift along with the rest of the code

I am trying to make a macro that will repeat hitting O and M as long as i have my side mouse button held down, but all of a sudden now it is also hitting shift. Any idea why or how to fix it?
delaybetweenfkeys:=0
fkeydowndelay:=5
XButton1::
Down := True
Send, {O Down}{m Down}
Loop
{
Send, {O Down}{m Down}
Sleep, 5
Send, {O Up}{m Up}
If !Down
Break
}
Send, {O Up}{m Up}
Return
XButton1 Up::Down := False
You're telling it to send a capital 'O', and to achieve that, it sends Shift+o. So if you have some other key being pressed in the meantime, it will get shifted as well.

Autohotkey, Step by Step Execution

This may be a very simple code but I am not able to find how to do it.
I have this
Send, Hi
Send, How Are you
Send, I am Fine
I want to do it like this
Hi How Are you
....
Right now with the below code
KeyWait, Capslock
Send, Hi
KeyWait, Capslock
Send, How Are you
KeyWait, Capslock
Send, I am Fine
I get
HiHow Are YOuI Am Fine as soon as I press Capslock.
I want it to wait to execute the next command. THanks for your help.
KeyWait, Capslock
Send {Capslock} ; Tap it again to reset it and force it to be released
; or Send {Capslock Up} to force it to be released
; or SetCapslockState Off to disable it completley
Send, Hi KeyWait, Capslock{Enter}
Send, How Are you KeyWait, Capslock{Enter}
Send, I am Fine{Enter}
If you want it in a hotkey, you could do something like this.
~$CapsLock::
Send {CapsLock Up}
Send, Hi {Enter}
KeyWait, Capslock, D
Send {CapsLock Up}
Send, How Are you{Enter}
KeyWait, Capslock
Send {CapsLock Up}
Send, I am Fine{Enter}
return
(It's glitching on my computer, but it may be because I'm on a virtual machine.)
SetCapslockState
Sorry if it is too late,but i did it anyways for everyone searching the solution for it,i assume you want to change it every time u press capslock to be different text:
CapsLock::
CapsLock0:
{
SendRaw Hi
Sleep 500
KeyWait, CapsLock, D
{
Goto CapsLock1
}
}
Return
CapsLock1:
{
SendRaw How Are you
Sleep 500
KeyWait, CapsLock, D
{
Goto CapsLock2
}
}
Return
CapsLock2:
{
SendRaw I am Fine
Sleep 500
KeyWait, CapsLock, D
{
Goto CapsLock0
}
}
Return
Explaination for Sleep,it is used because if you would press CapsLock without it then 2 of the command blocks would be executed,it is especially needed.
How about this...
Capslock::
Send, Hi{Enter}
Sleep, 400 ; sleep briefly to allow the CapsLock key to be released
KeyWait, Capslock, D
Send, How Are you?{Enter}
Sleep, 400
KeyWait, Capslock, D
Send, I am fine Thank you.{Enter}
Return
How about this...
Capslock::
Send, Hi{Enter}
KeyWait, Capslock, U
KeyWait, Capslock, D
Send, How Are you?{Enter}
KeyWait, Capslock, U
KeyWait, Capslock, D
Send, I am fine Thank you.{Enter}
Return