52

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.

closed as off-topic by Hastur, Mokubai Jul 4 '16 at 10:26

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Questions seeking product, service, or learning material recommendations are off-topic because they become outdated quickly and attract opinion-based answers. Instead, describe your situation and the specific problem you're trying to solve. Share your research. Here are a few suggestions on how to properly ask this type of question." – Hastur, Mokubai
If this question can be reworded to fit the rules in the help center, please edit the question.

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

  • @richard you're more than welcome! – John T Feb 4 '10 at 16:46
  • 4
    I 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 May 6 '14 at 22:50
  • Doesn't register Tab keys for some reason... – laggingreflex Oct 14 '16 at 13:45
  • Doesn't register WIN combinatoins, did not show CTRL+SHIFT+ESC. Meh. – Ev0oD Oct 27 '16 at 9:46
  • 1
    Use Carnac below. I tested both and Carnac gives you various visual options. github.com/bfritscher/carnac/releases/tag/v3-beta – Kai Noack Nov 19 '17 at 7:50
13

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

  • Interesting, but not as beautiful rendering as KeyPosé. – Basj Sep 5 '17 at 19:19
  • The project page provides only a carnac.application file, the youtube video 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: github.com/downloads/Code52/carnac/Carnac.zip – Kai Noack Nov 19 '17 at 7:41
  • 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 Nov 19 '17 at 7:48
  • @KaiNoack I mean the default style of Carnac is not as stylish / minimalist as Keyposé. The default design should be improved ;) – Basj Nov 19 '17 at 10:27
  • How can I change the position of the keystroke display area? I can seem to find any documentation. – jdhao Apr 19 at 4:18
10

I would like to share my tool -- keycastow.

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

enter image description here

  • 1
    Great thing! Also LICECap is great too, didn't know about one :) – LogicDaemon Jun 28 '14 at 8:16
  • @brookhong what did you use to create the animated giff? – Ricardo C Nov 10 '15 at 17:20
  • @RicardoC It's licecap, cockos.com/licecap – brook hong Nov 11 '15 at 3:47
  • Microsoft Security Essentials classifies this as a threat. Oh well! – rath Nov 5 '16 at 11:57
  • 1
    This 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 Mar 17 '18 at 10:48
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
}
}
  • 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 Jun 26 '14 at 21:43
  • @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 Jun 27 '14 at 9:11
  • 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 Jun 27 '14 at 9:25
  • @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 Jun 28 '14 at 7:38
  • 1
    @Amina ty, I guess that's accidental move of dropbox folders by me. Will fix my post. – LogicDaemon Sep 19 '15 at 13:49
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.

  • 1
    Thanks, I tried that already, but the only modifier key that highlights is the Shift key. – richardtallent Feb 4 '10 at 15:27
  • In windows 7, type "keyboard" in the start menu search box, and select "On-Screen Keyboard" – xhafan Jun 20 '14 at 8:13
  • It doesn't for me (win 10). – NounVerber Oct 16 '17 at 18:53
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.

  • 1
    ...currently 30 USD. – miroxlav Sep 5 '17 at 19:14
1

PointerFocus can display your keystrokes.

  • 3
    currently 12.50 USD – miroxlav Sep 5 '17 at 19:15
  • Unfortunately, it cannot customize / ignore certain keys. – Basj Sep 5 '17 at 19:19
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.

  • 3
    currently 30 USD – miroxlav Sep 5 '17 at 19:16
  • 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 Jan 12 '18 at 7:18
0

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

enter image description here

FYI:

Not the answer you're looking for? Browse other questions tagged or ask your own question.