I'm working in a program that uses Accelerator keys for user-defined hot keys, and every thing works fine. The user can set hotkeys using SHIFT, CTRL, or ALT. I know that using ALT generates a WM_SYSKEYDOWN rather than WM_KEYDOWN, so it's pretty obvious when ALT is held down.
TranslateAccelerator only takes a window handle, the accel table handle and a single KEYDOWN message. So, my question is, if the user presses CTRL+T, how does TranslateAccelerator know the CTRL key was also pressed?
I know that the CTRL generates a separate KEYDOWN command, and I specifically filtered those out (do not pass to TranslateAccelerator) to test a theory, but TranslateAccelerator is still working.
Related
This issue seems to only occur in this one program.
I have the hotkey Shift+a set in this programs hotkey editor dialog, I want to trigger it in AHK using Rshift and w;
RShift & w::
SendInput, +{a}
Return
For the life of me, it will not work. I press Rshift and w and nothing happens at all. Triggering the hotkey manually by pressing shift and a works just fine.
The strange thing is the following works:
LCtrl & w::
SendInput, +{a}
Return
So does this:
w::
SendInput, +{a}
Return
I also tried to send Rshift back up before triggering the hotkey, no luck:
RShift & w::
SendInput, {RShift up}
SendInput, +{a}
Return
Is there a rule that says you cant use the same modifier as the target hotkey in the trigger that I missed?
please dont suggest that I use other modifier keys, shift +[key] is all that I have left.
Any help would be greatly appreciated!
Firstly, you shouldn't use a custom hotkey combination when a modifier exists (unless you have a good reason to):
For standard modifier keys, normal hotkeys typically work as well or better than "custom" combinations. For example, <+s:: is recommended over LShift & s::.
And secondly you shouldn't escape keys in a Send(docs) command that don't need escaping:
Enclosing a plain ASCII letter (a-z or A-Z) in braces forces it to be sent as the corresponding virtual keycode, even if the character does not exist on the current keyboard layout. In other words, Send a produces the letter "a" while Send {a} may or may not produce "a", depending on the keyboard layout. For details, see the remarks below.
And then about the problem itself:
I of course can't know if this will work, but I'd simply try the following:
>+w::a
This would work because because the remapping syntax actually uses the blind sendmode.
Alternatively, you could, of course, just manually use the blind sendmode:
>+w::SendInput, {Blind}a
So, just like the title says, whenever I remap my LAlt key to LCtrl (or LCtrl to LAlt) they both get pressed when either key is used, and this causes a variety of issues.
The main reason I need these keys to be swapped is for use with a Mac keyboard on a Windows 7 computer. Honestly, though, it is only the beginning of my problem. I would actually like the LAlt key to be the LCtrl key, the LWin key to be the LAlt key, and the LCtrl key to be the LWin key so it appropriately emulates the Mac keyboard for personal use within Pro Tools 10. When I attempt this 3-way-swap, LCtrl and LWin function properly (as LWin and LAlt respectively), however, the LAlt key continues to press both LCtrl and LAlt anyways.
My code looks like this:
#IfWinActive
LAlt::LCtrl
LWin::LAlt
LCtrl::LWin
Return
I am fairly new to AHK, but this shouldn't be overly complicated, right? It's pretty short and sweet, and I'm not even worried about the Alt+Tab ordeal; I just need to figure out the issue so these three buttons can be swapped correctly. If anyone has any clue as to why this might be happening, I would be profoundly grateful. Thanks for your time and effort.
I think your hotkeys are probably triggering each other.
When you hit LALT, it sends LCTRL, which triggers LALT...
When you have a hotkey whose output matches the input of another hotkey, prefix your hotkeys with $ to stop them triggering each other:
$LAlt::LCtrl
$LWin::LAlt
$LCtrl::LWin
Also, I don't think your #IfWinActive is doing anything, since it has no WinTitle param, plus the return at the end is not how you end an #IfWinActive block, you start it with #IfWinActive <WinTitle> and end it with #IfWinActive
How can I create a GUI element like the one of type "Input" that would register current keyboard keystroke, but I'm not talking about any letter or number, but rather special buttons like CTRL, TAB or Enter?
As far as i know there is no special GUI element handling that.
There are some "workarounds" like
When something gets written check if CTRL (or anything else) is pressed
_IsPressed()
Catch if you press CTRL with Hotkey and then make a Funktion to insert it into the Input
HotKeySet({CTRL},_insertCTRL);
Does one of these work for you?
I want my program to press certain keys on my keyboard without me doing it physically.
So I need a subroutine that simulates pressing any key.
What code could I use to accomplish this (Press Any Key) in C++?
(I'm creating a program for MacOSX in Xcode)
Ok I got the mouse sorted now I just need key presses
You could use low-level event functions such as CGEventPost. At a higher level, look at the Accessibility APIs, such as AXUIElementPerformAction.
I want to use AutoHotKey to bind a command to Ctrl+Shift, in the same way that Windows detects it in order to change text direction from right-to-left to left-to-right. That is: I want it to be invoked when Ctrl+Shift is let go, and only if no keys were pressed between pressing Ctrl+Shift and letting them go.
I bound a hotkey on ^~ Shift Up and I expected it to behave the same way as when Windows binds to it for changing the text direction. But, I found that it gets invoked even in cases where I don't want it to be invoked.
For example, I could be selecting a few words by pressing Ctrl and Shift, and then using the arrow keys. Then I let go of Ctrl and Shift and the hotkey gets invoked. I don't want this. I want a hotkey that gets invoked only if I held nothing else then Ctrl and Shift. If I use any other keys, I want the hotkey not to be invoked.
Is there a way to do this with AHK?
#InstallKeybdHook
Hotkey, ^LShift Up, ControlShiftUp
Return
ControlShiftUp:
if (A_PriorKey != "LShift") ; [v1.1.01+]
return
; do something
msgbox hi
Return