Windows utility to render which key I am pressing on-screen

53

26

I'm giving training to a large group of people remotely and will be covering a number of application shortcut keys.

I've seen MousePose's on-screen display of keystrokes; is there a similar product for Windows?

MousePose Screenshot

The other features of MousePose (fancy mouse pointers, etc.) aren't really useful to me, just the OSD of key presses.

richardtallent

Posted 2010-02-03T21:58:32.553

Reputation: 1 052

Question was closed 2016-07-04T10:26:23.873

Answers

36

KeyPosé is a free alternative to MousePosé for Windows. You can see it in action in the screencast.

Here is a sample screenshot:

alt text

John T

Posted 2010-02-03T21:58:32.553

Reputation: 149 037

@richard you're more than welcome! – John T – 2010-02-04T16:46:42.227

Doesn't register Tab keys for some reason... – laggingreflex – 2016-10-14T13:45:24.437

Doesn't register WIN combinatoins, did not show CTRL+SHIFT+ESC. Meh. – Ev0oD – 2016-10-27T09:46:14.787

This program doesn't work for me. – NounVerber – 2017-10-16T18:51:40.300

1

Use Carnac below. I tested both and Carnac gives you various visual options. https://github.com/bfritscher/carnac/releases/tag/v3-beta

– Kai Noack – 2017-11-19T07:50:23.807

KeyPosé is not configurable in any way and only displays last character typed (would be nice to see some history). Also the linked screencast requires you download a player. – Lqueryvg – 2018-03-17T10:50:44.333

1

link provided is old and to a potentially unsafe ZIP, here is the source: https://github.com/AxDSan/KeyPose

– OzBob – 2018-12-10T06:04:39.650

It does not register Windows key. – dzieciou – 2019-06-16T17:42:30.243

4I think it has some issues. You cannot change the position where you display the keys, sometimes the grey zone keeps showing even if you're not pressing a key, also the win/super key isn't displayed. Combinations which involves more than two keys pressed, like ctrl+alt+c, are displayed in a weird way, like first CTRL, then ALT (I suppose it should display CTRL+ALT) and finally CTRL+ALT+C. Is better than nothing, but I think there are better options. – Alter Lagos – 2014-05-06T22:50:53.327

14

I highly recommend Carnac. It's a free project hosted on GitHub.

A keyboard logging and presentation utility for presentations, screencasts, and to help you become a better keyboard user.

It's nicely executed, nicely designed and also open sourced on GitHub.

Screenshot

Find a fork release with fixes and visualization of the mouse input here: https://github.com/bfritscher/carnac/releases/tag/v3-beta

rburte

Posted 2010-02-03T21:58:32.553

Reputation: 495

Interesting, but not as beautiful rendering as KeyPosé. – Basj – 2017-09-05T19:19:00.077

The project page provides only a carnac.application file, the youtube video https://www.youtube.com/watch?v=qSUDfzUkwnc shows a Carnac.exe. Just later I realized that I can launch carnac.application in Windows and it downloads and installs the program. I found the zip/exe also here: https://github.com/downloads/Code52/carnac/Carnac.zip

– Kai Noack – 2017-11-19T07:41:13.893

2@Basj Carnac is much more "beautiful" than KeyPosé (which only shows the letters as plain text). With Carnac you can change the appearance of the keys shown (font size, opacity, colors). – Kai Noack – 2017-11-19T07:48:40.990

@KaiNoack I mean the default style of Carnac is not as stylish / minimalist as Keyposé. The default design should be improved ;) – Basj – 2017-11-19T10:27:55.717

How can I change the position of the keystroke display area? I can seem to find any documentation. – jdhao – 2019-04-19T04:18:32.010

@jdhao Double-click the Carnac icon in the notification area, then you can customize the location on screen. You can then save/set defaults etc. – rburte – 2019-05-16T16:58:34.143

10

I would like to share my tool -- keycastow.

https://brookhong.github.io/2014/04/28/keycast-on-windows.html

enter image description here

brook hong

Posted 2010-02-03T21:58:32.553

