Browse Source

Allow F13 to F24 and other keys to be shown in UI for hotkeys (#861)

* Sort function key names alphabetically

* Sort new function key entries

* Fix F-key order for binary search

* Handle extended hotkeys
Christian Kleineidam 5 months ago
parent
commit
8213ef036b
4 changed files with 66 additions and 7 deletions
  1. 36 3
      src/HotKeys.cpp
  2. 1 1
      src/Misc.cpp
  3. 28 2
      src/SendKeys.cpp
  4. 1 1
      src/SendKeys.h

+ 36 - 3
src/HotKeys.cpp

@@ -86,7 +86,40 @@ CString CHotKey::GetHotKeyDisplayStatic(DWORD dwHotKey)
 //http://www.ffuts.org/blog/mapvirtualkey-getkeynametext-and-a-story-of-how-to/
 CString CHotKey::GetVirKeyName(unsigned int virtualKey)
 {
-	unsigned int scanCode = MapVirtualKey(virtualKey, MAPVK_VK_TO_VSC);
+       // MapVirtualKey/GetKeyNameText does not return a name for F13-F24
+       // even though these keys can be registered as global hotkeys.  If we
+       // detect one of these virtual key codes then manually return the
+       // appropriate string.
+       if(virtualKey >= VK_F13 && virtualKey <= VK_F24)
+       {
+               return StrF(_T("F%d"), (virtualKey - VK_F1) + 1);
+       }
+
+       // Provide friendly names for multimedia and browser keys which
+       // otherwise return an empty string from GetKeyNameText.
+       switch (virtualKey)
+       {
+       case VK_VOLUME_MUTE:       return _T("Volume Mute");
+       case VK_VOLUME_DOWN:       return _T("Volume Down");
+       case VK_VOLUME_UP:         return _T("Volume Up");
+       case VK_MEDIA_NEXT_TRACK:  return _T("Next Track");
+       case VK_MEDIA_PREV_TRACK:  return _T("Prev Track");
+       case VK_MEDIA_PLAY_PAUSE:  return _T("Play/Pause");
+       case VK_MEDIA_STOP:        return _T("Stop");
+       case VK_BROWSER_BACK:      return _T("Browser Back");
+       case VK_BROWSER_FORWARD:   return _T("Browser Forward");
+       case VK_BROWSER_REFRESH:   return _T("Browser Refresh");
+       case VK_BROWSER_STOP:      return _T("Browser Stop");
+       case VK_BROWSER_SEARCH:    return _T("Browser Search");
+       case VK_BROWSER_FAVORITES: return _T("Browser Favorites");
+       case VK_BROWSER_HOME:      return _T("Browser Home");
+       case VK_LAUNCH_MAIL:       return _T("Launch Mail");
+       case VK_LAUNCH_MEDIA_SELECT: return _T("Launch Media");
+       case VK_LAUNCH_APP1:       return _T("Launch App1");
+       case VK_LAUNCH_APP2:       return _T("Launch App2");
+       }
+
+       unsigned int scanCode = MapVirtualKey(virtualKey, MAPVK_VK_TO_VSC);
 
 	// because MapVirtualKey strips the extended bit for some keys
 	switch (virtualKey)
@@ -109,8 +142,8 @@ CString CHotKey::GetVirKeyName(unsigned int virtualKey)
 		}
 	}
 
-	wchar_t keyName[50];
-	if (GetKeyNameText(scanCode << 16, keyName, sizeof(keyName)) != 0)
+       wchar_t keyName[50];
+       if (GetKeyNameText(scanCode << 16, keyName, _countof(keyName)) != 0)
 	{
 		return keyName;
 	}

+ 1 - 1
src/Misc.cpp

@@ -218,7 +218,7 @@ CString RemoveEscapes( const TCHAR* str )
 		if( *pSrc == '\\' )
 		{
 			pSrc++;
-			*pDest = GetEscapeChar((BYTE)pSrc );
+                       *pDest = GetEscapeChar((BYTE)*pSrc );
 		}
 		else
 			*pDest = *pSrc;

+ 28 - 2
src/SendKeys.cpp

