forked from Drugoy/Autohotkey-scripts-.ahk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Capitalize.ahk
70 lines (57 loc) · 2.97 KB
/
Capitalize.ahk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/* Capitalize v1.2
Last time modified: 2016.06.15 14:55
Summary: automatically capitalizes letters after hitting Enter or typing dot, exclamation mark or question mark or triple dots.
Note: this script is built so that it supports russian keyboard layout.
Script author: Drugoy a.k.a. Drugmix
Contacts: [email protected], [email protected]
https://github.com/Drugoy/Autohotkey-scripts-.ahk/blob/master/Capitalize/Capitalize.ahk
*/
#NoEnv
#SingleInstance, Force
#NoTrayIcon
#InputLevel, 2
StringCaseSense, Locale ; Without this the 'If var Is Lower/Upper' checks will fail for Cyrillic.
; Menu Tray, Icon, imageRes.dll, 118
SetKeyDelay, -1
endChars := "?!.…{Enter}" ; List of keys to trigger capitalizing after them.
GroupAdd, ExcludedWindows, ahk_exe explorer.exe
SetFormat, Integer, Hex
Global capNextChar
Global scanCodesCharMap := {0x10: "й", 0x11: "ц", 0x12: "у", 0x13: "к", 0x14: "е", 0x15: "н", 0x16: "г", 0x17: "ш", 0x18: "щ", 0x19: "з", 0x1E: "ф", 0x1F: "ы", 0x20: "в", 0x21: "а", 0x22: "п", 0x23: "р", 0x24: "о", 0x25: "л", 0x26: "д", 0x2C: "я", 0x2D: "ч", 0x2E: "с", 0x2F: "м", 0x30: "и", 0x31: "т", 0x32: "ь", 0x1A: "х", 0x1B: "ъ", 0x27: "ж", 0x28: "э", 0x33: "б", 0x34: "ю", 0x29: "ё"}
Hotkey, IfWinNotActive, ahk_group ExcludedWindows
; Hook to 'Space' key.
funcObjSpace := Func("capitalize") ;.Bind(" ")
Hotkey, Space, % funcObjSpace
For k In scanCodesCharMap ; Register hotkeys for each mentioned scan code.
{
Hotkey, If
If k In 0x1A,0x1B,0x27,0x28,0x33,0x34,0x29 ; Hotkeys with these scan codes should be registered only for Russial keyboard layout.
Hotkey, If, isCurrLayoutRu()
funcObj%k% := Func("capitalize").Bind(k)
Hotkey, % "sc" k, % funcObj%k%
}
Loop ; Listen to input keys, look for 'endChars' to be sent, to set a token 'capNextChar' to capitalize next char.
{
Input, key, C E L1 V, % endChars
capNextChar := (key == " " ? capNextChar : (InStr(ErrorLevel, "EndKey:Enter") ? 2 : InStr(ErrorLevel, "EndKey:")))
}
capitalize(input = "") ; The function that decides whether to and how to transform the input keys.
; input - scan code of an input key.
{
If !(input)
{
capNextChar *= 2 ; Mark spaces being sent after the end chars by doubling the variable's value.
Send, {Space}
Return
}
sendMe := (isCurrLayoutRu() ? scanCodesCharMap[input] : GetKeyName("sc" input)) ; Transform the key's scan code into a char to send (either english or russian, depending on the check on the previous line).
If (capNextChar > 1) ; Means that an end char has fired and there was at least one space after it.
StringUpper, sendMe, sendMe ; Capitalize the key.
Send, % sendMe
}
isCurrLayoutRu()
{
Return (DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, WinExist("A"), UInt, 0, Ptr), Ptr) & 0xFFFF == 0x409 ? 0 : 1) ; Get current keyboard layout. https://msdn.microsoft.com/en-us/goglobal/bb896001 0x0409 - en-US English (United States), so we just assume that if current layout is not this one - then it's probably ru.
}
#If isCurrLayoutRu()
#If