;---- Configuration Section: Customize the size of the on-screen keyboard and
; other options here.; Changing this font size will make the entire on-screen keyboard get
; larger or smaller:k_FontSize = 10k_FontName = Verdana; This can be blank to use the system's default font.k_FontStyle = Bold; Example of an alternative: Italic Underline; Names for the tray menu items:k_MenuItemHide = Hide on-screen &keyboardk_MenuItemShow = Show on-screen &keyboard; To have the keyboard appear on a monitor other than the primary, specify
; a number such as 2 for the following variable. Leave it blank to use
; the primary:k_Monitor =;---- End of configuration section. Don't change anything below this point
; unless you want to alter the basic nature of the script.;---- Alter the tray icon menu:Menu, Tray, Add, %k_MenuItemHide%, k_ShowHideMenu, Tray, Add, &Exit, k_MenuExitMenu, Tray, Default, %k_MenuItemHide%Menu, Tray, NoStandard;---- Calculate object dimensions based on chosen font size:k_KeyWidth = %k_FontSize%k_KeyWidth *= 3k_KeyHeight = %k_FontSize%k_KeyHeight *= 3k_KeyMargin = %k_FontSize%k_KeyMargin /= 6k_SpacebarWidth = %k_FontSize%k_SpacebarWidth *= 25k_KeyWidthHalf = %k_KeyWidth%k_KeyWidthHalf /= 2k_KeySize = w%k_KeyWidth% h%k_KeyHeight%k_Position = x+%k_KeyMargin% %k_KeySize%;---- Create a GUI window for the on-screen keyboard:Gui, Font, s%k_FontSize% %k_FontStyle%, %k_FontName%Gui, -Caption +E0x200 +ToolWindowTransColor = F1ECEDGui, Color, %TransColor%; This color will be made transparent later below.;---- Add a button for each key. Position the first button with absolute
; coordinates so that all other buttons can be positioned relative to it:Gui, Add, Button, section %k_KeySize% xm+%k_KeyWidth%, 1Gui, Add, Button, %k_Position%, 2Gui, Add, Button, %k_Position%, 3Gui, Add, Button, %k_Position%, 4Gui, Add, Button, %k_Position%, 5Gui, Add, Button, %k_Position%, 6Gui, Add, Button, %k_Position%, 7Gui, Add, Button, %k_Position%, 8Gui, Add, Button, %k_Position%, 9Gui, Add, Button, %k_Position%, 0Gui, Add, Button, %k_Position%, -Gui, Add, Button, %k_Position%, =Gui, Add, Button, %k_Position%, BkGui, Add, Button, xm y+%k_KeyMargin% h%k_KeyHeight%, Tab; Auto-width.Gui, Add, Button, %k_Position%, QGui, Add, Button, %k_Position%, WGui, Add, Button, %k_Position%, EGui, Add, Button, %k_Position%, RGui, Add, Button, %k_Position%, TGui, Add, Button, %k_Position%, YGui, Add, Button, %k_Position%, UGui, Add, Button, %k_Position%, IGui, Add, Button, %k_Position%, OGui, Add, Button, %k_Position%, PGui, Add, Button, %k_Position%, [Gui, Add, Button, %k_Position%, ]Gui, Add, Button, %k_Position%, \Gui, Add, Button, xs+%k_KeyWidthHalf% y+%k_KeyMargin% %k_KeySize%, AGui, Add, Button, %k_Position%, SGui, Add, Button, %k_Position%, DGui, Add, Button, %k_Position%, FGui, Add, Button, %k_Position%, GGui, Add, Button, %k_Position%, HGui, Add, Button, %k_Position%, JGui, Add, Button, %k_Position%, KGui, Add, Button, %k_Position%, LGui, Add, Button, %k_Position%, `;Gui, Add, Button, %k_Position%, 'Gui, Add, Button, x+%k_KeyMargin% h%k_KeyHeight%, Enter; Auto-width.; The first button below adds %A_Space% at the end to widen it a little,
; making the layout of keys next to it more accurately reflect a real keyboard:Gui, Add, Button, xm y+%k_KeyMargin% h%k_KeyHeight%, Shift%A_Space%%A_Space%Gui, Add, Button, %k_Position%, ZGui, Add, Button, %k_Position%, XGui, Add, Button, %k_Position%, CGui, Add, Button, %k_Position%, VGui, Add, Button, %k_Position%, BGui, Add, Button, %k_Position%, NGui, Add, Button, %k_Position%, MGui, Add, Button, %k_Position%, `,Gui, Add, Button, %k_Position%, .Gui, Add, Button, %k_Position%, /Gui, Add, Button, xm y+%k_KeyMargin% h%k_KeyHeight%, Ctrl; Auto-width.Gui, Add, Button, h%k_KeyHeight% x+%k_KeyMargin%, Win; Auto-width.Gui, Add, Button, h%k_KeyHeight% x+%k_KeyMargin%, Alt; Auto-width.Gui, Add, Button, h%k_KeyHeight% x+%k_KeyMargin% w%k_SpacebarWidth%, Space;---- Show the window:Gui, Showk_IsVisible = yWinGet, k_ID, ID, A; Get its window ID.WinGetPos,,, k_WindowWidth, k_WindowHeight, A;---- Position the keyboard at the bottom of the screen (taking into account
; the position of the taskbar):SysGet, k_WorkArea, MonitorWorkArea, %k_Monitor%; Calculate window's X-position:k_WindowX = %k_WorkAreaRight%k_WindowX -= %k_WorkAreaLeft%; Now k_WindowX contains the width of this monitor.k_WindowX -= %k_WindowWidth%k_WindowX /= 2; Calculate position to center it horizontally.
; The following is done in case the window will be on a non-primary monitor
; or if the taskbar is anchored on the left side of the screen:k_WindowX += %k_WorkAreaLeft%; Calculate window's Y-position:k_WindowY = %k_WorkAreaBottom%k_WindowY -= %k_WindowHeight%WinMove, A,, %k_WindowX%, %k_WindowY%WinSet, AlwaysOnTop, On, ahk_id %k_ID%WinSet, TransColor, %TransColor% 220, ahk_id %k_ID%;---- Set all keys as hotkeys. See www.asciitable.comk_n = 1k_ASCII = 45Loop{ Transform, k_char, Chr, %k_ASCII% StringUpper, k_char, k_char if k_char not in <,>,^,~,�,`, Hotkey, ~*%k_char%, k_KeyPress; In the above, the asterisk prefix allows the key to be detected regardless; of whether the user is holding down modifier keys such as Control and Shift.if k_ASCII = 93 break k_ASCII++}return; End of auto-execute section.;---- When a key is pressed by the user, click the corresponding button on-screen:~*Backspace::ControlClick, Bk, ahk_id %k_ID%, , LEFT, 1, DKeyWait, BackspaceControlClick, Bk, ahk_id %k_ID%, , LEFT, 1, Ureturn; LShift and RShift are used rather than "Shift" because when used as a hotkey,
; "Shift" would default to firing upon release of the key (in older AHK versions):~*LShift::~*RShift::~*LCtrl::; Must use Ctrl not Control to match button names.~*RCtrl::~*LAlt::~*RAlt::~*LWin::~*RWin::StringTrimLeft, k_ThisHotkey, A_ThisHotkey, 3ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, DKeyWait, %k_ThisHotkey%ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, Ureturn~*,::~*'::~*Space::~*Enter::~*Tab::k_KeyPress:StringReplace, k_ThisHotkey, A_ThisHotkey, ~StringReplace, k_ThisHotkey, k_ThisHotkey, *SetTitleMatchMode, 3; Prevents the T and B keys from being confused with Tab and Backspace.ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, DKeyWait, %k_ThisHotkey%ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, UReturnk_ShowHide:if k_IsVisible = y{ Gui, Cancel Menu, Tray, Rename, %k_MenuItemHide%, %k_MenuItemShow% k_IsVisible = n}else{ Gui, Show Menu, Tray, Rename, %k_MenuItemShow%, %k_MenuItemHide% k_IsVisible = y}returnGuiClose:k_MenuExit:ExitApp