Reputation: 279

1Great thing! Also LICECap is great too, didn't know about one :) – LogicDaemon – 2014-06-28T08:16:28.130

@brookhong what did you use to create the animated giff? – Ricardo C – 2015-11-10T17:20:36.113

@RicardoC It's licecap, http://www.cockos.com/licecap/

– brook hong – 2015-11-11T03:47:59.037

Microsoft Security Essentials classifies this as a threat. Oh well! – rath – 2016-11-05T11:57:29.243

So does Avast. It is a false alarm, the software being open source, it can't possible hide a trojan. However running this makes the cursor jittery, and key input laggy. – FractalSpace – 2017-01-14T18:45:40.030

Chrome and Firefox are both giving me warnings for https://brookhong.github.io/2014/04/28/keycast-on-windows.html http://imgur.com/a/jcdyB, and the page does not load if I ignore the warning

– Miserable Variable – 2017-05-09T17:06:34.560

1This tool is not downloadable as a binary; you have to build it yourself which for me is an issue because I don't have permission. – Lqueryvg – 2018-03-17T10:48:58.910

I just compiled and executed it and works well!! This is great! – Vijay – 2018-10-03T11:29:48.263

5

I've written an AutoHotkey_L script for this purpose.

To run it, use AutoHotkey_L (direct dl), it's FOSS. Also, with AutoHotkey you can compile script to EXE (simply Ahk2Exe.exe /inDisplayPressedKeyOnScreen.ahk/outDisplayPressedKeyOnScreen.exe ).

It can display pressed keys OSD-like or standard Tool-tip near mouse cursor. Also, it displays mouse button clicks and wheel scrolling.

(note that frame & blurring is done for illustration purposes, the script itself only displays text w/o any disturbances) Screenshot

Heres's the script (copy and paste to notepad, save as DisplayPressedKeysOnScreen.ahk):

#NoEnv
#SingleInstance force
#InstallKeybdHook

Global KeyStates, MouseState, ClickCount, IdleDelay, LargeDisplay

IdleDelay=3000

LargeDisplay=1
; 0 = Tooltip near mouse pointer
; 1 = Big pane at screen bottom

If LargeDisplay
{
;Initializing GUI
;modded func originated from http://www.autohotkey.com/board/topic/8190-osd-function/

SysGet Monitor, Monitor

GUIx := MonitorLeft
GUIw := MonitorRight - MonitorLeft
GUIh := (MonitorBottom - MonitorTop) * GUIw * 0.00003
If (GUIh > ((MonitorBottom - MonitorTop) * 0.3))
    GUIh := (MonitorBottom - MonitorTop) * 0.3

opacity=230
fname="Tahoma"
fsize:=GUIh * 0.65 ; really, pixel = 0.75 point, but with 0.75 lowercase letter with lower part (like "g") get cut
fcolor=cccccc
bcolor=222222
fformat="600"

Gui +LastFound +AlwaysOnTop +ToolWindow -Caption
Gui Margin, 0, 0 ;pixels of space to leave at the left/right and top/bottom sides of the window when auto-positioning.
Gui Color, ffffff ;changes background color
Gui Font, s%fsize% w%fformat%, %fname%

;    0x80 = SS_NOPREFIX -> Ampersand (&) is shown instead of underline one letter for Alt+letter navigation
Gui Add, Text, c%bcolor% Center +0x80 w%GUIw% h%GUIh% BackgroundTrans VblkOsdCtrlName, tesT test test
Gui Add, Text, c%fcolor% Center +0x80 w%GUIw% h%GUIh% BackgroundTrans VblkOsdCtrlName2 xp-3 yp-3 , tesT test test

WinSet ExStyle, +0x20 ; WS_EX_TRANSPARENT -> mouse klickthrough
WinSet TransColor, ffffff %opacity%
}


