├── CapsLock_Menu.ahk └── README.md /CapsLock_Menu.ahk: -------------------------------------------------------------------------------- 1 | #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. 2 | ; #Warn ; Enable warnings to assist with detecting common errors. 3 | SendMode Input ; Recommended for new scripts due to its superior speed and reliability. 4 | SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. 5 | #SingleInstance Force ; Replaces the old instance automatically. 6 | SetBatchLines -1 ; Run the script at maximum speed. 7 | 8 | CapsLockMenu() 9 | { 10 | Menu, CapsLockMenu, Add 11 | Menu, CapsLockMenu, Delete 12 | Menu, CapsLockMenu, Add, CAPSLock Menu, ToggleCapsLock 13 | Menu, CapsLockMenu, Add 14 | Menu, CapsLockMenu, Add, CapsLock O&N, CapsLockOn 15 | Menu, CapsLockMenu, Add, CapsLock &off, CapsLockOff 16 | Menu, CapsLockMenu, Add 17 | Menu, CapsLockMenu, Add, Paste as &Plain Text, PastePlain 18 | Menu, CapsLockMenu, Add 19 | Menu, ConvertCaseMenu, Add 20 | Menu, ConvertCaseMenu, Delete 21 | Menu, ConvertCaseMenu, Add, &Title Case, Title 22 | Menu, ConvertCaseMenu, Add, Ca&pital Case, Capital 23 | Menu, ConvertCaseMenu, Add, &Sentence case, Sentence 24 | Menu, ConvertCaseMenu, Add 25 | Menu, ConvertCaseMenu, Add, &UPPERCASE, Upper 26 | Menu, ConvertCaseMenu, Add, lo&wercase, Lower 27 | Menu, ConvertCaseMenu, Add, &camelCase, camel 28 | Menu, ConvertCaseMenu, Add, &PascalCase, Pascal 29 | Menu, ConvertCaseMenu, Add 30 | Menu, ConvertCaseMenu, Add, &Dot.Case, Dot 31 | Menu, ConvertCaseMenu, Add, S&nake_Case, Snake 32 | Menu, ConvertCaseMenu, Add, &Kebab-Case, Kebab 33 | Menu, ConvertCaseMenu, Add 34 | Menu, ConvertCaseMenu, Add, iN&VERT cASE, Invert 35 | Menu, ConvertCaseMenu, Add, &RaNdoM caSe, Random 36 | Menu, ConvertCaseMenu, Add, &aLtErNaTiNg cAsE, Alternating 37 | Menu, CapsLockMenu, Add, Con&vert Case, :ConvertCaseMenu 38 | Menu, CapsLockMenu, Add 39 | Menu, CapsLockMenu, Add, &Emoji Keyboard, OpenEmojiKeyboard 40 | Menu, InsertLineMenu, Add 41 | Menu, InsertLineMenu, Delete 42 | Menu, InsertLineMenu, Add, &Light, LightHorizontalBoxDrawing 43 | Menu, InsertLineMenu, Add, &Double, DoubleHorizontalBoxDrawing 44 | Menu, CapsLockMenu, Add, Insert &Line, :InsertLineMenu 45 | Menu, CapsLockMenu, Default, CapsLock Menu 46 | Menu, CapsLockMenu, Show 47 | } 48 | 49 | CopyClipboard() 50 | { 51 | global ClipSaved := "" 52 | ClipSaved := ClipboardAll ; save original clipboard contents 53 | Clipboard := "" ; start off empty to allow ClipWait to detect when the text has arrived 54 | Send {Ctrl down}c{Ctrl up} 55 | Sleep 150 56 | ClipWait, 1.5, 1 57 | if ErrorLevel 58 | { 59 | MsgBox, 262208, AutoHotkey, Copy to clipboard failed. 60 | Clipboard := ClipSaved ; restore the original clipboard contents 61 | ClipSaved := "" ; clear the variable 62 | return 63 | } 64 | } 65 | 66 | PastePlain() 67 | { 68 | ClipSaved := ClipboardAll ; save original clipboard contents 69 | Clipboard := Clipboard ; remove formatting 70 | Send ^v ; send the Ctrl+V command 71 | Sleep 100 ; give some time to finish paste (before restoring clipboard) 72 | Clipboard := ClipSaved ; restore the original clipboard contents 73 | ClipSaved := "" ; clear the variable 74 | } 75 | 76 | ; creating something that links the function to a specific state that can then be called by legacy commands 77 | ToggleCapsLock(){ 78 | return, CapsLockey(, True) 79 | } 80 | CapsLockOn(){ 81 | return, CapsLockey(True) 82 | } 83 | CapsLockOff(){ 84 | return, CapsLockey() 85 | } 86 | 87 | ; actual function that does the work 88 | CapsLockey(state := false, toggle := false) 89 | { 90 | ; list the messages for the message box to report what happened 91 | static messages := {0:"CapsLock Status: OFF", 1:"CapsLock Status: ON", "failed":"CapsLock operation failed"} 92 | 93 | ; decide whether how to set the state 94 | state := toggle ? !GetKeyState("CapsLock", "T") : state 95 | ; 1 2 3 4 5 96 | /* 97 | 1: Condition what should happen 98 | 2: Ternary operator. Signals that to its left is a condition (1) that should be used to decide between the two possibilitys on the right of it (3 or 5) 99 | 3: Getting the toggle keystate of CapsLock and invert it, to allow toggle functionality 100 | 4: Marker to signal that the true section of the ternary operation ends and the false section begins 101 | 5: The state handed in the function call 102 | */ 103 | SetCapsLockState % state 104 | MsgBox, 262208, CapsLock Menu, % messages[(GetKeyState("CapsLock", "T") == state) ? state : "failed"] 105 | } 106 | 107 | CopyClipboardCLM() 108 | { 109 | global ClipSaved 110 | WinGet, id, ID, A 111 | WinGetClass, class, ahk_id %id% 112 | if (class ~= "(Cabinet|Explore)WClass|Progman") 113 | Send {F2} 114 | Sleep 100 115 | CopyClipboard() 116 | if (ClipSaved != "") 117 | Clipboard := Clipboard 118 | else 119 | Exit 120 | } 121 | 122 | PasteClipboardCLM() 123 | { 124 | global ClipSaved 125 | WinGet, id, ID, A 126 | WinGetClass, class, ahk_id %id% 127 | if (class ~= "(Cabinet|Explore)WClass|Progman") 128 | Send {F2} 129 | Send ^v 130 | Sleep 100 131 | Clipboard := ClipSaved 132 | ClipSaved := "" 133 | } 134 | 135 | Title() 136 | { 137 | ExcludeList := ["a", "about", "above", "after", "an", "and", "as", "at", "before", "but", "by", "for", "from", "nor", "of", "or", "so", "the", "to", "via", "with", "within", "without", "yet"] 138 | ExactExcludeList := ["AutoHotkey", "iPad", "iPhone", "iPod", "OneNote", "USA"] 139 | CopyClipboardCLM() 140 | TitleCase := Format("{:T}", Clipboard) 141 | for _, v in ExcludeList 142 | TitleCase := RegexReplace(TitleCase, "i)(?