@@ -102,6 +102,13 @@ CSendKeys::key_desc_t CSendKeys::KeyNames[CSendKeys::MaxSendKeysRecs] =
   {_T("BACKSPACE"), VK_BACK},
   {_T("BKSP"), VK_BACK},
   {_T("BREAK"), VK_CANCEL},
+  {_T("BROWSER_BACK"), VK_BROWSER_BACK},
+  {_T("BROWSER_FAVORITES"), VK_BROWSER_FAVORITES},
+  {_T("BROWSER_FORWARD"), VK_BROWSER_FORWARD},
+  {_T("BROWSER_HOME"), VK_BROWSER_HOME},
+  {_T("BROWSER_REFRESH"), VK_BROWSER_REFRESH},
+  {_T("BROWSER_SEARCH"), VK_BROWSER_SEARCH},
+  {_T("BROWSER_STOP"), VK_BROWSER_STOP},
   {_T("BS"), VK_BACK},
   {_T("CAPSLOCK"), VK_CAPITAL},
   {_T("CARET"), '^', true},
@@ -123,7 +130,15 @@ CSendKeys::key_desc_t CSendKeys::KeyNames[CSendKeys::MaxSendKeysRecs] =
   {_T("F14"), VK_F14},
   {_T("F15"), VK_F15},
   {_T("F16"), VK_F16},
+  {_T("F17"), VK_F17},
+  {_T("F18"), VK_F18},
+  {_T("F19"), VK_F19},
   {_T("F2"), VK_F2},
+  {_T("F20"), VK_F20},
+  {_T("F21"), VK_F21},
+  {_T("F22"), VK_F22},
+  {_T("F23"), VK_F23},
+  {_T("F24"), VK_F24},
   {_T("F3"), VK_F3},
   {_T("F4"), VK_F4},
   {_T("F5"), VK_F5},
@@ -137,8 +152,16 @@ CSendKeys::key_desc_t CSendKeys::KeyNames[CSendKeys::MaxSendKeysRecs] =
   {_T("LEFT"), VK_LEFT},
   {_T("LEFTBRACE"), '{', true},
   {_T("LEFTPAREN"), '(', true},
+  {_T("LAUNCH_APP1"), VK_LAUNCH_APP1},
+  {_T("LAUNCH_APP2"), VK_LAUNCH_APP2},
+  {_T("LAUNCH_MAIL"), VK_LAUNCH_MAIL},
+  {_T("LAUNCH_MEDIA_SELECT"), VK_LAUNCH_MEDIA_SELECT},
   {_T("LWIN"), VK_LWIN},
-  {_T("MULTIPLY"), VK_MULTIPLY}, 
+  {_T("MEDIA_NEXT_TRACK"), VK_MEDIA_NEXT_TRACK},
+  {_T("MEDIA_PLAY_PAUSE"), VK_MEDIA_PLAY_PAUSE},
+  {_T("MEDIA_PREV_TRACK"), VK_MEDIA_PREV_TRACK},
+  {_T("MEDIA_STOP"), VK_MEDIA_STOP},
+  {_T("MULTIPLY"), VK_MULTIPLY},
   {_T("NUMLOCK"), VK_NUMLOCK},
   {_T("NUMPAD0"), VK_NUMPAD0}, 
   {_T("NUMPAD1"), VK_NUMPAD1}, 
@@ -164,8 +187,11 @@ CSendKeys::key_desc_t CSendKeys::KeyNames[CSendKeys::MaxSendKeysRecs] =
   {_T("SNAPSHOT"), VK_SNAPSHOT},
   {_T("SUBTRACT"), VK_SUBTRACT}, 
   {_T("TAB"), VK_TAB},
-  {_T("TILDE"), '~', true}, 
+  {_T("TILDE"), '~', true},
   {_T("UP"), VK_UP},
+  {_T("VOLUME_DOWN"), VK_VOLUME_DOWN},
+  {_T("VOLUME_MUTE"), VK_VOLUME_MUTE},
+  {_T("VOLUME_UP"), VK_VOLUME_UP},
   {_T("WIN"), VK_LWIN}
 };
 

+ 1 - 1
src/SendKeys.h

@@ -30,7 +30,7 @@ private:
 
   enum
   {
-    MaxSendKeysRecs  = 71,
+    MaxSendKeysRecs  = 79,
     MaxExtendedVKeys = 12
   };