TrayTip %A_ScriptName%, To Exit`, press the Right Windows logo key.

Loop
{
Input SingleKey, L1 V M I B, {LControl}{RControl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}{Ins}{BS}{Capslock}{Numlock}{PrintScreen}{Pause}
GetKeyStates()

;    IfInString ErrorLevel, EndKey
;   CollectedText .= (CollectedText =="" ? "" : " + " ) . SubStr(ErrorLevel, 8)
If SingleKey
{
    SingleKeyText=
    If (SingleKey==Chr(27))
    SingleKeyText=Esc
    Else If (SingleKey==Chr(32))
    SingleKeyText=Space

    If (GetKeyState("LControl", "P") || GetKeyState("RControl", "P"))
    {
    If (SingleKey==Chr(10) && EnterPressed)
        SingleKeyText=Enter
    Else If (SingleKey >= Chr(1) && SingleKey <= Chr(26)) ; With "M" in Input, Ctrl-A through Ctrl-Z correspond to Chr(1) through Chr(26)
        SingleKeyText := Chr(Asc("A")-1+Asc(SingleKey))
    } Else {
    If (SingleKey==Chr(10))
        SingleKeyText=Enter
    }

    If Not SingleKeyText
    SingleKeyText:=SingleKey
    ShowKeys(KeyStates . SingleKeyText)
;    . (MouseState ? "`n" . MouseState : "")
    EnterPressed=0
    GoSub ClearMouseState
} Else {
    ShowKeys(SubStr(KeyStates, 1, -3) . (MouseState ? " + " . MouseState : ""))
}
SetTimer TooltipOff, % -IdleDelay
}

RWin::
ExitApp

~*Enter::
EnterPressed=1
return

~*LButton::
~*RButton::
~*MButton::
~*XButton1::
~*XButton2::
MouseState := "Mouse " . SubStr(A_ThisHotkey, 3) . " Pressed"
MouseTooltip()
return

~*WheelDown::
~*WheelUp::
~*WheelLeft::
~*WheelRight::
MouseState := "Mouse " . SubStr(A_ThisHotkey, 3)
MouseTooltip()
return

~*LButton Up::
~*RButton Up::
~*MButton Up::
~*XButton1 Up::
~*XButton2 Up::
;    MsgBox %A_PriorHotkey%`n%A_ThisHotkey%
If (A_PriorHotkey == SubStr(A_ThisHotkey, 1, -3) && A_TimeSincePriorHotkey < 200)
{
    ClickCount++
    Suffix := " Clicked " . ClickCount . "x"
} Else {
    ClickCount:=0
    Suffix := " Released"
}
MouseState := "Mouse " . SubStr(A_ThisHotkey, 3, -3) . Suffix
MouseTooltip()
return

MouseTooltip(){
GetKeyStates()
ShowKeys(KeyStates . MouseState)
SetTimer ClearMouseState,  % -IdleDelay
SetTimer TooltipOff, % -IdleDelay
}

ClearMouseState:
MouseState=
ClickCount=0
return
TooltipOff:
If LargeDisplay
    Gui Hide
Else
    Tooltip
return

GetKeyStates() {
KeyStates := ""
    . ( GetKeyState("LControl", "P") ? "LControl + " : "" )
    . ( GetKeyState("RControl", "P") ? "RControl + " : "" )
    . ( GetKeyState("LAlt", "P") ? "LAlt + " : "" )
    . ( GetKeyState("RAlt", "P") ? "RAlt + " : "" )
    . ( GetKeyState("LShift", "P") ? "LShift + " : "" )
    . ( GetKeyState("RShift", "P") ? "RShift + " : "" )
    . ( GetKeyState("LWin", "P") ? "LWin + " : "" )
    . ( GetKeyState("AppsKey", "P") ? "AppsKey + " : "" )
    . ( GetKeyState("F1", "P") ? "F1 + " : "" )
    . ( GetKeyState("F2", "P") ? "F2 + " : "" )
    . ( GetKeyState("F3", "P") ? "F3 + " : "" )
    . ( GetKeyState("F4", "P") ? "F4 + " : "" )
    . ( GetKeyState("F5", "P") ? "F5 + " : "" )
    . ( GetKeyState("F6", "P") ? "F6 + " : "" )
    . ( GetKeyState("F7", "P") ? "F7 + " : "" )
    . ( GetKeyState("F8", "P") ? "F8 + " : "" )
    . ( GetKeyState("F9", "P") ? "F9 + " : "" )
    . ( GetKeyState("F10", "P") ? "F10 + " : "" )
    . ( GetKeyState("F11", "P") ? "F11 + " : "" )
    . ( GetKeyState("F12", "P") ? "F12 + " : "" )
    . ( GetKeyState("Left", "P") ? "Left + " : "" )
    . ( GetKeyState("Right", "P") ? "Right + " : "" )
    . ( GetKeyState("Up", "P") ? "Up + " : "" )
    . ( GetKeyState("Down", "P") ? "Down + " : "" )
    . ( GetKeyState("Home", "P") ? "Home + " : "" )
    . ( GetKeyState("End", "P") ? "End + " : "" )x
    . ( GetKeyState("PgUp", "P") ? "PgUp + " : "" )
    . ( GetKeyState("PgDn", "P") ? "PgDn + " : "" )
    . ( GetKeyState("Del", "P") ? "Del + " : "" )
    . ( GetKeyState("Ins", "P") ? "Ins + " : "" )
    . ( GetKeyState("BS", "P") ? "BS + " : "" )
    . ( GetKeyState("Capslock", "P") ? "Capslock + " : "" )
    . ( GetKeyState("Numlock", "P") ? "Numlock + " : "" )
    . ( GetKeyState("PrintScreen", "P") ? "PrintScreen + " : "" )
    . ( GetKeyState("Pause", "P") ? "Pause + " : "" )
}

ShowKeys(text) {
If LargeDisplay
{
    Global blkOsdCtrlName, blkOsdCtrlName2, MonitorLeft, MonitorRight, MonitorBottom, MonitorTop, GUIx, GUIy, GUIh

    CoordMode Mouse, Screen
    MouseGetPos MouseX, MouseY

    If ((!GUIy) || (MouseX >= MonitorLeft && MouseX <= MonitorRight && MouseY >= GUIy && MouseY <= (GUIy+GUIh)) ) {
    If (MouseY < (MonitorTop + (MonitorBottom - MonitorTop) / 2) )
        GUIy := MonitorBottom - (MonitorBottom - MonitorTop) * 0.2
    Else
        GUIy := MonitorTop + (MonitorBottom - MonitorTop) * 0.2
    }

    GuiControl Text, blkOsdCtrlName, %text%
    GuiControl Text, blkOsdCtrlName2, %text%

    Gui, Show, x%GUIx% y%GUIy% NoActivate
} Else {
    Tooltip % text
}
}

LogicDaemon

Posted 2010-02-03T21:58:32.553

Reputation: 1 681

I tried to start "DisplayPressedKeyOnScreen.exe" on Win7 64bit. I get the error message Windows cannot access the specified device, path, or file. You may not have the appropriate permissions to access the item. Is the exe-file a standalone? Or do I have to install AutoHotkey beforehand? – Kai Noack – 2014-06-26T21:43:25.120

@EchtEinfachTV I'm sure it's standalone. Also, I just downloaded and successfully launched it on Win 8.1 32-bit. Can we compare MD5? Mine is d788516439ed743b3553eb3ae7b9082c, and file size is 332 288 bytes. – LogicDaemon – 2014-06-27T09:11:19.797

The file that I downloaded from your link above shows me MD5: D788516439ED743B3553EB3AE7B9082C and file size 332 288. So it should be the exact same file. It is also weird that after the error message in Windows 7, the virus scanner Panda Cloud popped up, moving the 'malicious' file to quarantine.

– Kai Noack – 2014-06-27T09:25:50.017

@EchtEinfachTV then apparently it's antivirus denied access to file when you tried to launch it, that's why you received Windows message that you can't access it. Though I dunno why it blocks, you can check: it's standard autohotkey binary joined with plaintext (but reformatted) script source. – LogicDaemon – 2014-06-28T07:38:50.740

@EchtEinfachTV sorry, it's not plaintext. It's compreseed with mpress, which was included with AutoHotkey. Anyway, you can dowload standalone autohotkey binary (exe.zip) and drag-and-drop script on it to launch, just to see if that script will fit you. If so, you can either to keep it this way (just create a shortcut with «"path-to-ahk\autohotkey.exe" "path-to-script\script.ahk"» in "Object" field) or compile it yourself (takes 1 min to dl & install autohotkey and 5 sec to compile).

– LogicDaemon – 2014-06-28T07:59:16.870

Dropbox removed it. – Aminadav Glickshtein – 2015-09-10T11:12:40.330

1@Amina ty, I guess that's accidental move of dropbox folders by me. Will fix my post. – LogicDaemon – 2015-09-19T13:49:48.123

Can this AHK script be amended so that it track artifical keyboard entry, from say WinController Android App? I looked in the AHK docs but could not find anything. – Steve Waring – 2017-05-26T18:36:15.443

@SteveWaring currently, to get pressed key, it uses Input operator, docs on which say: «by default, artificial input is also captured». Replace «Input SingleKey, L1 V M I B,» to «Input SingleKey, L1 V M B,», it should work.

– LogicDaemon – 2017-05-27T04:36:22.820

@SteveWaring also, remove «, "P"» from each GetKeyState. For example: «GetKeyState("LControl", "P")» → «GetKeyState("RControl")» – LogicDaemon – 2017-05-27T04:39:50.080

Is there anyway to make this a function that shows text passed into the function so it can be used in my own scripts to show window of action my script performs on screen – JasonDavis – 2018-01-12T17:52:40.547

@JasonDavis actually display is done by function, ShowKeys(). It needs init though, that's in auto-execute section of the script inside If LargeDisplay {…} block. – LogicDaemon – 2018-01-12T21:09:32.127

2

You can use the on screen keyboard to show key presses that comes with windows. When you type on your physical keyboard the on screen one highlights said key.

Unfundednut

Posted 2010-02-03T21:58:32.553

Reputation: 6 650

In windows 7, type "keyboard" in the start menu search box, and select "On-Screen Keyboard" – xhafan – 2014-06-20T08:13:13.487

1Thanks, I tried that already, but the only modifier key that highlights is the Shift key. – richardtallent – 2010-02-04T15:27:19.537

It doesn't for me (win 10). – NounVerber – 2017-10-16T18:53:04.913

1

PointerFocus can display your keystrokes.

Dan

Posted 2010-02-03T21:58:32.553

Reputation: 11

3currently 12.50 USD – miroxlav – 2017-09-05T19:15:17.560

Unfortunately, it cannot customize / ignore certain keys. – Basj – 2017-09-05T19:19:49.183

1

Presentation Pointer is a best alternative to MousePosé for Windows. It provides Pointer Effect, Mouse Clicks Effect, Keystrokes and even allows you to draw freely on the screen but not lock the screen. That's really an advantage of the program.

Garvey

Posted 2010-02-03T21:58:32.553

Reputation: 11

1...currently 30 USD. – miroxlav – 2017-09-05T19:14:23.953

1

I have written a small Windows app called QiPress. It has controls to change the look-n-feel, display or ignore certain key-groups, even add static text (your own name or company name for example). Positioning is possible by disabling click-through and click-dragging the pop-up. There are other features which you probably may not require, but it covers mostly what you want.

aalapshah

Posted 2010-02-03T21:58:32.553

Reputation: 11

3currently 30 USD – miroxlav – 2017-09-05T19:16:13.970

To clarify on the versions: Free Version: For personal, non-commercial use. Some advanced features disabled (like various language keyboards, multiple monitors, joystick display etc.). No time limitation. Paid Version: For all uses. All advanced features enabled. No time limitation. – aalapshah – 2018-01-12T07:18:05.527

0

You can use PassMark KeyboardTest (Free 30 day evaluation, then US$24.00 to purchase.)

enter image description here

FYI:

Franck Dernoncourt

Posted 2010-02-03T21:58:32.553

Reputation: 13 518