From e18ef766ca0b59c50757e881e65a658dc9e0b38c Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Sun, 26 Mar 2023 20:08:53 +0100 Subject: [PATCH 01/10] Linux - Add icons --- src/Artemis.UI.Linux/Artemis.UI.Linux.csproj | 3 +++ .../Icons/128x128/apps/artemis.png | Bin 0 -> 5981 bytes .../Icons/16x16/apps/artemis.png | Bin 0 -> 518 bytes .../Icons/256x256/apps/artemis.png | Bin 0 -> 12986 bytes .../Icons/32x32/apps/artemis.png | Bin 0 -> 1185 bytes .../Icons/48x48/apps/artemis.png | Bin 0 -> 1986 bytes .../Icons/64x64/apps/artemis.png | Bin 0 -> 2737 bytes 7 files changed, 3 insertions(+) create mode 100644 src/Artemis.UI.Linux/Icons/128x128/apps/artemis.png create mode 100644 src/Artemis.UI.Linux/Icons/16x16/apps/artemis.png create mode 100644 src/Artemis.UI.Linux/Icons/256x256/apps/artemis.png create mode 100644 src/Artemis.UI.Linux/Icons/32x32/apps/artemis.png create mode 100644 src/Artemis.UI.Linux/Icons/48x48/apps/artemis.png create mode 100644 src/Artemis.UI.Linux/Icons/64x64/apps/artemis.png diff --git a/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj index 7d19d5e97..e93cdd4f2 100644 --- a/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj +++ b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj @@ -27,4 +27,7 @@ + + + \ No newline at end of file diff --git a/src/Artemis.UI.Linux/Icons/128x128/apps/artemis.png b/src/Artemis.UI.Linux/Icons/128x128/apps/artemis.png new file mode 100644 index 0000000000000000000000000000000000000000..01b8149d510b7d409e32ecbcfce5ceda0569a172 GIT binary patch literal 5981 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 LNkvXXu0mjfI;=$M literal 0 HcmV?d00001 diff --git a/src/Artemis.UI.Linux/Icons/16x16/apps/artemis.png b/src/Artemis.UI.Linux/Icons/16x16/apps/artemis.png new file mode 100644 index 0000000000000000000000000000000000000000..00d10d10d22dfbeffbca27c53212ef8a9af25d80 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf{{Wv5S0F7cEG&uyfLt*!fQUob zKzSeoAtEj=DlN^_R>d%(iLt$kJv~;?NKZswPEN?7)+sYYvn1?YJrishS zNr}sdi-~zE%5`d+FEdJ5Wn5z-Yrq~G!f#=$Eh9Bk-}t&!Y>!^Fx1s}&y91A#eS^Nn zJbg2DDVc-jeVS5gJT7+Ju6D|j3g@hra0GernHj1}DK9ae$dVK;A}hn`=f-PeCMGV{ zbEe@EC|pW{{DK+ucYOQ4+xYW0(*wW%9R6Wx)akqxD7Vbh#W6(UvhVqDv8DhXmJ13i z8Z?gFv;KCk`n_!F|7^jQff~)7vyY7Y1wGaprIahs3;-0{dzhV|CU?-91KLR z9b}z!Yhs4ZJdY%;xsF#9W}j9*)ta=j$0}si)~dxfv&wg|C9JoX=sPx9Q)tFn@zbK~ z%++$re;*d~PZt)@4?lAIE>pkyDgCGXJUc)By%@z{&G>ZnR%w|vUoHDN4t&(x#FZyl Y*XkwlOg6!CI?%-op00i_>zopr08vDnHUIzs literal 0 HcmV?d00001 diff --git a/src/Artemis.UI.Linux/Icons/256x256/apps/artemis.png b/src/Artemis.UI.Linux/Icons/256x256/apps/artemis.png new file mode 100644 index 0000000000000000000000000000000000000000..22bc95aa351879daa2f229c660e689e85861d9dd GIT binary patch literal 12986 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 literal 0 HcmV?d00001 diff --git a/src/Artemis.UI.Linux/Icons/32x32/apps/artemis.png b/src/Artemis.UI.Linux/Icons/32x32/apps/artemis.png new file mode 100644 index 0000000000000000000000000000000000000000..6434edb8e306d729441c4083e0d4b155a0d1e9d5 GIT binary patch literal 1185 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 U`}@i?#sB~S07*qoM6N<$f}gkaSpWb4 literal 0 HcmV?d00001 diff --git a/src/Artemis.UI.Linux/Icons/64x64/apps/artemis.png b/src/Artemis.UI.Linux/Icons/64x64/apps/artemis.png new file mode 100644 index 0000000000000000000000000000000000000000..bc81ba29079a15b1986998afb6c02c5245cb6e6b GIT binary patch literal 2737 zcmV;i3QqNjP)fE^(&92dDThWrQHp*T|`=1wk^w}EflSUSg~|rm)AbTYPAKi z+6A)Cv zIT*+BZ#>U?)c5^?#oWB$WNNBAe&|2qx-+%U;1f>dJyNF);LT3cHO#nr|DP%IX2(~jfZ zw_M<3H;Hi^jHPQ9HmD-Y9-`tmB>}c=ze6jfc3f1X)zeAgp4$n#Ixq zfumg4{j8L7Nj5+jLv&3$VMqIUS6`T!1l5VDU&kpIf6FGqt`4kIBS=5Elv@Ci%jJwx zYU!gWNu}?4Vke2ppFtK&$e>!on6QY`DWdi)VRr}BH9f@1L<0fLAV&mM(z~7^`NGjl zN5VxDa6vjJ2-fuA_g#;_c|AsodC72o{{rc!pM`k-G+qmfPTd1Sfspm42x5;h|9BG< zFw)elM6DUBCSY}9Q^Tr9_4f4XZ&9d@T(}c+UH4N`E{%uo zl;W{>xAC^?T;8?bWlJi--qCP%tT4Ddw}0I+Mw=aE4VWdxg@1Xffd zfU2myh6*igu1&P^I=73vGuLrf%LWQj#JZIW5tkv+ds}151!%P&J_2zXV{)_5s|@%!&4O1t$45$wU2N$-BHdA7hpvOUwr$2zuglhs3vOH|(y2F*xZ;!9&c;nx$t zKX+_!>J{Qm>!uQ=FqdsE8*nb^bzT0ca|5^AbAg8_9xm+Vo3HFd8;fo3_4JotoS%TP zJpRUOrwn0~axq#V!l*e3Sd&cfv5s!up6UYA2;89Q4`1c8r*|<>I?X+;H}luI`}p9A z|2(&=I#ZZcae~-&P?N>xA|PjL{;oU6d)zEKc8H9wTlQKj0{@-g!w<)vXLTaSf35u> z+nufaU}85D;pDjk!*XR#tuap8%|*b6*R}J}TpQ^?VXCSDxIy!)$|*i~dM_h>iFfB- z&xdn&p-B^=`S}6`3{kDlDYP1`n#Ts*)1BsDy4w)Ggh(_1KN*Mo$LRmDb7B~PluGi^ z+#Au@L}>c`VNUuBl*Z>PvoF)pq-7ysUBas8rC^N2psAwxZef_OzH*duIGv^4n%;y( zVoF1vDIHu?`F&f96oW3fj$DlIs6m~EM}`mz!<&lXs$thYO1#_Eq$ z7njF}*R;)8ebD2RS4Jc_TUJ{+4AzteOvVdmbS7a@ZO=BiL2GP$`O5Q`l7J4~)?fe^ zW5)coJvEOv!wXm=V^^jIwCR=x0xawWa#g6TU)!+ys#Hc#OkSB9V2MNn0ZExUZ~tIb z7g5HYeqdq@_VM9mozo>H;K{;%BBm=uk5BGAPw*otZ`(ZMaD_pHA<5$>mvv5;{NZSy z+sk(MH5{xAvbXr#bM`CuZN}TQt`_yx_kQx|3Eci8%T7S7lxnIIV%5$ZlYe?sZGv_1 z!Vk#q+_UUwizKx_8#Ij=OHLmm8d<|J8B^iyHm_STk`mj0{oq%5UU=`GUt{edWo_FQe?qbM3Gl}b-YfFKCI zaJ3N-hT)f~ow2BGz4rF@r?l2@xJp+4Xg;66!5C9H8wwlG^F9#AacQN4H^xN1@4w#| zQ)$QrJkLAi`~C-vF=izb;QRh3i^bxv&%SR+0)ilTUTd9KO1*g{{(-{x{Vz>UPX7DM z&(u7fo>fY{q?Gz|A%tE*YX6DZ;O8Zvt_cT#N2QdvNGW@+bc0u^R30c43O_hU&E>qJ zGMUVKEz5dHYu$UL`S~ymzdSiP`Hiy%Zz%*!^>bZ!hi%*U3n6w0A^N10PP3Q^V+?T| r2gaB~#+cs(LGVbaRC)qfFn#=gy6^&3!Jg6j00000NkvXXu0mjfiqTge literal 0 HcmV?d00001 From 0c1160eb62dab92831a9d15845ea17979ed9bec1 Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Sun, 26 Mar 2023 22:06:01 +0100 Subject: [PATCH 02/10] Linux - Added update script I need this on my linux machine :) --- .../ApplicationStateManager.cs | 34 ++++++++++ src/Artemis.UI.Linux/Artemis.UI.Linux.csproj | 1 + src/Artemis.UI.Linux/Scripts/update.sh | 68 +++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 src/Artemis.UI.Linux/Scripts/update.sh diff --git a/src/Artemis.UI.Linux/ApplicationStateManager.cs b/src/Artemis.UI.Linux/ApplicationStateManager.cs index 997c19ef3..2a57426a3 100644 --- a/src/Artemis.UI.Linux/ApplicationStateManager.cs +++ b/src/Artemis.UI.Linux/ApplicationStateManager.cs @@ -29,6 +29,7 @@ public class ApplicationStateManager Core.Utilities.ShutdownRequested += UtilitiesOnShutdownRequested; Core.Utilities.RestartRequested += UtilitiesOnRestartRequested; + Core.Utilities.UpdateRequested += UtilitiesOnUpdateRequested; // On OS shutdown dispose the IOC container just so device providers get a chance to clean up if (Application.Current?.ApplicationLifetime is IControlledApplicationLifetime controlledApplicationLifetime) @@ -138,4 +139,37 @@ public class ApplicationStateManager //todo } + + private void UtilitiesOnUpdateRequested(object? sender, UpdateEventArgs e) + { + List argsList = new(StartupArguments); + if (e.Silent && !argsList.Contains("--minimized")) + argsList.Add("--minimized"); + + // Retain startup arguments after update by providing them to the script + string script = Path.Combine(Constants.UpdatingFolder, "installing", "Scripts", "update.sh"); + string source = $"\"{Path.Combine(Constants.UpdatingFolder, "installing")}\""; + string destination = $"\"{Constants.ApplicationFolder}\""; + string args = argsList.Any() ? $"\"'{string.Join(' ', argsList)}'\"" : ""; + + RunScriptWithOutputFile(script, $"{source} {destination} {args}", Path.Combine(Constants.DataFolder, "update-log.txt")); + + // Lets try a graceful shutdown, PowerShell will kill if needed + if (Application.Current?.ApplicationLifetime is IControlledApplicationLifetime controlledApplicationLifetime) + Dispatcher.UIThread.Post(() => controlledApplicationLifetime.Shutdown()); + } + + private void RunScriptWithOutputFile(string script, string arguments, string outputFile) + { + // Use > for files that are bigger than 200kb to start fresh, otherwise use >> to append + string redirectSymbol = File.Exists(outputFile) && new FileInfo(outputFile).Length > 200000 ? ">" : ">>"; + ProcessStartInfo info = new() + { + Arguments = $"\"{script}\" {arguments} {redirectSymbol} \"{outputFile}\"", + FileName = "/bin/bash", + WindowStyle = ProcessWindowStyle.Hidden, + CreateNoWindow = true, + }; + Process.Start(info); + } } \ No newline at end of file diff --git a/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj index e93cdd4f2..3d48d5686 100644 --- a/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj +++ b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj @@ -29,5 +29,6 @@ + \ No newline at end of file diff --git a/src/Artemis.UI.Linux/Scripts/update.sh b/src/Artemis.UI.Linux/Scripts/update.sh new file mode 100644 index 000000000..db79c50fb --- /dev/null +++ b/src/Artemis.UI.Linux/Scripts/update.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +# This script is used to update Artemis on Linux. +# Arguments: +# $1 = sourceDirectory, the directory where the new files are located +# $2 = destinationDirectory, the directory where the old files are located +# $3 = artemisArgs, the arguments to pass to the Artemis executable + +sourceDirectory=$1 +destinationDirectory=$2 +artemisArgs=$3 + +echo "sourceDirectory $sourceDirectory" +echo "destinationDirectory $destinationDirectory" +echo "artemisArgs $artemisArgs" +exit 0 + +# Wait for up to 10 seconds for the Artemis process to exit +i=0 +while [ $i -le 10 ] +do + if ! pgrep -x "Artemis.UI.Linux" > /dev/null + then + break + fi + sleep 1 + i=$((i+1)) +done + +# If the Artemis process is still running, kill it +if pgrep -x "Artemis.UI.Linux" > /dev/null +then + pkill -x "Artemis.UI.Linux" +fi + +# Check if the destination directory exists +if [ ! -d "$destinationDirectory" ] +then + echo "Destination directory does not exist" + exit 1 +fi + +# Clear the destination directory but don't remove it +echo "Cleaning up old version where needed" +rm -rf "{$destinationDirectory:?}/"* + +# Move the contents of the source directory to the destination directory +echo "Installing new files" +mv "$sourceDirectory"/* "$destinationDirectory" + +# Remove the now empty source directory +rmdir "$sourceDirectory" + +echo "Finished! Restarting Artemis" +sleep 1 + +# When finished, start Artemis again + +# If the user has specified arguments, pass them to the executable +if [ -z "$artemisArgs" ] +then + "$1/Artemis.UI.Linux" & +else + "$1/Artemis.UI.Linux" "$artemisArgs" & +fi + + + From 40eb66497f9bd16668fe799ec3ed491e4d23e48d Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Sun, 26 Mar 2023 22:47:49 +0100 Subject: [PATCH 03/10] Linux - update script fixes --- src/Artemis.UI.Linux/Scripts/update.sh | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/Artemis.UI.Linux/Scripts/update.sh b/src/Artemis.UI.Linux/Scripts/update.sh index db79c50fb..315a1816e 100644 --- a/src/Artemis.UI.Linux/Scripts/update.sh +++ b/src/Artemis.UI.Linux/Scripts/update.sh @@ -10,11 +10,6 @@ sourceDirectory=$1 destinationDirectory=$2 artemisArgs=$3 -echo "sourceDirectory $sourceDirectory" -echo "destinationDirectory $destinationDirectory" -echo "artemisArgs $artemisArgs" -exit 0 - # Wait for up to 10 seconds for the Artemis process to exit i=0 while [ $i -le 10 ] @@ -42,7 +37,7 @@ fi # Clear the destination directory but don't remove it echo "Cleaning up old version where needed" -rm -rf "{$destinationDirectory:?}/"* +rm -rf "${destinationDirectory:?}/"* # Move the contents of the source directory to the destination directory echo "Installing new files" @@ -59,9 +54,9 @@ sleep 1 # If the user has specified arguments, pass them to the executable if [ -z "$artemisArgs" ] then - "$1/Artemis.UI.Linux" & + "$destinationDirectory/Artemis.UI.Linux" & else - "$1/Artemis.UI.Linux" "$artemisArgs" & + "$destinationDirectory/Artemis.UI.Linux" "$artemisArgs" & fi From 0f61ad8c7ba12f7ec23660843cf1a88f32af7560 Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Sun, 26 Mar 2023 23:12:43 +0100 Subject: [PATCH 04/10] Linux - Ensure the executable can execute --- src/Artemis.UI.Linux/ApplicationStateManager.cs | 2 +- src/Artemis.UI.Linux/Scripts/update.sh | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Artemis.UI.Linux/ApplicationStateManager.cs b/src/Artemis.UI.Linux/ApplicationStateManager.cs index 2a57426a3..dd4ae179a 100644 --- a/src/Artemis.UI.Linux/ApplicationStateManager.cs +++ b/src/Artemis.UI.Linux/ApplicationStateManager.cs @@ -150,7 +150,7 @@ public class ApplicationStateManager string script = Path.Combine(Constants.UpdatingFolder, "installing", "Scripts", "update.sh"); string source = $"\"{Path.Combine(Constants.UpdatingFolder, "installing")}\""; string destination = $"\"{Constants.ApplicationFolder}\""; - string args = argsList.Any() ? $"\"'{string.Join(' ', argsList)}'\"" : ""; + string args = argsList.Any() ? $"\"{string.Join(' ', argsList)}\"" : ""; RunScriptWithOutputFile(script, $"{source} {destination} {args}", Path.Combine(Constants.DataFolder, "update-log.txt")); diff --git a/src/Artemis.UI.Linux/Scripts/update.sh b/src/Artemis.UI.Linux/Scripts/update.sh index 315a1816e..f8b47c72c 100644 --- a/src/Artemis.UI.Linux/Scripts/update.sh +++ b/src/Artemis.UI.Linux/Scripts/update.sh @@ -1,11 +1,5 @@ #!/bin/bash -# This script is used to update Artemis on Linux. -# Arguments: -# $1 = sourceDirectory, the directory where the new files are located -# $2 = destinationDirectory, the directory where the old files are located -# $3 = artemisArgs, the arguments to pass to the Artemis executable - sourceDirectory=$1 destinationDirectory=$2 artemisArgs=$3 @@ -46,6 +40,9 @@ mv "$sourceDirectory"/* "$destinationDirectory" # Remove the now empty source directory rmdir "$sourceDirectory" +# Ensure the executable is executable +chmod +x "$destinationDirectory/Artemis.UI.Linux" + echo "Finished! Restarting Artemis" sleep 1 From d9a60036d9d2db9a339a2079fa5e3b49057e720c Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Sun, 26 Mar 2023 23:46:32 +0100 Subject: [PATCH 05/10] Linux - always overwrite update log Also i need a new build to test :) --- src/Artemis.UI.Linux/ApplicationStateManager.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Artemis.UI.Linux/ApplicationStateManager.cs b/src/Artemis.UI.Linux/ApplicationStateManager.cs index dd4ae179a..41b999a65 100644 --- a/src/Artemis.UI.Linux/ApplicationStateManager.cs +++ b/src/Artemis.UI.Linux/ApplicationStateManager.cs @@ -154,18 +154,16 @@ public class ApplicationStateManager RunScriptWithOutputFile(script, $"{source} {destination} {args}", Path.Combine(Constants.DataFolder, "update-log.txt")); - // Lets try a graceful shutdown, PowerShell will kill if needed + // Lets try a graceful shutdown, the script will kill if needed if (Application.Current?.ApplicationLifetime is IControlledApplicationLifetime controlledApplicationLifetime) Dispatcher.UIThread.Post(() => controlledApplicationLifetime.Shutdown()); } - private void RunScriptWithOutputFile(string script, string arguments, string outputFile) + private static void RunScriptWithOutputFile(string script, string arguments, string outputFile) { - // Use > for files that are bigger than 200kb to start fresh, otherwise use >> to append - string redirectSymbol = File.Exists(outputFile) && new FileInfo(outputFile).Length > 200000 ? ">" : ">>"; ProcessStartInfo info = new() { - Arguments = $"\"{script}\" {arguments} {redirectSymbol} \"{outputFile}\"", + Arguments = $"\"{script}\" {arguments} > \"{outputFile}\"", FileName = "/bin/bash", WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, From 8fc296a4c511dbd90096af6d7d994a59a0983777 Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Mon, 27 Mar 2023 00:07:39 +0100 Subject: [PATCH 06/10] Linux - fixed passed arguments --- src/Artemis.UI.Linux/ApplicationStateManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Artemis.UI.Linux/ApplicationStateManager.cs b/src/Artemis.UI.Linux/ApplicationStateManager.cs index 41b999a65..e580f5fdf 100644 --- a/src/Artemis.UI.Linux/ApplicationStateManager.cs +++ b/src/Artemis.UI.Linux/ApplicationStateManager.cs @@ -150,7 +150,7 @@ public class ApplicationStateManager string script = Path.Combine(Constants.UpdatingFolder, "installing", "Scripts", "update.sh"); string source = $"\"{Path.Combine(Constants.UpdatingFolder, "installing")}\""; string destination = $"\"{Constants.ApplicationFolder}\""; - string args = argsList.Any() ? $"\"{string.Join(' ', argsList)}\"" : ""; + string args = argsList.Any() ? string.Join(' ', argsList) : ""; RunScriptWithOutputFile(script, $"{source} {destination} {args}", Path.Combine(Constants.DataFolder, "update-log.txt")); From c3aa8b0831bedb522f894e5fc318e42b94e1361f Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Mon, 27 Mar 2023 00:37:52 +0100 Subject: [PATCH 07/10] Linux - Fixed passed arguments again --- src/Artemis.UI.Linux/Scripts/update.sh | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Artemis.UI.Linux/Scripts/update.sh b/src/Artemis.UI.Linux/Scripts/update.sh index f8b47c72c..9ee398d2c 100644 --- a/src/Artemis.UI.Linux/Scripts/update.sh +++ b/src/Artemis.UI.Linux/Scripts/update.sh @@ -48,13 +48,9 @@ sleep 1 # When finished, start Artemis again -# If the user has specified arguments, pass them to the executable -if [ -z "$artemisArgs" ] -then - "$destinationDirectory/Artemis.UI.Linux" & -else - "$destinationDirectory/Artemis.UI.Linux" "$artemisArgs" & -fi +# quoting here breaks stuff, all arguments count as 1 +# shellcheck disable=SC2086 +"$destinationDirectory/Artemis.UI.Linux" $artemisArgs & From 93dafd420eff6150813f649875aa3a33b5886116 Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Sun, 2 Apr 2023 04:11:52 +0100 Subject: [PATCH 08/10] Windows input - Added black magic --- .../Services/Input/Enums/KeyboardKey.cs | 17 +- .../Services/Input/InputKeyLedIdMap.cs | 9 +- .../Services/Input/InputService.cs | 7 + .../Providers/Input/WindowsInputProvider.cs | 4 +- .../Utilities/InputUtilities.cs | 1950 +++++------------ 5 files changed, 628 insertions(+), 1359 deletions(-) diff --git a/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs b/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs index 75abc7db2..39bfbcbd2 100644 --- a/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs +++ b/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs @@ -532,5 +532,20 @@ public enum KeyboardKey DeadCharProcessed = 172, // 0x000000AC, /// The NumPad enter key - NumPadEnter + NumPadEnter, + + /// The NumPad divide key + NumPadDivide, + + /// The NumPad multiply key + NumPadMultiply, + + /// The NumPad subtract key + NumPadSubtract, + + /// The NumPad add key + NumPadAdd, + + /// The NumPad decimal key + NumPadDecimal, } \ No newline at end of file diff --git a/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs b/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs index d04f217dc..b240c7f51 100644 --- a/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs +++ b/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs @@ -166,7 +166,7 @@ public static class InputKeyUtilities {KeyboardKey.OemPipe, LedId.Keyboard_Backslash}, {KeyboardKey.OemCloseBrackets, LedId.Keyboard_BracketRight}, {KeyboardKey.OemQuotes, LedId.Keyboard_ApostropheAndDoubleQuote}, - {KeyboardKey.OemBackslash, LedId.Keyboard_Custom42}, // unverified + {KeyboardKey.OemBackslash, LedId.Keyboard_NonUsBackslash}, {KeyboardKey.ImeProcessed, LedId.Keyboard_Custom43}, {KeyboardKey.System, LedId.Keyboard_Custom44}, {KeyboardKey.OemAttn, LedId.Keyboard_Custom45}, @@ -185,7 +185,12 @@ public static class InputKeyUtilities {KeyboardKey.Pa1, LedId.Keyboard_Custom57}, {KeyboardKey.OemClear, LedId.Keyboard_Custom58}, {KeyboardKey.DeadCharProcessed, LedId.Keyboard_Custom59}, - {KeyboardKey.NumPadEnter, LedId.Keyboard_NumEnter} + {KeyboardKey.NumPadEnter, LedId.Keyboard_NumEnter}, + {KeyboardKey.NumPadDecimal, LedId.Keyboard_NumPeriodAndDelete}, + {KeyboardKey.NumPadDivide, LedId.Keyboard_NumSlash}, + {KeyboardKey.NumPadMultiply, LedId.Keyboard_NumAsterisk}, + {KeyboardKey.NumPadSubtract, LedId.Keyboard_NumMinus}, + {KeyboardKey.NumPadAdd, LedId.Keyboard_NumPlus}, }; /// diff --git a/src/Artemis.Core/Services/Input/InputService.cs b/src/Artemis.Core/Services/Input/InputService.cs index 48ae607f6..fa6c983f4 100644 --- a/src/Artemis.Core/Services/Input/InputService.cs +++ b/src/Artemis.Core/Services/Input/InputService.cs @@ -269,6 +269,13 @@ internal class InputService : IInputService // Get the LED bool foundLedId = InputKeyUtilities.KeyboardKeyLedIdMap.TryGetValue(e.Key, out LedId ledId); + // If we find a backslash but the keyboard is ISO, we need to use the non-US backslash. + // The scancode is the same, but the LED ID is different + if (ledId == LedId.Keyboard_Backslash && e.Device?.PhysicalLayout == KeyboardLayoutType.ISO) + { + ledId = LedId.Keyboard_NonUsTilde; + } + ArtemisLed? led = null; if (foundLedId && e.Device != null) led = e.Device.GetLed(ledId, true); diff --git a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs index ef8f168ec..c50a626df 100644 --- a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs +++ b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Timers; @@ -98,7 +98,7 @@ public class WindowsInputProvider : InputProvider private void HandleKeyboardData(RawInputData data, RawInputKeyboardData keyboardData) { - KeyboardKey key = InputUtilities.KeyFromVirtualKey(keyboardData.Keyboard.VirutalKey); + KeyboardKey key = InputUtilities.CorrectVirtualKeyAndScanCode((uint)keyboardData.Keyboard.VirutalKey, (uint)keyboardData.Keyboard.ScanCode, (uint)keyboardData.Keyboard.Flags); // Debug.WriteLine($"VK: {key} ({keyboardData.Keyboard.VirutalKey}), Flags: {keyboardData.Keyboard.Flags}, Scan code: {keyboardData.Keyboard.ScanCode}"); // Sometimes we get double hits and they resolve to None, ignore those diff --git a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs index f18ff88cc..3a06fccf4 100644 --- a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs +++ b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs @@ -1,5 +1,6 @@ using System; using System.Runtime.InteropServices; +using System.Text; using Artemis.Core.Services; using Microsoft.Win32; @@ -11,6 +12,135 @@ namespace Artemis.UI.Windows.Utilities; /// public static class InputUtilities { + [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] + private static extern short GetKeyState(int keyCode); + + [DllImport("user32.dll")] + private static extern uint MapVirtualKey(uint uCode, MapVirtualKeyMapTypes uMapType); + + [Flags] + private enum KeyStates + { + None = 0, + Down = 1, + Toggled = 2 + } + + /// + /// The set of valid MapTypes used in MapVirtualKey + /// + private enum MapVirtualKeyMapTypes : uint + { + /// + /// uCode is a virtual-key code and is translated into a scan code. + /// If it is a virtual-key code that does not distinguish between left- and + /// right-hand keys, the left-hand scan code is returned. + /// If there is no translation, the function returns 0. + /// + MAPVK_VK_TO_VSC = 0x00, + + /// + /// uCode is a scan code and is translated into a virtual-key code that + /// does not distinguish between left- and right-hand keys. If there is no + /// translation, the function returns 0. + /// + MAPVK_VSC_TO_VK = 0x01, + + /// + /// uCode is a virtual-key code and is translated into an unshifted + /// character value in the low-order word of the return value. Dead keys (diacritics) + /// are indicated by setting the top bit of the return value. If there is no + /// translation, the function returns 0. + /// + MAPVK_VK_TO_CHAR = 0x02, + + /// + /// Windows NT/2000/XP: uCode is a scan code and is translated into a + /// virtual-key code that distinguishes between left- and right-hand keys. If + /// there is no translation, the function returns 0. + /// + MAPVK_VSC_TO_VK_EX = 0x03, + + /// + /// Not currently documented + /// + MAPVK_VK_TO_VSC_EX = 0x04 + } + + /// + /// https://blog.molecular-matters.com/2011/09/05/properly-handling-keyboard-input/ + /// + public static KeyboardKey CorrectVirtualKeyAndScanCode(uint virtualKey, uint scanCode, uint flags) + { + if (virtualKey == 255) + { + // discard "fake keys" which are part of an escaped sequence + return KeyboardKey.None; + } + + if (virtualKey == NativeMethods.VK_CONTROL && scanCode == 0x38) + { + //fake altgr ctrl + return KeyboardKey.None; + } + + if (virtualKey == NativeMethods.VK_SHIFT) + { + // correct left-hand / right-hand SHIFT + virtualKey = MapVirtualKey(scanCode, MapVirtualKeyMapTypes.MAPVK_VSC_TO_VK); + } + else if (virtualKey == NativeMethods.VK_NUMLOCK) + { + // correct PAUSE/BREAK and NUM LOCK silliness, and set the extended bit + scanCode = MapVirtualKey(virtualKey, MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC) | 0x100; + } + + const byte RI_KEY_E0 = 0x02; + const byte RI_KEY_E1 = 0x04; + bool isE0 = (flags & RI_KEY_E0) != 0; + bool isE1 = (flags & RI_KEY_E1) != 0; + + if (isE1) + { + if (virtualKey == NativeMethods.VK_PAUSE) + { + scanCode = 0x45; + } + else + { + scanCode = MapVirtualKey(virtualKey, MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC); + } + } + KeyboardKey key = (short)virtualKey switch + { + NativeMethods.VK_CONTROL => isE0 ? KeyboardKey.RightCtrl : KeyboardKey.LeftCtrl, + NativeMethods.VK_MENU => isE0 ? KeyboardKey.RightAlt : KeyboardKey.LeftAlt, + NativeMethods.VK_RETURN => isE0 ? KeyboardKey.NumPadEnter : KeyboardKey.Enter, + NativeMethods.VK_INSERT => !isE0 ? KeyboardKey.NumPad0 : KeyboardKey.Insert, + NativeMethods.VK_DELETE => !isE0 ? KeyboardKey.NumPadDecimal : KeyboardKey.Delete, + NativeMethods.VK_HOME => !isE0 ? KeyboardKey.NumPad7 : KeyboardKey.Home, + NativeMethods.VK_END => !isE0 ? KeyboardKey.NumPad1 : KeyboardKey.End, + NativeMethods.VK_PRIOR => !isE0 ? KeyboardKey.NumPad9 : KeyboardKey.PageUp, + NativeMethods.VK_NEXT => !isE0 ? KeyboardKey.NumPad3 : KeyboardKey.PageDown, + NativeMethods.VK_LEFT => !isE0 ? KeyboardKey.NumPad4 : KeyboardKey.Left, + NativeMethods.VK_RIGHT => !isE0 ? KeyboardKey.NumPad6 : KeyboardKey.Right, + NativeMethods.VK_UP => !isE0 ? KeyboardKey.NumPad8 : KeyboardKey.Up, + NativeMethods.VK_DOWN => !isE0 ? KeyboardKey.NumPad2 : KeyboardKey.Down, + NativeMethods.VK_CLEAR => !isE0 ? KeyboardKey.NumPad5 : KeyboardKey.Clear, + NativeMethods.VK_DIVIDE => isE0 ? KeyboardKey.NumPadDivide : KeyboardKey.Divide, + NativeMethods.VK_MULTIPLY => isE0 ? KeyboardKey.NumPadMultiply : KeyboardKey.Multiply, + _ => KeyboardKey.None + }; + if (key != KeyboardKey.None) + return key; + + key = KeyFromScanCode(scanCode); + if (key != KeyboardKey.None) + return key; + + return KeyFromVirtualKey((int)virtualKey); + + } public static bool IsKeyDown(KeyboardKey key) { return KeyStates.Down == (GetKeyState(key) & KeyStates.Down); @@ -21,1355 +151,6 @@ public static class InputUtilities return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled); } - /// - /// Convert a Win32 VirtualKey into our Key enum. - /// - public static KeyboardKey KeyFromVirtualKey(int virtualKey) - { - KeyboardKey key = KeyboardKey.None; - - switch (virtualKey) - { - case NativeMethods.VK_CANCEL: - key = KeyboardKey.Cancel; - break; - - case NativeMethods.VK_BACK: - key = KeyboardKey.Back; - break; - - case NativeMethods.VK_TAB: - key = KeyboardKey.Tab; - break; - - case NativeMethods.VK_CLEAR: - key = KeyboardKey.Clear; - break; - - case NativeMethods.VK_RETURN: - key = KeyboardKey.Return; - break; - - case NativeMethods.VK_PAUSE: - key = KeyboardKey.Pause; - break; - - case NativeMethods.VK_CAPSLOCK: - key = KeyboardKey.CapsLock; - break; - - case NativeMethods.VK_JUNJA: - key = KeyboardKey.JunjaMode; - break; - - case NativeMethods.VK_FINAL: - key = KeyboardKey.FinalMode; - break; - - case NativeMethods.VK_ESCAPE: - key = KeyboardKey.Escape; - break; - - case NativeMethods.VK_CONVERT: - key = KeyboardKey.ImeConvert; - break; - - case NativeMethods.VK_NONCONVERT: - key = KeyboardKey.ImeNonConvert; - break; - - case NativeMethods.VK_ACCEPT: - key = KeyboardKey.ImeAccept; - break; - - case NativeMethods.VK_MODECHANGE: - key = KeyboardKey.ImeModeChange; - break; - - case NativeMethods.VK_SPACE: - key = KeyboardKey.Space; - break; - - case NativeMethods.VK_PRIOR: - key = KeyboardKey.Prior; - break; - - case NativeMethods.VK_NEXT: - key = KeyboardKey.Next; - break; - - case NativeMethods.VK_END: - key = KeyboardKey.End; - break; - - case NativeMethods.VK_HOME: - key = KeyboardKey.Home; - break; - - case NativeMethods.VK_LEFT: - key = KeyboardKey.Left; - break; - - case NativeMethods.VK_UP: - key = KeyboardKey.Up; - break; - - case NativeMethods.VK_RIGHT: - key = KeyboardKey.Right; - break; - - case NativeMethods.VK_DOWN: - key = KeyboardKey.Down; - break; - - case NativeMethods.VK_SELECT: - key = KeyboardKey.Select; - break; - - case NativeMethods.VK_PRINT: - key = KeyboardKey.Print; - break; - - case NativeMethods.VK_EXECUTE: - key = KeyboardKey.Execute; - break; - - case NativeMethods.VK_INSERT: - key = KeyboardKey.Insert; - break; - - case NativeMethods.VK_DELETE: - key = KeyboardKey.Delete; - break; - - case NativeMethods.VK_HELP: - key = KeyboardKey.Help; - break; - - case NativeMethods.VK_0: - key = KeyboardKey.D0; - break; - - case NativeMethods.VK_1: - key = KeyboardKey.D1; - break; - - case NativeMethods.VK_2: - key = KeyboardKey.D2; - break; - - case NativeMethods.VK_3: - key = KeyboardKey.D3; - break; - - case NativeMethods.VK_4: - key = KeyboardKey.D4; - break; - - case NativeMethods.VK_5: - key = KeyboardKey.D5; - break; - - case NativeMethods.VK_6: - key = KeyboardKey.D6; - break; - - case NativeMethods.VK_7: - key = KeyboardKey.D7; - break; - - case NativeMethods.VK_8: - key = KeyboardKey.D8; - break; - - case NativeMethods.VK_9: - key = KeyboardKey.D9; - break; - - case NativeMethods.VK_A: - key = KeyboardKey.A; - break; - - case NativeMethods.VK_B: - key = KeyboardKey.B; - break; - - case NativeMethods.VK_C: - key = KeyboardKey.C; - break; - - case NativeMethods.VK_D: - key = KeyboardKey.D; - break; - - case NativeMethods.VK_E: - key = KeyboardKey.E; - break; - - case NativeMethods.VK_F: - key = KeyboardKey.F; - break; - - case NativeMethods.VK_G: - key = KeyboardKey.G; - break; - - case NativeMethods.VK_H: - key = KeyboardKey.H; - break; - - case NativeMethods.VK_I: - key = KeyboardKey.I; - break; - - case NativeMethods.VK_J: - key = KeyboardKey.J; - break; - - case NativeMethods.VK_K: - key = KeyboardKey.K; - break; - - case NativeMethods.VK_L: - key = KeyboardKey.L; - break; - - case NativeMethods.VK_M: - key = KeyboardKey.M; - break; - - case NativeMethods.VK_N: - key = KeyboardKey.N; - break; - - case NativeMethods.VK_O: - key = KeyboardKey.O; - break; - - case NativeMethods.VK_P: - key = KeyboardKey.P; - break; - - case NativeMethods.VK_Q: - key = KeyboardKey.Q; - break; - - case NativeMethods.VK_R: - key = KeyboardKey.R; - break; - - case NativeMethods.VK_S: - key = KeyboardKey.S; - break; - - case NativeMethods.VK_T: - key = KeyboardKey.T; - break; - - case NativeMethods.VK_U: - key = KeyboardKey.U; - break; - - case NativeMethods.VK_V: - key = KeyboardKey.V; - break; - - case NativeMethods.VK_W: - key = KeyboardKey.W; - break; - - case NativeMethods.VK_X: - key = KeyboardKey.X; - break; - - case NativeMethods.VK_Y: - key = KeyboardKey.Y; - break; - - case NativeMethods.VK_Z: - key = KeyboardKey.Z; - break; - - case NativeMethods.VK_LWIN: - key = KeyboardKey.LWin; - break; - - case NativeMethods.VK_RWIN: - key = KeyboardKey.RWin; - break; - - case NativeMethods.VK_APPS: - key = KeyboardKey.Apps; - break; - - case NativeMethods.VK_SLEEP: - key = KeyboardKey.Sleep; - break; - - case NativeMethods.VK_NUMPAD0: - key = KeyboardKey.NumPad0; - break; - - case NativeMethods.VK_NUMPAD1: - key = KeyboardKey.NumPad1; - break; - - case NativeMethods.VK_NUMPAD2: - key = KeyboardKey.NumPad2; - break; - - case NativeMethods.VK_NUMPAD3: - key = KeyboardKey.NumPad3; - break; - - case NativeMethods.VK_NUMPAD4: - key = KeyboardKey.NumPad4; - break; - - case NativeMethods.VK_NUMPAD5: - key = KeyboardKey.NumPad5; - break; - - case NativeMethods.VK_NUMPAD6: - key = KeyboardKey.NumPad6; - break; - - case NativeMethods.VK_NUMPAD7: - key = KeyboardKey.NumPad7; - break; - - case NativeMethods.VK_NUMPAD8: - key = KeyboardKey.NumPad8; - break; - - case NativeMethods.VK_NUMPAD9: - key = KeyboardKey.NumPad9; - break; - - case NativeMethods.VK_MULTIPLY: - key = KeyboardKey.Multiply; - break; - - case NativeMethods.VK_ADD: - key = KeyboardKey.Add; - break; - - case NativeMethods.VK_SEPARATOR: - key = KeyboardKey.Separator; - break; - - case NativeMethods.VK_SUBTRACT: - key = KeyboardKey.Subtract; - break; - - case NativeMethods.VK_DECIMAL: - key = KeyboardKey.Decimal; - break; - - case NativeMethods.VK_DIVIDE: - key = KeyboardKey.Divide; - break; - - case NativeMethods.VK_F1: - key = KeyboardKey.F1; - break; - - case NativeMethods.VK_F2: - key = KeyboardKey.F2; - break; - - case NativeMethods.VK_F3: - key = KeyboardKey.F3; - break; - - case NativeMethods.VK_F4: - key = KeyboardKey.F4; - break; - - case NativeMethods.VK_F5: - key = KeyboardKey.F5; - break; - - case NativeMethods.VK_F6: - key = KeyboardKey.F6; - break; - - case NativeMethods.VK_F7: - key = KeyboardKey.F7; - break; - - case NativeMethods.VK_F8: - key = KeyboardKey.F8; - break; - - case NativeMethods.VK_F9: - key = KeyboardKey.F9; - break; - - case NativeMethods.VK_F10: - key = KeyboardKey.F10; - break; - - case NativeMethods.VK_F11: - key = KeyboardKey.F11; - break; - - case NativeMethods.VK_F12: - key = KeyboardKey.F12; - break; - - case NativeMethods.VK_F13: - key = KeyboardKey.F13; - break; - - case NativeMethods.VK_F14: - key = KeyboardKey.F14; - break; - - case NativeMethods.VK_F15: - key = KeyboardKey.F15; - break; - - case NativeMethods.VK_F16: - key = KeyboardKey.F16; - break; - - case NativeMethods.VK_F17: - key = KeyboardKey.F17; - break; - - case NativeMethods.VK_F18: - key = KeyboardKey.F18; - break; - - case NativeMethods.VK_F19: - key = KeyboardKey.F19; - break; - - case NativeMethods.VK_F20: - key = KeyboardKey.F20; - break; - - case NativeMethods.VK_F21: - key = KeyboardKey.F21; - break; - - case NativeMethods.VK_F22: - key = KeyboardKey.F22; - break; - - case NativeMethods.VK_F23: - key = KeyboardKey.F23; - break; - - case NativeMethods.VK_F24: - key = KeyboardKey.F24; - break; - - case NativeMethods.VK_NUMLOCK: - key = KeyboardKey.NumLock; - break; - - case NativeMethods.VK_SCROLL: - key = KeyboardKey.Scroll; - break; - - case NativeMethods.VK_SHIFT: - case NativeMethods.VK_LSHIFT: - key = KeyboardKey.LeftShift; - break; - - case NativeMethods.VK_RSHIFT: - key = KeyboardKey.RightShift; - break; - - case NativeMethods.VK_CONTROL: - case NativeMethods.VK_LCONTROL: - key = KeyboardKey.LeftCtrl; - break; - - case NativeMethods.VK_RCONTROL: - key = KeyboardKey.RightCtrl; - break; - - case NativeMethods.VK_MENU: - case NativeMethods.VK_LMENU: - key = KeyboardKey.LeftAlt; - break; - - case NativeMethods.VK_RMENU: - key = KeyboardKey.RightAlt; - break; - - case NativeMethods.VK_BROWSER_BACK: - key = KeyboardKey.BrowserBack; - break; - - case NativeMethods.VK_BROWSER_FORWARD: - key = KeyboardKey.BrowserForward; - break; - - case NativeMethods.VK_BROWSER_REFRESH: - key = KeyboardKey.BrowserRefresh; - break; - - case NativeMethods.VK_BROWSER_STOP: - key = KeyboardKey.BrowserStop; - break; - - case NativeMethods.VK_BROWSER_SEARCH: - key = KeyboardKey.BrowserSearch; - break; - - case NativeMethods.VK_BROWSER_FAVORITES: - key = KeyboardKey.BrowserFavorites; - break; - - case NativeMethods.VK_BROWSER_HOME: - key = KeyboardKey.BrowserHome; - break; - - case NativeMethods.VK_VOLUME_MUTE: - key = KeyboardKey.VolumeMute; - break; - - case NativeMethods.VK_VOLUME_DOWN: - key = KeyboardKey.VolumeDown; - break; - - case NativeMethods.VK_VOLUME_UP: - key = KeyboardKey.VolumeUp; - break; - - case NativeMethods.VK_MEDIA_NEXT_TRACK: - key = KeyboardKey.MediaNextTrack; - break; - - case NativeMethods.VK_MEDIA_PREV_TRACK: - key = KeyboardKey.MediaPreviousTrack; - break; - - case NativeMethods.VK_MEDIA_STOP: - key = KeyboardKey.MediaStop; - break; - - case NativeMethods.VK_MEDIA_PLAY_PAUSE: - key = KeyboardKey.MediaPlayPause; - break; - - case NativeMethods.VK_LAUNCH_MAIL: - key = KeyboardKey.LaunchMail; - break; - - case NativeMethods.VK_LAUNCH_MEDIA_SELECT: - key = KeyboardKey.SelectMedia; - break; - - case NativeMethods.VK_LAUNCH_APP1: - key = KeyboardKey.LaunchApplication1; - break; - - case NativeMethods.VK_LAUNCH_APP2: - key = KeyboardKey.LaunchApplication2; - break; - - case NativeMethods.VK_OEM_1: - key = KeyboardKey.OemSemicolon; - break; - - case NativeMethods.VK_OEM_PLUS: - key = KeyboardKey.OemPlus; - break; - - case NativeMethods.VK_OEM_COMMA: - key = KeyboardKey.OemComma; - break; - - case NativeMethods.VK_OEM_MINUS: - key = KeyboardKey.OemMinus; - break; - - case NativeMethods.VK_OEM_PERIOD: - key = KeyboardKey.OemPeriod; - break; - - case NativeMethods.VK_OEM_2: - key = KeyboardKey.OemQuestion; - break; - - case NativeMethods.VK_OEM_3: - key = KeyboardKey.OemTilde; - break; - - - case NativeMethods.VK_OEM_4: - key = KeyboardKey.OemOpenBrackets; - break; - - case NativeMethods.VK_OEM_5: - key = KeyboardKey.OemPipe; - break; - - case NativeMethods.VK_OEM_6: - key = KeyboardKey.OemCloseBrackets; - break; - - case NativeMethods.VK_OEM_7: - key = KeyboardKey.OemQuotes; - break; - - case NativeMethods.VK_OEM_102: - key = KeyboardKey.OemBackslash; - break; - - case NativeMethods.VK_PROCESSKEY: - key = KeyboardKey.ImeProcessed; - break; - - case NativeMethods.VK_OEM_ATTN: // VK_DBE_ALPHANUMERIC - key = KeyboardKey.OemAttn; // DbeAlphanumeric - break; - - case NativeMethods.VK_OEM_FINISH: // VK_DBE_KATAKANA - key = KeyboardKey.OemFinish; // DbeKatakana - break; - - case NativeMethods.VK_OEM_COPY: // VK_DBE_HIRAGANA - key = KeyboardKey.OemCopy; // DbeHiragana - break; - - case NativeMethods.VK_OEM_AUTO: // VK_DBE_SBCSCHAR - key = KeyboardKey.OemAuto; // DbeSbcsChar - break; - - case NativeMethods.VK_OEM_ENLW: // VK_DBE_DBCSCHAR - key = KeyboardKey.OemEnlw; // DbeDbcsChar - break; - - case NativeMethods.VK_OEM_BACKTAB: // VK_DBE_ROMAN - key = KeyboardKey.OemBackTab; // DbeRoman - break; - - case NativeMethods.VK_ATTN: // VK_DBE_NOROMAN - key = KeyboardKey.Attn; // DbeNoRoman - break; - - case NativeMethods.VK_CRSEL: // VK_DBE_ENTERWORDREGISTERMODE - key = KeyboardKey.CrSel; // DbeEnterWordRegisterMode - break; - - case NativeMethods.VK_EXSEL: // VK_DBE_ENTERIMECONFIGMODE - key = KeyboardKey.ExSel; // DbeEnterImeConfigMode - break; - - case NativeMethods.VK_EREOF: // VK_DBE_FLUSHSTRING - key = KeyboardKey.EraseEof; // DbeFlushString - break; - - case NativeMethods.VK_PLAY: // VK_DBE_CODEINPUT - key = KeyboardKey.Play; // DbeCodeInput - break; - - case NativeMethods.VK_ZOOM: // VK_DBE_NOCODEINPUT - key = KeyboardKey.Zoom; // DbeNoCodeInput - break; - - case NativeMethods.VK_NONAME: // VK_DBE_DETERMINESTRING - key = KeyboardKey.NoName; // DbeDetermineString - break; - - case NativeMethods.VK_PA1: // VK_DBE_ENTERDLGCONVERSIONMODE - key = KeyboardKey.Pa1; // DbeEnterDlgConversionMode - break; - - case NativeMethods.VK_OEM_CLEAR: - key = KeyboardKey.OemClear; - break; - - default: - key = KeyboardKey.None; - break; - } - - return key; - } - - /// - /// Convert our Key enum into a Win32 VirtualKeyboardKey. - /// - public static int VirtualKeyFromKey(KeyboardKey key) - { - int virtualKey = 0; - - switch (key) - { - case KeyboardKey.Cancel: - virtualKey = NativeMethods.VK_CANCEL; - break; - - case KeyboardKey.Back: - virtualKey = NativeMethods.VK_BACK; - break; - - case KeyboardKey.Tab: - virtualKey = NativeMethods.VK_TAB; - break; - - case KeyboardKey.Clear: - virtualKey = NativeMethods.VK_CLEAR; - break; - - case KeyboardKey.Return: - virtualKey = NativeMethods.VK_RETURN; - break; - - case KeyboardKey.Pause: - virtualKey = NativeMethods.VK_PAUSE; - break; - - case KeyboardKey.CapsLock: - virtualKey = NativeMethods.VK_CAPSLOCK; - break; - - case KeyboardKey.JunjaMode: - virtualKey = NativeMethods.VK_JUNJA; - break; - - case KeyboardKey.FinalMode: - virtualKey = NativeMethods.VK_FINAL; - break; - - case KeyboardKey.Escape: - virtualKey = NativeMethods.VK_ESCAPE; - break; - - case KeyboardKey.ImeConvert: - virtualKey = NativeMethods.VK_CONVERT; - break; - - case KeyboardKey.ImeNonConvert: - virtualKey = NativeMethods.VK_NONCONVERT; - break; - - case KeyboardKey.ImeAccept: - virtualKey = NativeMethods.VK_ACCEPT; - break; - - case KeyboardKey.ImeModeChange: - virtualKey = NativeMethods.VK_MODECHANGE; - break; - - case KeyboardKey.Space: - virtualKey = NativeMethods.VK_SPACE; - break; - - case KeyboardKey.Prior: - virtualKey = NativeMethods.VK_PRIOR; - break; - - case KeyboardKey.Next: - virtualKey = NativeMethods.VK_NEXT; - break; - - case KeyboardKey.End: - virtualKey = NativeMethods.VK_END; - break; - - case KeyboardKey.Home: - virtualKey = NativeMethods.VK_HOME; - break; - - case KeyboardKey.Left: - virtualKey = NativeMethods.VK_LEFT; - break; - - case KeyboardKey.Up: - virtualKey = NativeMethods.VK_UP; - break; - - case KeyboardKey.Right: - virtualKey = NativeMethods.VK_RIGHT; - break; - - case KeyboardKey.Down: - virtualKey = NativeMethods.VK_DOWN; - break; - - case KeyboardKey.Select: - virtualKey = NativeMethods.VK_SELECT; - break; - - case KeyboardKey.Print: - virtualKey = NativeMethods.VK_PRINT; - break; - - case KeyboardKey.Execute: - virtualKey = NativeMethods.VK_EXECUTE; - break; - - case KeyboardKey.Insert: - virtualKey = NativeMethods.VK_INSERT; - break; - - case KeyboardKey.Delete: - virtualKey = NativeMethods.VK_DELETE; - break; - - case KeyboardKey.Help: - virtualKey = NativeMethods.VK_HELP; - break; - - case KeyboardKey.D0: - virtualKey = NativeMethods.VK_0; - break; - - case KeyboardKey.D1: - virtualKey = NativeMethods.VK_1; - break; - - case KeyboardKey.D2: - virtualKey = NativeMethods.VK_2; - break; - - case KeyboardKey.D3: - virtualKey = NativeMethods.VK_3; - break; - - case KeyboardKey.D4: - virtualKey = NativeMethods.VK_4; - break; - - case KeyboardKey.D5: - virtualKey = NativeMethods.VK_5; - break; - - case KeyboardKey.D6: - virtualKey = NativeMethods.VK_6; - break; - - case KeyboardKey.D7: - virtualKey = NativeMethods.VK_7; - break; - - case KeyboardKey.D8: - virtualKey = NativeMethods.VK_8; - break; - - case KeyboardKey.D9: - virtualKey = NativeMethods.VK_9; - break; - - case KeyboardKey.A: - virtualKey = NativeMethods.VK_A; - break; - - case KeyboardKey.B: - virtualKey = NativeMethods.VK_B; - break; - - case KeyboardKey.C: - virtualKey = NativeMethods.VK_C; - break; - - case KeyboardKey.D: - virtualKey = NativeMethods.VK_D; - break; - - case KeyboardKey.E: - virtualKey = NativeMethods.VK_E; - break; - - case KeyboardKey.F: - virtualKey = NativeMethods.VK_F; - break; - - case KeyboardKey.G: - virtualKey = NativeMethods.VK_G; - break; - - case KeyboardKey.H: - virtualKey = NativeMethods.VK_H; - break; - - case KeyboardKey.I: - virtualKey = NativeMethods.VK_I; - break; - - case KeyboardKey.J: - virtualKey = NativeMethods.VK_J; - break; - - case KeyboardKey.K: - virtualKey = NativeMethods.VK_K; - break; - - case KeyboardKey.L: - virtualKey = NativeMethods.VK_L; - break; - - case KeyboardKey.M: - virtualKey = NativeMethods.VK_M; - break; - - case KeyboardKey.N: - virtualKey = NativeMethods.VK_N; - break; - - case KeyboardKey.O: - virtualKey = NativeMethods.VK_O; - break; - - case KeyboardKey.P: - virtualKey = NativeMethods.VK_P; - break; - - case KeyboardKey.Q: - virtualKey = NativeMethods.VK_Q; - break; - - case KeyboardKey.R: - virtualKey = NativeMethods.VK_R; - break; - - case KeyboardKey.S: - virtualKey = NativeMethods.VK_S; - break; - - case KeyboardKey.T: - virtualKey = NativeMethods.VK_T; - break; - - case KeyboardKey.U: - virtualKey = NativeMethods.VK_U; - break; - - case KeyboardKey.V: - virtualKey = NativeMethods.VK_V; - break; - - case KeyboardKey.W: - virtualKey = NativeMethods.VK_W; - break; - - case KeyboardKey.X: - virtualKey = NativeMethods.VK_X; - break; - - case KeyboardKey.Y: - virtualKey = NativeMethods.VK_Y; - break; - - case KeyboardKey.Z: - virtualKey = NativeMethods.VK_Z; - break; - - case KeyboardKey.LWin: - virtualKey = NativeMethods.VK_LWIN; - break; - - case KeyboardKey.RWin: - virtualKey = NativeMethods.VK_RWIN; - break; - - case KeyboardKey.Apps: - virtualKey = NativeMethods.VK_APPS; - break; - - case KeyboardKey.Sleep: - virtualKey = NativeMethods.VK_SLEEP; - break; - - case KeyboardKey.NumPad0: - virtualKey = NativeMethods.VK_NUMPAD0; - break; - - case KeyboardKey.NumPad1: - virtualKey = NativeMethods.VK_NUMPAD1; - break; - - case KeyboardKey.NumPad2: - virtualKey = NativeMethods.VK_NUMPAD2; - break; - - case KeyboardKey.NumPad3: - virtualKey = NativeMethods.VK_NUMPAD3; - break; - - case KeyboardKey.NumPad4: - virtualKey = NativeMethods.VK_NUMPAD4; - break; - - case KeyboardKey.NumPad5: - virtualKey = NativeMethods.VK_NUMPAD5; - break; - - case KeyboardKey.NumPad6: - virtualKey = NativeMethods.VK_NUMPAD6; - break; - - case KeyboardKey.NumPad7: - virtualKey = NativeMethods.VK_NUMPAD7; - break; - - case KeyboardKey.NumPad8: - virtualKey = NativeMethods.VK_NUMPAD8; - break; - - case KeyboardKey.NumPad9: - virtualKey = NativeMethods.VK_NUMPAD9; - break; - - case KeyboardKey.Multiply: - virtualKey = NativeMethods.VK_MULTIPLY; - break; - - case KeyboardKey.Add: - virtualKey = NativeMethods.VK_ADD; - break; - - case KeyboardKey.Separator: - virtualKey = NativeMethods.VK_SEPARATOR; - break; - - case KeyboardKey.Subtract: - virtualKey = NativeMethods.VK_SUBTRACT; - break; - - case KeyboardKey.Decimal: - virtualKey = NativeMethods.VK_DECIMAL; - break; - - case KeyboardKey.Divide: - virtualKey = NativeMethods.VK_DIVIDE; - break; - - case KeyboardKey.F1: - virtualKey = NativeMethods.VK_F1; - break; - - case KeyboardKey.F2: - virtualKey = NativeMethods.VK_F2; - break; - - case KeyboardKey.F3: - virtualKey = NativeMethods.VK_F3; - break; - - case KeyboardKey.F4: - virtualKey = NativeMethods.VK_F4; - break; - - case KeyboardKey.F5: - virtualKey = NativeMethods.VK_F5; - break; - - case KeyboardKey.F6: - virtualKey = NativeMethods.VK_F6; - break; - - case KeyboardKey.F7: - virtualKey = NativeMethods.VK_F7; - break; - - case KeyboardKey.F8: - virtualKey = NativeMethods.VK_F8; - break; - - case KeyboardKey.F9: - virtualKey = NativeMethods.VK_F9; - break; - - case KeyboardKey.F10: - virtualKey = NativeMethods.VK_F10; - break; - - case KeyboardKey.F11: - virtualKey = NativeMethods.VK_F11; - break; - - case KeyboardKey.F12: - virtualKey = NativeMethods.VK_F12; - break; - - case KeyboardKey.F13: - virtualKey = NativeMethods.VK_F13; - break; - - case KeyboardKey.F14: - virtualKey = NativeMethods.VK_F14; - break; - - case KeyboardKey.F15: - virtualKey = NativeMethods.VK_F15; - break; - - case KeyboardKey.F16: - virtualKey = NativeMethods.VK_F16; - break; - - case KeyboardKey.F17: - virtualKey = NativeMethods.VK_F17; - break; - - case KeyboardKey.F18: - virtualKey = NativeMethods.VK_F18; - break; - - case KeyboardKey.F19: - virtualKey = NativeMethods.VK_F19; - break; - - case KeyboardKey.F20: - virtualKey = NativeMethods.VK_F20; - break; - - case KeyboardKey.F21: - virtualKey = NativeMethods.VK_F21; - break; - - case KeyboardKey.F22: - virtualKey = NativeMethods.VK_F22; - break; - - case KeyboardKey.F23: - virtualKey = NativeMethods.VK_F23; - break; - - case KeyboardKey.F24: - virtualKey = NativeMethods.VK_F24; - break; - - case KeyboardKey.NumLock: - virtualKey = NativeMethods.VK_NUMLOCK; - break; - - case KeyboardKey.Scroll: - virtualKey = NativeMethods.VK_SCROLL; - break; - - case KeyboardKey.LeftShift: - virtualKey = NativeMethods.VK_LSHIFT; - break; - - case KeyboardKey.RightShift: - virtualKey = NativeMethods.VK_RSHIFT; - break; - - case KeyboardKey.LeftCtrl: - virtualKey = NativeMethods.VK_LCONTROL; - break; - - case KeyboardKey.RightCtrl: - virtualKey = NativeMethods.VK_RCONTROL; - break; - - case KeyboardKey.LeftAlt: - virtualKey = NativeMethods.VK_LMENU; - break; - - case KeyboardKey.RightAlt: - virtualKey = NativeMethods.VK_RMENU; - break; - - case KeyboardKey.BrowserBack: - virtualKey = NativeMethods.VK_BROWSER_BACK; - break; - - case KeyboardKey.BrowserForward: - virtualKey = NativeMethods.VK_BROWSER_FORWARD; - break; - - case KeyboardKey.BrowserRefresh: - virtualKey = NativeMethods.VK_BROWSER_REFRESH; - break; - - case KeyboardKey.BrowserStop: - virtualKey = NativeMethods.VK_BROWSER_STOP; - break; - - case KeyboardKey.BrowserSearch: - virtualKey = NativeMethods.VK_BROWSER_SEARCH; - break; - - case KeyboardKey.BrowserFavorites: - virtualKey = NativeMethods.VK_BROWSER_FAVORITES; - break; - - case KeyboardKey.BrowserHome: - virtualKey = NativeMethods.VK_BROWSER_HOME; - break; - - case KeyboardKey.VolumeMute: - virtualKey = NativeMethods.VK_VOLUME_MUTE; - break; - - case KeyboardKey.VolumeDown: - virtualKey = NativeMethods.VK_VOLUME_DOWN; - break; - - case KeyboardKey.VolumeUp: - virtualKey = NativeMethods.VK_VOLUME_UP; - break; - - case KeyboardKey.MediaNextTrack: - virtualKey = NativeMethods.VK_MEDIA_NEXT_TRACK; - break; - - case KeyboardKey.MediaPreviousTrack: - virtualKey = NativeMethods.VK_MEDIA_PREV_TRACK; - break; - - case KeyboardKey.MediaStop: - virtualKey = NativeMethods.VK_MEDIA_STOP; - break; - - case KeyboardKey.MediaPlayPause: - virtualKey = NativeMethods.VK_MEDIA_PLAY_PAUSE; - break; - - case KeyboardKey.LaunchMail: - virtualKey = NativeMethods.VK_LAUNCH_MAIL; - break; - - case KeyboardKey.SelectMedia: - virtualKey = NativeMethods.VK_LAUNCH_MEDIA_SELECT; - break; - - case KeyboardKey.LaunchApplication1: - virtualKey = NativeMethods.VK_LAUNCH_APP1; - break; - - case KeyboardKey.LaunchApplication2: - virtualKey = NativeMethods.VK_LAUNCH_APP2; - break; - - case KeyboardKey.OemSemicolon: - virtualKey = NativeMethods.VK_OEM_1; - break; - - case KeyboardKey.OemPlus: - virtualKey = NativeMethods.VK_OEM_PLUS; - break; - - case KeyboardKey.OemComma: - virtualKey = NativeMethods.VK_OEM_COMMA; - break; - - case KeyboardKey.OemMinus: - virtualKey = NativeMethods.VK_OEM_MINUS; - break; - - case KeyboardKey.OemPeriod: - virtualKey = NativeMethods.VK_OEM_PERIOD; - break; - - case KeyboardKey.OemQuestion: - virtualKey = NativeMethods.VK_OEM_2; - break; - - case KeyboardKey.OemTilde: - virtualKey = NativeMethods.VK_OEM_3; - break; - - case KeyboardKey.OemOpenBrackets: - virtualKey = NativeMethods.VK_OEM_4; - break; - - case KeyboardKey.OemPipe: - virtualKey = NativeMethods.VK_OEM_5; - break; - - case KeyboardKey.OemCloseBrackets: - virtualKey = NativeMethods.VK_OEM_6; - break; - - case KeyboardKey.OemQuotes: - virtualKey = NativeMethods.VK_OEM_7; - break; - - case KeyboardKey.OemBackslash: - virtualKey = NativeMethods.VK_OEM_102; - break; - - case KeyboardKey.ImeProcessed: - virtualKey = NativeMethods.VK_PROCESSKEY; - break; - - case KeyboardKey.OemAttn: // DbeAlphanumeric - virtualKey = NativeMethods.VK_OEM_ATTN; // VK_DBE_ALPHANUMERIC - break; - - case KeyboardKey.OemFinish: // DbeKatakana - virtualKey = NativeMethods.VK_OEM_FINISH; // VK_DBE_KATAKANA - break; - - case KeyboardKey.OemCopy: // DbeHiragana - virtualKey = NativeMethods.VK_OEM_COPY; // VK_DBE_HIRAGANA - break; - - case KeyboardKey.OemAuto: // DbeSbcsChar - virtualKey = NativeMethods.VK_OEM_AUTO; // VK_DBE_SBCSCHAR - break; - - case KeyboardKey.OemEnlw: // DbeDbcsChar - virtualKey = NativeMethods.VK_OEM_ENLW; // VK_DBE_DBCSCHAR - break; - - case KeyboardKey.OemBackTab: // DbeRoman - virtualKey = NativeMethods.VK_OEM_BACKTAB; // VK_DBE_ROMAN - break; - - case KeyboardKey.Attn: // DbeNoRoman - virtualKey = NativeMethods.VK_ATTN; // VK_DBE_NOROMAN - break; - - case KeyboardKey.CrSel: // DbeEnterWordRegisterMode - virtualKey = NativeMethods.VK_CRSEL; // VK_DBE_ENTERWORDREGISTERMODE - break; - - case KeyboardKey.ExSel: // EnterImeConfigureMode - virtualKey = NativeMethods.VK_EXSEL; // VK_DBE_ENTERIMECONFIGMODE - break; - - case KeyboardKey.EraseEof: // DbeFlushString - virtualKey = NativeMethods.VK_EREOF; // VK_DBE_FLUSHSTRING - break; - - case KeyboardKey.Play: // DbeCodeInput - virtualKey = NativeMethods.VK_PLAY; // VK_DBE_CODEINPUT - break; - - case KeyboardKey.Zoom: // DbeNoCodeInput - virtualKey = NativeMethods.VK_ZOOM; // VK_DBE_NOCODEINPUT - break; - - case KeyboardKey.NoName: // DbeDetermineString - virtualKey = NativeMethods.VK_NONAME; // VK_DBE_DETERMINESTRING - break; - - case KeyboardKey.Pa1: // DbeEnterDlgConversionMode - virtualKey = NativeMethods.VK_PA1; // VK_ENTERDLGCONVERSIONMODE - break; - - case KeyboardKey.OemClear: - virtualKey = NativeMethods.VK_OEM_CLEAR; - break; - - case KeyboardKey.DeadCharProcessed: //This is usused. It's just here for completeness. - virtualKey = 0; //There is no Win32 VKey for this. - break; - - default: - virtualKey = 0; - break; - } - - return virtualKey; - } - - [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] - private static extern short GetKeyState(int keyCode); - private static KeyStates GetKeyState(KeyboardKey key) { KeyStates state = KeyStates.None; @@ -1388,11 +169,472 @@ public static class InputUtilities return state; } - [Flags] - private enum KeyStates + /// + /// Convert a Win32 VirtualKey into our Key enum. + /// + public static KeyboardKey KeyFromVirtualKey(int virtualKey) { - None = 0, - Down = 1, - Toggled = 2 + return virtualKey switch + { + NativeMethods.VK_CANCEL => KeyboardKey.Cancel, + NativeMethods.VK_BACK => KeyboardKey.Back, + NativeMethods.VK_TAB => KeyboardKey.Tab, + NativeMethods.VK_CLEAR => KeyboardKey.Clear, + NativeMethods.VK_RETURN => KeyboardKey.Return, + NativeMethods.VK_PAUSE => KeyboardKey.Pause, + NativeMethods.VK_CAPSLOCK => KeyboardKey.CapsLock, + NativeMethods.VK_JUNJA => KeyboardKey.JunjaMode, + NativeMethods.VK_FINAL => KeyboardKey.FinalMode, + NativeMethods.VK_ESCAPE => KeyboardKey.Escape, + NativeMethods.VK_CONVERT => KeyboardKey.ImeConvert, + NativeMethods.VK_NONCONVERT => KeyboardKey.ImeNonConvert, + NativeMethods.VK_ACCEPT => KeyboardKey.ImeAccept, + NativeMethods.VK_MODECHANGE => KeyboardKey.ImeModeChange, + NativeMethods.VK_SPACE => KeyboardKey.Space, + NativeMethods.VK_PRIOR => KeyboardKey.PageUp, + NativeMethods.VK_NEXT => KeyboardKey.PageDown, + NativeMethods.VK_END => KeyboardKey.End, + NativeMethods.VK_HOME => KeyboardKey.Home, + NativeMethods.VK_LEFT => KeyboardKey.Left, + NativeMethods.VK_UP => KeyboardKey.Up, + NativeMethods.VK_RIGHT => KeyboardKey.Right, + NativeMethods.VK_DOWN => KeyboardKey.Down, + NativeMethods.VK_SELECT => KeyboardKey.Select, + NativeMethods.VK_PRINT => KeyboardKey.Print, + NativeMethods.VK_EXECUTE => KeyboardKey.Execute, + NativeMethods.VK_INSERT => KeyboardKey.Insert, + NativeMethods.VK_DELETE => KeyboardKey.Delete, + NativeMethods.VK_HELP => KeyboardKey.Help, + NativeMethods.VK_0 => KeyboardKey.D0, + NativeMethods.VK_1 => KeyboardKey.D1, + NativeMethods.VK_2 => KeyboardKey.D2, + NativeMethods.VK_3 => KeyboardKey.D3, + NativeMethods.VK_4 => KeyboardKey.D4, + NativeMethods.VK_5 => KeyboardKey.D5, + NativeMethods.VK_6 => KeyboardKey.D6, + NativeMethods.VK_7 => KeyboardKey.D7, + NativeMethods.VK_8 => KeyboardKey.D8, + NativeMethods.VK_9 => KeyboardKey.D9, + NativeMethods.VK_A => KeyboardKey.A, + NativeMethods.VK_B => KeyboardKey.B, + NativeMethods.VK_C => KeyboardKey.C, + NativeMethods.VK_D => KeyboardKey.D, + NativeMethods.VK_E => KeyboardKey.E, + NativeMethods.VK_F => KeyboardKey.F, + NativeMethods.VK_G => KeyboardKey.G, + NativeMethods.VK_H => KeyboardKey.H, + NativeMethods.VK_I => KeyboardKey.I, + NativeMethods.VK_J => KeyboardKey.J, + NativeMethods.VK_K => KeyboardKey.K, + NativeMethods.VK_L => KeyboardKey.L, + NativeMethods.VK_M => KeyboardKey.M, + NativeMethods.VK_N => KeyboardKey.N, + NativeMethods.VK_O => KeyboardKey.O, + NativeMethods.VK_P => KeyboardKey.P, + NativeMethods.VK_Q => KeyboardKey.Q, + NativeMethods.VK_R => KeyboardKey.R, + NativeMethods.VK_S => KeyboardKey.S, + NativeMethods.VK_T => KeyboardKey.T, + NativeMethods.VK_U => KeyboardKey.U, + NativeMethods.VK_V => KeyboardKey.V, + NativeMethods.VK_W => KeyboardKey.W, + NativeMethods.VK_X => KeyboardKey.X, + NativeMethods.VK_Y => KeyboardKey.Y, + NativeMethods.VK_Z => KeyboardKey.Z, + NativeMethods.VK_LWIN => KeyboardKey.LWin, + NativeMethods.VK_RWIN => KeyboardKey.RWin, + NativeMethods.VK_APPS => KeyboardKey.Apps, + NativeMethods.VK_SLEEP => KeyboardKey.Sleep, + NativeMethods.VK_NUMPAD0 => KeyboardKey.NumPad0, + NativeMethods.VK_NUMPAD1 => KeyboardKey.NumPad1, + NativeMethods.VK_NUMPAD2 => KeyboardKey.NumPad2, + NativeMethods.VK_NUMPAD3 => KeyboardKey.NumPad3, + NativeMethods.VK_NUMPAD4 => KeyboardKey.NumPad4, + NativeMethods.VK_NUMPAD5 => KeyboardKey.NumPad5, + NativeMethods.VK_NUMPAD6 => KeyboardKey.NumPad6, + NativeMethods.VK_NUMPAD7 => KeyboardKey.NumPad7, + NativeMethods.VK_NUMPAD8 => KeyboardKey.NumPad8, + NativeMethods.VK_NUMPAD9 => KeyboardKey.NumPad9, + NativeMethods.VK_MULTIPLY => KeyboardKey.Multiply, + NativeMethods.VK_ADD => KeyboardKey.Add, + NativeMethods.VK_SEPARATOR => KeyboardKey.Separator, + NativeMethods.VK_SUBTRACT => KeyboardKey.Subtract, + NativeMethods.VK_DECIMAL => KeyboardKey.Decimal, + NativeMethods.VK_DIVIDE => KeyboardKey.Divide, + NativeMethods.VK_F1 => KeyboardKey.F1, + NativeMethods.VK_F2 => KeyboardKey.F2, + NativeMethods.VK_F3 => KeyboardKey.F3, + NativeMethods.VK_F4 => KeyboardKey.F4, + NativeMethods.VK_F5 => KeyboardKey.F5, + NativeMethods.VK_F6 => KeyboardKey.F6, + NativeMethods.VK_F7 => KeyboardKey.F7, + NativeMethods.VK_F8 => KeyboardKey.F8, + NativeMethods.VK_F9 => KeyboardKey.F9, + NativeMethods.VK_F10 => KeyboardKey.F10, + NativeMethods.VK_F11 => KeyboardKey.F11, + NativeMethods.VK_F12 => KeyboardKey.F12, + NativeMethods.VK_F13 => KeyboardKey.F13, + NativeMethods.VK_F14 => KeyboardKey.F14, + NativeMethods.VK_F15 => KeyboardKey.F15, + NativeMethods.VK_F16 => KeyboardKey.F16, + NativeMethods.VK_F17 => KeyboardKey.F17, + NativeMethods.VK_F18 => KeyboardKey.F18, + NativeMethods.VK_F19 => KeyboardKey.F19, + NativeMethods.VK_F20 => KeyboardKey.F20, + NativeMethods.VK_F21 => KeyboardKey.F21, + NativeMethods.VK_F22 => KeyboardKey.F22, + NativeMethods.VK_F23 => KeyboardKey.F23, + NativeMethods.VK_F24 => KeyboardKey.F24, + NativeMethods.VK_NUMLOCK => KeyboardKey.NumLock, + NativeMethods.VK_SCROLL => KeyboardKey.Scroll, + NativeMethods.VK_SHIFT => KeyboardKey.LeftShift, + NativeMethods.VK_LSHIFT => KeyboardKey.LeftShift, + NativeMethods.VK_RSHIFT => KeyboardKey.RightShift, + NativeMethods.VK_CONTROL => KeyboardKey.LeftCtrl, + NativeMethods.VK_LCONTROL => KeyboardKey.LeftCtrl, + NativeMethods.VK_RCONTROL => KeyboardKey.RightCtrl, + NativeMethods.VK_MENU => KeyboardKey.LeftAlt, + NativeMethods.VK_LMENU => KeyboardKey.LeftAlt, + NativeMethods.VK_RMENU => KeyboardKey.RightAlt, + NativeMethods.VK_BROWSER_BACK => KeyboardKey.BrowserBack, + NativeMethods.VK_BROWSER_FORWARD => KeyboardKey.BrowserForward, + NativeMethods.VK_BROWSER_REFRESH => KeyboardKey.BrowserRefresh, + NativeMethods.VK_BROWSER_STOP => KeyboardKey.BrowserStop, + NativeMethods.VK_BROWSER_SEARCH => KeyboardKey.BrowserSearch, + NativeMethods.VK_BROWSER_FAVORITES => KeyboardKey.BrowserFavorites, + NativeMethods.VK_BROWSER_HOME => KeyboardKey.BrowserHome, + NativeMethods.VK_VOLUME_MUTE => KeyboardKey.VolumeMute, + NativeMethods.VK_VOLUME_DOWN => KeyboardKey.VolumeDown, + NativeMethods.VK_VOLUME_UP => KeyboardKey.VolumeUp, + NativeMethods.VK_MEDIA_NEXT_TRACK => KeyboardKey.MediaNextTrack, + NativeMethods.VK_MEDIA_PREV_TRACK => KeyboardKey.MediaPreviousTrack, + NativeMethods.VK_MEDIA_STOP => KeyboardKey.MediaStop, + NativeMethods.VK_MEDIA_PLAY_PAUSE => KeyboardKey.MediaPlayPause, + NativeMethods.VK_LAUNCH_MAIL => KeyboardKey.LaunchMail, + NativeMethods.VK_LAUNCH_MEDIA_SELECT => KeyboardKey.SelectMedia, + NativeMethods.VK_LAUNCH_APP1 => KeyboardKey.LaunchApplication1, + NativeMethods.VK_LAUNCH_APP2 => KeyboardKey.LaunchApplication2, + NativeMethods.VK_OEM_1 => KeyboardKey.OemSemicolon, + NativeMethods.VK_OEM_PLUS => KeyboardKey.OemPlus, + NativeMethods.VK_OEM_COMMA => KeyboardKey.OemComma, + NativeMethods.VK_OEM_MINUS => KeyboardKey.OemMinus, + NativeMethods.VK_OEM_PERIOD => KeyboardKey.OemPeriod, + NativeMethods.VK_OEM_2 => KeyboardKey.OemQuestion, + NativeMethods.VK_OEM_3 => KeyboardKey.OemTilde, + NativeMethods.VK_OEM_4 => KeyboardKey.OemOpenBrackets, + NativeMethods.VK_OEM_5 => KeyboardKey.OemPipe, + NativeMethods.VK_OEM_6 => KeyboardKey.OemCloseBrackets, + NativeMethods.VK_OEM_7 => KeyboardKey.OemQuotes, + NativeMethods.VK_OEM_102 => KeyboardKey.OemBackslash, + NativeMethods.VK_PROCESSKEY => KeyboardKey.ImeProcessed, + NativeMethods.VK_OEM_ATTN => KeyboardKey.Attn, + NativeMethods.VK_OEM_FINISH => KeyboardKey.OemFinish, + NativeMethods.VK_OEM_COPY => KeyboardKey.OemCopy, + NativeMethods.VK_OEM_AUTO => KeyboardKey.OemAuto, + NativeMethods.VK_OEM_ENLW => KeyboardKey.OemEnlw, + NativeMethods.VK_OEM_BACKTAB => KeyboardKey.OemBackTab, + NativeMethods.VK_ATTN => KeyboardKey.Attn, + NativeMethods.VK_CRSEL => KeyboardKey.CrSel, + NativeMethods.VK_EXSEL => KeyboardKey.ExSel, + NativeMethods.VK_EREOF => KeyboardKey.EraseEof, + NativeMethods.VK_PLAY => KeyboardKey.Play, + NativeMethods.VK_ZOOM => KeyboardKey.Zoom, + NativeMethods.VK_NONAME => KeyboardKey.NoName, + NativeMethods.VK_PA1 => KeyboardKey.Pa1, + NativeMethods.VK_OEM_CLEAR => KeyboardKey.OemClear, + _ => KeyboardKey.None + }; + } + + /// + /// Convert our Key enum into a Win32 VirtualKeyboardKey. + /// + public static int VirtualKeyFromKey(KeyboardKey key) + { + return key switch + { + KeyboardKey.Cancel => NativeMethods.VK_CANCEL, + KeyboardKey.Back => NativeMethods.VK_BACK, + KeyboardKey.Tab => NativeMethods.VK_TAB, + KeyboardKey.Clear => NativeMethods.VK_CLEAR, + KeyboardKey.Return => NativeMethods.VK_RETURN, + KeyboardKey.Pause => NativeMethods.VK_PAUSE, + KeyboardKey.CapsLock => NativeMethods.VK_CAPITAL, + KeyboardKey.JunjaMode => NativeMethods.VK_JUNJA, + KeyboardKey.FinalMode => NativeMethods.VK_FINAL, + KeyboardKey.Escape => NativeMethods.VK_ESCAPE, + KeyboardKey.ImeConvert => NativeMethods.VK_CONVERT, + KeyboardKey.ImeNonConvert => NativeMethods.VK_NONCONVERT, + KeyboardKey.ImeAccept => NativeMethods.VK_ACCEPT, + KeyboardKey.ImeModeChange => NativeMethods.VK_MODECHANGE, + KeyboardKey.Space => NativeMethods.VK_SPACE, + KeyboardKey.Prior => NativeMethods.VK_PRIOR, + KeyboardKey.Next => NativeMethods.VK_NEXT, + KeyboardKey.End => NativeMethods.VK_END, + KeyboardKey.Home => NativeMethods.VK_HOME, + KeyboardKey.Left => NativeMethods.VK_LEFT, + KeyboardKey.Up => NativeMethods.VK_UP, + KeyboardKey.Right => NativeMethods.VK_RIGHT, + KeyboardKey.Down => NativeMethods.VK_DOWN, + KeyboardKey.Select => NativeMethods.VK_SELECT, + KeyboardKey.Print => NativeMethods.VK_PRINT, + KeyboardKey.Execute => NativeMethods.VK_EXECUTE, + KeyboardKey.Insert => NativeMethods.VK_INSERT, + KeyboardKey.Delete => NativeMethods.VK_DELETE, + KeyboardKey.Help => NativeMethods.VK_HELP, + KeyboardKey.D0 => NativeMethods.VK_0, + KeyboardKey.D1 => NativeMethods.VK_1, + KeyboardKey.D2 => NativeMethods.VK_2, + KeyboardKey.D3 => NativeMethods.VK_3, + KeyboardKey.D4 => NativeMethods.VK_4, + KeyboardKey.D5 => NativeMethods.VK_5, + KeyboardKey.D6 => NativeMethods.VK_6, + KeyboardKey.D7 => NativeMethods.VK_7, + KeyboardKey.D8 => NativeMethods.VK_8, + KeyboardKey.D9 => NativeMethods.VK_9, + KeyboardKey.A => NativeMethods.VK_A, + KeyboardKey.B => NativeMethods.VK_B, + KeyboardKey.C => NativeMethods.VK_C, + KeyboardKey.D => NativeMethods.VK_D, + KeyboardKey.E => NativeMethods.VK_E, + KeyboardKey.F => NativeMethods.VK_F, + KeyboardKey.G => NativeMethods.VK_G, + KeyboardKey.H => NativeMethods.VK_H, + KeyboardKey.I => NativeMethods.VK_I, + KeyboardKey.J => NativeMethods.VK_J, + KeyboardKey.K => NativeMethods.VK_K, + KeyboardKey.L => NativeMethods.VK_L, + KeyboardKey.M => NativeMethods.VK_M, + KeyboardKey.N => NativeMethods.VK_N, + KeyboardKey.O => NativeMethods.VK_O, + KeyboardKey.P => NativeMethods.VK_P, + KeyboardKey.Q => NativeMethods.VK_Q, + KeyboardKey.R => NativeMethods.VK_R, + KeyboardKey.S => NativeMethods.VK_S, + KeyboardKey.T => NativeMethods.VK_T, + KeyboardKey.U => NativeMethods.VK_U, + KeyboardKey.V => NativeMethods.VK_V, + KeyboardKey.W => NativeMethods.VK_W, + KeyboardKey.X => NativeMethods.VK_X, + KeyboardKey.Y => NativeMethods.VK_Y, + KeyboardKey.Z => NativeMethods.VK_Z, + KeyboardKey.LWin => NativeMethods.VK_LWIN, + KeyboardKey.RWin => NativeMethods.VK_RWIN, + KeyboardKey.Apps => NativeMethods.VK_APPS, + KeyboardKey.Sleep => NativeMethods.VK_SLEEP, + KeyboardKey.NumPad0 => NativeMethods.VK_NUMPAD0, + KeyboardKey.NumPad1 => NativeMethods.VK_NUMPAD1, + KeyboardKey.NumPad2 => NativeMethods.VK_NUMPAD2, + KeyboardKey.NumPad3 => NativeMethods.VK_NUMPAD3, + KeyboardKey.NumPad4 => NativeMethods.VK_NUMPAD4, + KeyboardKey.NumPad5 => NativeMethods.VK_NUMPAD5, + KeyboardKey.NumPad6 => NativeMethods.VK_NUMPAD6, + KeyboardKey.NumPad7 => NativeMethods.VK_NUMPAD7, + KeyboardKey.NumPad8 => NativeMethods.VK_NUMPAD8, + KeyboardKey.NumPad9 => NativeMethods.VK_NUMPAD9, + KeyboardKey.Multiply => NativeMethods.VK_MULTIPLY, + KeyboardKey.Add => NativeMethods.VK_ADD, + KeyboardKey.Separator => NativeMethods.VK_SEPARATOR, + KeyboardKey.Subtract => NativeMethods.VK_SUBTRACT, + KeyboardKey.Decimal => NativeMethods.VK_DECIMAL, + KeyboardKey.Divide => NativeMethods.VK_DIVIDE, + KeyboardKey.F1 => NativeMethods.VK_F1, + KeyboardKey.F2 => NativeMethods.VK_F2, + KeyboardKey.F3 => NativeMethods.VK_F3, + KeyboardKey.F4 => NativeMethods.VK_F4, + KeyboardKey.F5 => NativeMethods.VK_F5, + KeyboardKey.F6 => NativeMethods.VK_F6, + KeyboardKey.F7 => NativeMethods.VK_F7, + KeyboardKey.F8 => NativeMethods.VK_F8, + KeyboardKey.F9 => NativeMethods.VK_F9, + KeyboardKey.F10 => NativeMethods.VK_F10, + KeyboardKey.F11 => NativeMethods.VK_F11, + KeyboardKey.F12 => NativeMethods.VK_F12, + KeyboardKey.F13 => NativeMethods.VK_F13, + KeyboardKey.F14 => NativeMethods.VK_F14, + KeyboardKey.F15 => NativeMethods.VK_F15, + KeyboardKey.F16 => NativeMethods.VK_F16, + KeyboardKey.F17 => NativeMethods.VK_F17, + KeyboardKey.F18 => NativeMethods.VK_F18, + KeyboardKey.F19 => NativeMethods.VK_F19, + KeyboardKey.F20 => NativeMethods.VK_F20, + KeyboardKey.F21 => NativeMethods.VK_F21, + KeyboardKey.F22 => NativeMethods.VK_F22, + KeyboardKey.F23 => NativeMethods.VK_F23, + KeyboardKey.F24 => NativeMethods.VK_F24, + KeyboardKey.NumLock => NativeMethods.VK_NUMLOCK, + KeyboardKey.Scroll => NativeMethods.VK_SCROLL, + KeyboardKey.LeftShift => NativeMethods.VK_LSHIFT, + KeyboardKey.RightShift => NativeMethods.VK_RSHIFT, + KeyboardKey.LeftCtrl => NativeMethods.VK_LCONTROL, + KeyboardKey.RightCtrl => NativeMethods.VK_RCONTROL, + KeyboardKey.LeftAlt => NativeMethods.VK_LMENU, + KeyboardKey.RightAlt => NativeMethods.VK_RMENU, + KeyboardKey.BrowserBack => NativeMethods.VK_BROWSER_BACK, + KeyboardKey.BrowserForward => NativeMethods.VK_BROWSER_FORWARD, + KeyboardKey.BrowserRefresh => NativeMethods.VK_BROWSER_REFRESH, + KeyboardKey.BrowserStop => NativeMethods.VK_BROWSER_STOP, + KeyboardKey.BrowserSearch => NativeMethods.VK_BROWSER_SEARCH, + KeyboardKey.BrowserFavorites => NativeMethods.VK_BROWSER_FAVORITES, + KeyboardKey.BrowserHome => NativeMethods.VK_BROWSER_HOME, + KeyboardKey.VolumeMute => NativeMethods.VK_VOLUME_MUTE, + KeyboardKey.VolumeDown => NativeMethods.VK_VOLUME_DOWN, + KeyboardKey.VolumeUp => NativeMethods.VK_VOLUME_UP, + KeyboardKey.MediaNextTrack => NativeMethods.VK_MEDIA_NEXT_TRACK, + KeyboardKey.MediaPreviousTrack => NativeMethods.VK_MEDIA_PREV_TRACK, + KeyboardKey.MediaStop => NativeMethods.VK_MEDIA_STOP, + KeyboardKey.MediaPlayPause => NativeMethods.VK_MEDIA_PLAY_PAUSE, + KeyboardKey.LaunchMail => NativeMethods.VK_LAUNCH_MAIL, + KeyboardKey.SelectMedia => NativeMethods.VK_LAUNCH_MEDIA_SELECT, + KeyboardKey.LaunchApplication1 => NativeMethods.VK_LAUNCH_APP1, + KeyboardKey.LaunchApplication2 => NativeMethods.VK_LAUNCH_APP2, + KeyboardKey.OemSemicolon => NativeMethods.VK_OEM_1, + KeyboardKey.OemPlus => NativeMethods.VK_OEM_PLUS, + KeyboardKey.OemComma => NativeMethods.VK_OEM_COMMA, + KeyboardKey.OemMinus => NativeMethods.VK_OEM_MINUS, + KeyboardKey.OemPeriod => NativeMethods.VK_OEM_PERIOD, + KeyboardKey.OemQuestion => NativeMethods.VK_OEM_2, + KeyboardKey.OemTilde => NativeMethods.VK_OEM_3, + KeyboardKey.OemOpenBrackets => NativeMethods.VK_OEM_4, + KeyboardKey.OemPipe => NativeMethods.VK_OEM_5, + KeyboardKey.OemCloseBrackets => NativeMethods.VK_OEM_6, + KeyboardKey.OemQuotes => NativeMethods.VK_OEM_7, + KeyboardKey.OemBackslash => NativeMethods.VK_OEM_102, + KeyboardKey.ImeProcessed => NativeMethods.VK_PROCESSKEY, + KeyboardKey.OemAttn => NativeMethods.VK_ATTN, + KeyboardKey.OemFinish => NativeMethods.VK_OEM_FINISH, + KeyboardKey.OemCopy => NativeMethods.VK_OEM_COPY, + KeyboardKey.OemAuto => NativeMethods.VK_OEM_AUTO, + KeyboardKey.OemEnlw => NativeMethods.VK_OEM_ENLW, + KeyboardKey.OemBackTab => NativeMethods.VK_OEM_BACKTAB, + KeyboardKey.Attn => NativeMethods.VK_ATTN, + KeyboardKey.CrSel => NativeMethods.VK_CRSEL, + KeyboardKey.ExSel => NativeMethods.VK_EXSEL, + KeyboardKey.EraseEof => NativeMethods.VK_EREOF, + KeyboardKey.Play => NativeMethods.VK_PLAY, + KeyboardKey.Zoom => NativeMethods.VK_ZOOM, + KeyboardKey.NoName => NativeMethods.VK_NONAME, + KeyboardKey.Pa1 => NativeMethods.VK_PA1, + KeyboardKey.OemClear => NativeMethods.VK_OEM_CLEAR, + KeyboardKey.DeadCharProcessed => 0, + _ => 0 + }; + } + + /// + /// Convert a scan code to a key, following US keyboard layout. + /// This is useful because we don't care about the keyboard layout, just the key location for effects. + /// + public static KeyboardKey KeyFromScanCode(uint scanCode) + { + return scanCode switch + { + 0x01 => KeyboardKey.Escape, + 0x02 => KeyboardKey.D1, + 0x03 => KeyboardKey.D2, + 0x04 => KeyboardKey.D3, + 0x05 => KeyboardKey.D4, + 0x06 => KeyboardKey.D5, + 0x07 => KeyboardKey.D6, + 0x08 => KeyboardKey.D7, + 0x09 => KeyboardKey.D8, + 0x0A => KeyboardKey.D9, + 0x0B => KeyboardKey.D0, + 0x0C => KeyboardKey.OemMinus, + 0x0D => KeyboardKey.OemPlus, + 0x0E => KeyboardKey.Back, + 0x0F => KeyboardKey.Tab, + 0x10 => KeyboardKey.Q, + 0x11 => KeyboardKey.W, + 0x12 => KeyboardKey.E, + 0x13 => KeyboardKey.R, + 0x14 => KeyboardKey.T, + 0x15 => KeyboardKey.Y, + 0x16 => KeyboardKey.U, + 0x17 => KeyboardKey.I, + 0x18 => KeyboardKey.O, + 0x19 => KeyboardKey.P, + 0x1A => KeyboardKey.OemOpenBrackets, + 0x1B => KeyboardKey.OemCloseBrackets, + 0x1C => KeyboardKey.Enter, + 0x1D => KeyboardKey.LeftCtrl, + 0x1E => KeyboardKey.A, + 0x1F => KeyboardKey.S, + 0x20 => KeyboardKey.D, + 0x21 => KeyboardKey.F, + 0x22 => KeyboardKey.G, + 0x23 => KeyboardKey.H, + 0x24 => KeyboardKey.J, + 0x25 => KeyboardKey.K, + 0x26 => KeyboardKey.L, + 0x27 => KeyboardKey.OemSemicolon, + 0x28 => KeyboardKey.OemQuotes, + 0x29 => KeyboardKey.OemTilde, + 0x2A => KeyboardKey.LeftShift, + 0x2B => KeyboardKey.OemPipe, + 0x2C => KeyboardKey.Z, + 0x2D => KeyboardKey.X, + 0x2E => KeyboardKey.C, + 0x2F => KeyboardKey.V, + 0x30 => KeyboardKey.B, + 0x31 => KeyboardKey.N, + 0x32 => KeyboardKey.M, + 0x33 => KeyboardKey.OemComma, + 0x34 => KeyboardKey.OemPeriod, + 0x35 => KeyboardKey.OemQuestion, + 0x36 => KeyboardKey.RightShift, + 0x37 => KeyboardKey.PrintScreen, + 0x38 => KeyboardKey.LeftAlt, + 0x39 => KeyboardKey.Space, + 0x3A => KeyboardKey.CapsLock, + 0x3B => KeyboardKey.F1, + 0x3C => KeyboardKey.F2, + 0x3D => KeyboardKey.F3, + 0x3E => KeyboardKey.F4, + 0x3F => KeyboardKey.F5, + 0x40 => KeyboardKey.F6, + 0x41 => KeyboardKey.F7, + 0x42 => KeyboardKey.F8, + 0x43 => KeyboardKey.F9, + 0x44 => KeyboardKey.F10, + 0x45 => KeyboardKey.Pause, + 0x46 => KeyboardKey.Scroll, + 0x47 => KeyboardKey.NumPad7, + 0x48 => KeyboardKey.NumPad8, + 0x49 => KeyboardKey.NumPad9, + 0x4A => KeyboardKey.Subtract, + 0x4B => KeyboardKey.NumPad4, + 0x4C => KeyboardKey.NumPad5, + 0x4D => KeyboardKey.NumPad6, + 0x4E => KeyboardKey.Add, + 0x4F => KeyboardKey.NumPad1, + 0x50 => KeyboardKey.NumPad2, + 0x51 => KeyboardKey.NumPad3, + 0x52 => KeyboardKey.NumPad0, + 0x53 => KeyboardKey.Decimal, + 0x56 => KeyboardKey.OemBackslash, + 0x57 => KeyboardKey.F11, + 0x58 => KeyboardKey.F12, + 0x5C => KeyboardKey.RWin, + 0x64 => KeyboardKey.F13, + 0x65 => KeyboardKey.F14, + 0x66 => KeyboardKey.F15, + //0x70 => KeyboardKey.kana, + 0x73 => KeyboardKey.AbntC1, + //0x79 => KeyboardKey.Convert, + //0x7B => KeyboardKey.NoConvert, + //0x7D => KeyboardKey.Yen, + 0x7E => KeyboardKey.AbntC2, + // 0x8D => KeyboardKey.NumPadEquals, + // 0x90 => KeyboardKey.PreviousTrack, + // 0x91 => KeyboardKey.At, + // 0x92 => KeyboardKey.Colon, + // 0x93 => KeyboardKey.Underline, + // 0x94 => KeyboardKey.Kanji, + // 0x95 => KeyboardKey.Stop, + // 0x96 => KeyboardKey.Ax, + 0x145 => KeyboardKey.NumLock, + _ => KeyboardKey.None + }; } } \ No newline at end of file From 02ecbfa7081f1047cd2f3c82c47be942d3681138 Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Thu, 6 Apr 2023 15:32:02 +0100 Subject: [PATCH 09/10] Simplified scan code input parsing --- .../Providers/Input/WindowsInputProvider.cs | 30 +- .../Utilities/InputUtilities.cs | 309 ++++++++---------- 2 files changed, 147 insertions(+), 192 deletions(-) diff --git a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs index c50a626df..1adc2b292 100644 --- a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs +++ b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs @@ -98,17 +98,21 @@ public class WindowsInputProvider : InputProvider private void HandleKeyboardData(RawInputData data, RawInputKeyboardData keyboardData) { - KeyboardKey key = InputUtilities.CorrectVirtualKeyAndScanCode((uint)keyboardData.Keyboard.VirutalKey, (uint)keyboardData.Keyboard.ScanCode, (uint)keyboardData.Keyboard.Flags); + KeyboardKey key = KeyboardKey.None; + try + { + key = InputUtilities.CorrectVirtualKeyAndScanCode(keyboardData.Keyboard.VirutalKey, keyboardData.Keyboard.ScanCode, (uint)keyboardData.Keyboard.Flags); + } + catch (Exception e) + { + _logger.Error("Failed to convert virtual key to Artemis key, please share this log with the developers. ScanCode: {scanCode} VK: {virtualKey} Flags: {flags}", + keyboardData.Keyboard.ScanCode, keyboardData.Keyboard.VirutalKey, keyboardData.Keyboard.Flags); + } // Debug.WriteLine($"VK: {key} ({keyboardData.Keyboard.VirutalKey}), Flags: {keyboardData.Keyboard.Flags}, Scan code: {keyboardData.Keyboard.ScanCode}"); - // Sometimes we get double hits and they resolve to None, ignore those if (key == KeyboardKey.None) return; - // Right alt triggers LeftCtrl with a different scan code for some reason, ignore those - if (key == KeyboardKey.LeftCtrl && keyboardData.Keyboard.ScanCode == 56) - return; - string? identifier = data.Device?.DevicePath; // Let the core know there is an identifier so it can store new identifications if applicable @@ -126,20 +130,6 @@ public class WindowsInputProvider : InputProvider _logger.Warning(e, "Failed to retrieve input device by its identifier"); } - // Duplicate keys with different positions can be identified by the LeftKey flag (even though its set of the key that's physically on the right) - if (keyboardData.Keyboard.Flags == RawKeyboardFlags.KeyE0 || keyboardData.Keyboard.Flags == (RawKeyboardFlags.KeyE0 | RawKeyboardFlags.Up)) - { - if (key == KeyboardKey.Enter) - key = KeyboardKey.NumPadEnter; - if (key == KeyboardKey.LeftCtrl) - key = KeyboardKey.RightCtrl; - if (key == KeyboardKey.LeftAlt) - key = KeyboardKey.RightAlt; - } - - if (key == KeyboardKey.LeftShift && keyboardData.Keyboard.ScanCode == 54) - key = KeyboardKey.RightShift; - bool isDown = keyboardData.Keyboard.Flags != RawKeyboardFlags.Up && keyboardData.Keyboard.Flags != (RawKeyboardFlags.Up | RawKeyboardFlags.KeyE0) && keyboardData.Keyboard.Flags != (RawKeyboardFlags.Up | RawKeyboardFlags.KeyE1); diff --git a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs index 3a06fccf4..d6b5a2fc6 100644 --- a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs +++ b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs @@ -67,79 +67,63 @@ public static class InputUtilities MAPVK_VK_TO_VSC_EX = 0x04 } + private readonly record struct KeystrokeInfo(int ScanCode, int VirtualKey, bool IsE0, bool IsE1); + /// /// https://blog.molecular-matters.com/2011/09/05/properly-handling-keyboard-input/ /// - public static KeyboardKey CorrectVirtualKeyAndScanCode(uint virtualKey, uint scanCode, uint flags) + public static KeyboardKey CorrectVirtualKeyAndScanCode(int virtualKey, int scanCode, uint flags) { - if (virtualKey == 255) + KeystrokeInfo info = new() { - // discard "fake keys" which are part of an escaped sequence - return KeyboardKey.None; - } - - if (virtualKey == NativeMethods.VK_CONTROL && scanCode == 0x38) - { - //fake altgr ctrl - return KeyboardKey.None; - } - - if (virtualKey == NativeMethods.VK_SHIFT) - { - // correct left-hand / right-hand SHIFT - virtualKey = MapVirtualKey(scanCode, MapVirtualKeyMapTypes.MAPVK_VSC_TO_VK); - } - else if (virtualKey == NativeMethods.VK_NUMLOCK) - { - // correct PAUSE/BREAK and NUM LOCK silliness, and set the extended bit - scanCode = MapVirtualKey(virtualKey, MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC) | 0x100; - } - - const byte RI_KEY_E0 = 0x02; - const byte RI_KEY_E1 = 0x04; - bool isE0 = (flags & RI_KEY_E0) != 0; - bool isE1 = (flags & RI_KEY_E1) != 0; - - if (isE1) - { - if (virtualKey == NativeMethods.VK_PAUSE) - { - scanCode = 0x45; - } - else - { - scanCode = MapVirtualKey(virtualKey, MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC); - } - } - KeyboardKey key = (short)virtualKey switch - { - NativeMethods.VK_CONTROL => isE0 ? KeyboardKey.RightCtrl : KeyboardKey.LeftCtrl, - NativeMethods.VK_MENU => isE0 ? KeyboardKey.RightAlt : KeyboardKey.LeftAlt, - NativeMethods.VK_RETURN => isE0 ? KeyboardKey.NumPadEnter : KeyboardKey.Enter, - NativeMethods.VK_INSERT => !isE0 ? KeyboardKey.NumPad0 : KeyboardKey.Insert, - NativeMethods.VK_DELETE => !isE0 ? KeyboardKey.NumPadDecimal : KeyboardKey.Delete, - NativeMethods.VK_HOME => !isE0 ? KeyboardKey.NumPad7 : KeyboardKey.Home, - NativeMethods.VK_END => !isE0 ? KeyboardKey.NumPad1 : KeyboardKey.End, - NativeMethods.VK_PRIOR => !isE0 ? KeyboardKey.NumPad9 : KeyboardKey.PageUp, - NativeMethods.VK_NEXT => !isE0 ? KeyboardKey.NumPad3 : KeyboardKey.PageDown, - NativeMethods.VK_LEFT => !isE0 ? KeyboardKey.NumPad4 : KeyboardKey.Left, - NativeMethods.VK_RIGHT => !isE0 ? KeyboardKey.NumPad6 : KeyboardKey.Right, - NativeMethods.VK_UP => !isE0 ? KeyboardKey.NumPad8 : KeyboardKey.Up, - NativeMethods.VK_DOWN => !isE0 ? KeyboardKey.NumPad2 : KeyboardKey.Down, - NativeMethods.VK_CLEAR => !isE0 ? KeyboardKey.NumPad5 : KeyboardKey.Clear, - NativeMethods.VK_DIVIDE => isE0 ? KeyboardKey.NumPadDivide : KeyboardKey.Divide, - NativeMethods.VK_MULTIPLY => isE0 ? KeyboardKey.NumPadMultiply : KeyboardKey.Multiply, - _ => KeyboardKey.None + ScanCode = scanCode, + VirtualKey = virtualKey, + IsE0 = (flags & 2) != 0, + IsE1 = (flags & 4) != 0 }; - if (key != KeyboardKey.None) - return key; - - key = KeyFromScanCode(scanCode); - if (key != KeyboardKey.None) - return key; - - return KeyFromVirtualKey((int)virtualKey); + return info switch + { + // Fake keys, usually escape sequences + { VirtualKey: 255 } => KeyboardKey.None, + // AltGr + { ScanCode: 56, VirtualKey: NativeMethods.VK_CONTROL, IsE0: true } => KeyboardKey.None, + + { ScanCode: 28, IsE0: true } => KeyboardKey.NumPadEnter, + { ScanCode: 28, IsE0: false } => KeyboardKey.Return, + { ScanCode: 29, IsE1: true } => KeyboardKey.Pause, + { ScanCode: 29, IsE0: true } => KeyboardKey.RightCtrl, + { ScanCode: 29, IsE0: false } => KeyboardKey.LeftCtrl, + { ScanCode: 56, IsE0: true } => KeyboardKey.RightAlt, + { ScanCode: 56, IsE0: false } => KeyboardKey.LeftAlt, + { ScanCode: 53, IsE0: true } => KeyboardKey.NumPadDivide, + { ScanCode: 53, IsE0: false } => KeyboardKey.OemQuestion, + { ScanCode: 55, IsE0: true } => KeyboardKey.PrintScreen, + { ScanCode: 55, IsE0: false } => KeyboardKey.NumPadMultiply, + { ScanCode: 71, IsE0: true } => KeyboardKey.Home, + { ScanCode: 71, IsE0: false } => KeyboardKey.NumPad7, + { ScanCode: 72, IsE0: true } => KeyboardKey.Up, + { ScanCode: 72, IsE0: false } => KeyboardKey.NumPad8, + { ScanCode: 73, IsE0: true } => KeyboardKey.PageUp, + { ScanCode: 73, IsE0: false } => KeyboardKey.NumPad9, + { ScanCode: 75, IsE0: true } => KeyboardKey.Left, + { ScanCode: 75, IsE0: false } => KeyboardKey.NumPad4, + { ScanCode: 76, IsE0: true } => KeyboardKey.Clear, + { ScanCode: 76, IsE0: false } => KeyboardKey.NumPad5, + { ScanCode: 77, IsE0: true } => KeyboardKey.Right, + { ScanCode: 77, IsE0: false } => KeyboardKey.NumPad6, + { ScanCode: 79, IsE0: true } => KeyboardKey.End, + { ScanCode: 79, IsE0: false } => KeyboardKey.NumPad1, + { ScanCode: 80, IsE0: true } => KeyboardKey.Down, + { ScanCode: 80, IsE0: false } => KeyboardKey.NumPad2, + { ScanCode: 81, IsE0: true } => KeyboardKey.PageDown, + { ScanCode: 81, IsE0: false } => KeyboardKey.NumPad3, + { ScanCode: 82, IsE0: true } => KeyboardKey.Insert, + { ScanCode: 82, IsE0: false } => KeyboardKey.NumPad0, + { ScanCode: 83, IsE0: true } => KeyboardKey.Delete, + { ScanCode: 83, IsE0: false } => KeyboardKey.NumPadDecimal, + _ => KeyFromScanCode((uint)info.ScanCode), + }; } public static bool IsKeyDown(KeyboardKey key) { @@ -529,112 +513,93 @@ public static class InputUtilities { return scanCode switch { - 0x01 => KeyboardKey.Escape, - 0x02 => KeyboardKey.D1, - 0x03 => KeyboardKey.D2, - 0x04 => KeyboardKey.D3, - 0x05 => KeyboardKey.D4, - 0x06 => KeyboardKey.D5, - 0x07 => KeyboardKey.D6, - 0x08 => KeyboardKey.D7, - 0x09 => KeyboardKey.D8, - 0x0A => KeyboardKey.D9, - 0x0B => KeyboardKey.D0, - 0x0C => KeyboardKey.OemMinus, - 0x0D => KeyboardKey.OemPlus, - 0x0E => KeyboardKey.Back, - 0x0F => KeyboardKey.Tab, - 0x10 => KeyboardKey.Q, - 0x11 => KeyboardKey.W, - 0x12 => KeyboardKey.E, - 0x13 => KeyboardKey.R, - 0x14 => KeyboardKey.T, - 0x15 => KeyboardKey.Y, - 0x16 => KeyboardKey.U, - 0x17 => KeyboardKey.I, - 0x18 => KeyboardKey.O, - 0x19 => KeyboardKey.P, - 0x1A => KeyboardKey.OemOpenBrackets, - 0x1B => KeyboardKey.OemCloseBrackets, - 0x1C => KeyboardKey.Enter, - 0x1D => KeyboardKey.LeftCtrl, - 0x1E => KeyboardKey.A, - 0x1F => KeyboardKey.S, - 0x20 => KeyboardKey.D, - 0x21 => KeyboardKey.F, - 0x22 => KeyboardKey.G, - 0x23 => KeyboardKey.H, - 0x24 => KeyboardKey.J, - 0x25 => KeyboardKey.K, - 0x26 => KeyboardKey.L, - 0x27 => KeyboardKey.OemSemicolon, - 0x28 => KeyboardKey.OemQuotes, - 0x29 => KeyboardKey.OemTilde, - 0x2A => KeyboardKey.LeftShift, - 0x2B => KeyboardKey.OemPipe, - 0x2C => KeyboardKey.Z, - 0x2D => KeyboardKey.X, - 0x2E => KeyboardKey.C, - 0x2F => KeyboardKey.V, - 0x30 => KeyboardKey.B, - 0x31 => KeyboardKey.N, - 0x32 => KeyboardKey.M, - 0x33 => KeyboardKey.OemComma, - 0x34 => KeyboardKey.OemPeriod, - 0x35 => KeyboardKey.OemQuestion, - 0x36 => KeyboardKey.RightShift, - 0x37 => KeyboardKey.PrintScreen, - 0x38 => KeyboardKey.LeftAlt, - 0x39 => KeyboardKey.Space, - 0x3A => KeyboardKey.CapsLock, - 0x3B => KeyboardKey.F1, - 0x3C => KeyboardKey.F2, - 0x3D => KeyboardKey.F3, - 0x3E => KeyboardKey.F4, - 0x3F => KeyboardKey.F5, - 0x40 => KeyboardKey.F6, - 0x41 => KeyboardKey.F7, - 0x42 => KeyboardKey.F8, - 0x43 => KeyboardKey.F9, - 0x44 => KeyboardKey.F10, - 0x45 => KeyboardKey.Pause, - 0x46 => KeyboardKey.Scroll, - 0x47 => KeyboardKey.NumPad7, - 0x48 => KeyboardKey.NumPad8, - 0x49 => KeyboardKey.NumPad9, - 0x4A => KeyboardKey.Subtract, - 0x4B => KeyboardKey.NumPad4, - 0x4C => KeyboardKey.NumPad5, - 0x4D => KeyboardKey.NumPad6, - 0x4E => KeyboardKey.Add, - 0x4F => KeyboardKey.NumPad1, - 0x50 => KeyboardKey.NumPad2, - 0x51 => KeyboardKey.NumPad3, - 0x52 => KeyboardKey.NumPad0, - 0x53 => KeyboardKey.Decimal, - 0x56 => KeyboardKey.OemBackslash, - 0x57 => KeyboardKey.F11, - 0x58 => KeyboardKey.F12, - 0x5C => KeyboardKey.RWin, - 0x64 => KeyboardKey.F13, - 0x65 => KeyboardKey.F14, - 0x66 => KeyboardKey.F15, - //0x70 => KeyboardKey.kana, - 0x73 => KeyboardKey.AbntC1, - //0x79 => KeyboardKey.Convert, - //0x7B => KeyboardKey.NoConvert, - //0x7D => KeyboardKey.Yen, - 0x7E => KeyboardKey.AbntC2, - // 0x8D => KeyboardKey.NumPadEquals, - // 0x90 => KeyboardKey.PreviousTrack, - // 0x91 => KeyboardKey.At, - // 0x92 => KeyboardKey.Colon, - // 0x93 => KeyboardKey.Underline, - // 0x94 => KeyboardKey.Kanji, - // 0x95 => KeyboardKey.Stop, - // 0x96 => KeyboardKey.Ax, - 0x145 => KeyboardKey.NumLock, - _ => KeyboardKey.None + 1 => KeyboardKey.Escape, + 2 => KeyboardKey.D1, + 3 => KeyboardKey.D2, + 4 => KeyboardKey.D3, + 5 => KeyboardKey.D4, + 6 => KeyboardKey.D5, + 7 => KeyboardKey.D6, + 8 => KeyboardKey.D7, + 9 => KeyboardKey.D8, + 10 => KeyboardKey.D9, + 11 => KeyboardKey.D0, + 12 => KeyboardKey.OemMinus, + 13 => KeyboardKey.OemPlus, + 14 => KeyboardKey.Back, + 15 => KeyboardKey.Tab, + 16 => KeyboardKey.Q, + 17 => KeyboardKey.W, + 18 => KeyboardKey.E, + 19 => KeyboardKey.R, + 20 => KeyboardKey.T, + 21 => KeyboardKey.Y, + 22 => KeyboardKey.U, + 23 => KeyboardKey.I, + 24 => KeyboardKey.O, + 25 => KeyboardKey.P, + 26 => KeyboardKey.OemOpenBrackets, + 27 => KeyboardKey.OemCloseBrackets, + 30 => KeyboardKey.A, + 31 => KeyboardKey.S, + 32 => KeyboardKey.D, + 33 => KeyboardKey.F, + 34 => KeyboardKey.G, + 35 => KeyboardKey.H, + 36 => KeyboardKey.J, + 37 => KeyboardKey.K, + 38 => KeyboardKey.L, + 39 => KeyboardKey.OemSemicolon, + 40 => KeyboardKey.OemQuotes, + 41 => KeyboardKey.OemTilde, + 42 => KeyboardKey.LeftShift, + 43 => KeyboardKey.OemPipe, + 44 => KeyboardKey.Z, + 45 => KeyboardKey.X, + 46 => KeyboardKey.C, + 47 => KeyboardKey.V, + 48 => KeyboardKey.B, + 49 => KeyboardKey.N, + 50 => KeyboardKey.M, + 51 => KeyboardKey.OemComma, + 52 => KeyboardKey.OemPeriod, + 54 => KeyboardKey.RightShift, + 57 => KeyboardKey.Space, + 58 => KeyboardKey.CapsLock, + 59 => KeyboardKey.F1, + 60 => KeyboardKey.F2, + 61 => KeyboardKey.F3, + 62 => KeyboardKey.F4, + 63 => KeyboardKey.F5, + 64 => KeyboardKey.F6, + 65 => KeyboardKey.F7, + 66 => KeyboardKey.F8, + 67 => KeyboardKey.F9, + 68 => KeyboardKey.F10, + 69 => KeyboardKey.NumLock, + 70 => KeyboardKey.Scroll, + 74 => KeyboardKey.NumPadSubtract, + 78 => KeyboardKey.NumPadAdd, + 86 => KeyboardKey.OemBackslash, //On iso, it's the key between left shift and Z + 87 => KeyboardKey.F11, + 88 => KeyboardKey.F12, + 91 => KeyboardKey.LWin, + 92 => KeyboardKey.RWin, + + //28 = enter or numpad enter + //29 = left ctrl or right ctrl + //53 = numpad slash or slash + //55 = numpad asterisk or print screen + //56 = left alt or right alt + 28 or 29 or 53 or 55 or 56 => throw new ArgumentException($"This key is unsupported: {scanCode}", nameof(scanCode)), + //numpad 789 or home, up, page up + >= 71 and <= 73 => throw new ArgumentException("Scan code is for a numpad key. These keys are unsupported.", nameof(scanCode)), + //numpad 456 or left, clear, right + >= 75 and <= 77 => throw new ArgumentException("Scan code is for a numpad key. These keys are unsupported.", nameof(scanCode)), + //numpad 1230., or end, down, page down, ins, del + >= 79 and <= 83 => throw new ArgumentException("Scan code is for a numpad key. These keys are unsupported.", nameof(scanCode)), + //shouldn't happen, but there might be more weird keys in other layouts + _ => throw new ArgumentException($"This key is unsupported: {scanCode}", nameof(scanCode)), }; } } \ No newline at end of file From 5e34a8112bccb25c150680014f12a7e2b5d99e4c Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Thu, 6 Apr 2023 22:49:54 +0100 Subject: [PATCH 10/10] Input - Removed unused keyboard keys simplified a bunch of enum flag code changed dictionaries into switches --- .../Services/Input/Enums/KeyboardKey.cs | 659 +++++++----------- .../Services/Input/InputKeyLedIdMap.cs | 370 +++++----- .../Services/Input/InputService.cs | 6 +- .../Utilities/InputUtilities.cs | 29 +- .../Providers/Input/WindowsInputProvider.cs | 51 +- .../Utilities/InputUtilities.cs | 217 ++---- .../Device/Tabs/InputMappingsTabViewModel.cs | 2 +- 7 files changed, 540 insertions(+), 794 deletions(-) diff --git a/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs b/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs index 39bfbcbd2..d58ae8f02 100644 --- a/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs +++ b/src/Artemis.Core/Services/Input/Enums/KeyboardKey.cs @@ -4,533 +4,218 @@ public enum KeyboardKey { /// No key pressed. - None = 0, - - /// The Cancel key. - Cancel = 1, - + None, + /// The Backspace key. - Back = 2, + Backspace, /// The Tab key. - Tab = 3, - - /// The Linefeed key. - LineFeed = 4, + Tab, /// The Clear key. - Clear = 5, + Clear, /// The Enter key. - Enter = 6, - - /// The Return key. - Return = 6, + Enter, /// The Pause key. - Pause = 7, + PauseBreak, /// The Caps Lock key. - CapsLock = 8, + CapsLock, + + /// The Escape key. + Escape, - /// The IME Hangul mode key. - HangulMode = 9, - - /// The IME Junja mode key. - JunjaMode = 10, // 0x0000000A - - /// The IME Final mode key. - FinalMode = 11, // 0x0000000B - - /// The IME Hanja mode key. - HanjaMode = 12, // 0x0000000C - - /// The ESC key. - Escape = 13, // 0x0000000D - - /// The IME Convert key. - ImeConvert = 14, // 0x0000000E - - /// The IME NonConvert key. - ImeNonConvert = 15, // 0x0000000F - - /// The IME Accept key. - ImeAccept = 16, // 0x00000010 - - /// The IME Mode change request. - ImeModeChange = 17, // 0x00000011 - - /// The Spacebar key. - Space = 18, // 0x00000012 + /// The Space bar key. + Space, /// The Page Up key. - PageUp = 19, // 0x00000013 - - /// The Page Up key. - Prior = 19, // 0x00000013 + PageUp, /// The Page Down key. - Next = 20, // 0x00000014 - - /// The Page Down key. - PageDown = 20, // 0x00000014 + PageDown, /// The End key. - End = 21, // 0x00000015 + End, /// The Home key. - Home = 22, // 0x00000016 + Home, /// The Left Arrow key. - Left = 23, // 0x00000017 + ArrowLeft, /// The Up Arrow key. - Up = 24, // 0x00000018 + ArrowUp, /// The Right Arrow key. - Right = 25, // 0x00000019 + ArrowRight, /// The Down Arrow key. - Down = 26, // 0x0000001A - - /// The Select key. - Select = 27, // 0x0000001B - - /// The Print key. - Print = 28, // 0x0000001C - - /// The Execute key. - Execute = 29, // 0x0000001D + ArrowDown, /// The Print Screen key. - PrintScreen = 30, // 0x0000001E + PrintScreen, /// The Insert key. - Insert = 31, // 0x0000001F + Insert, /// The Delete key. - Delete = 32, // 0x00000020 - - /// The Help key. - Help = 33, // 0x00000021 + Delete, /// The 0 (zero) key. - D0 = 34, // 0x00000022 + D0, /// The 1 (one) key. - D1 = 35, // 0x00000023 + D1, /// The 2 key. - D2 = 36, // 0x00000024 + D2, /// The 3 key. - D3 = 37, // 0x00000025 + D3, /// The 4 key. - D4 = 38, // 0x00000026 + D4, /// The 5 key. - D5 = 39, // 0x00000027 + D5, /// The 6 key. - D6 = 40, // 0x00000028 + D6, /// The 7 key. - D7 = 41, // 0x00000029 + D7, /// The 8 key. - D8 = 42, // 0x0000002A + D8, /// The 9 key. - D9 = 43, // 0x0000002B + D9, /// The A key. - A = 44, // 0x0000002C + A, /// The B key. - B = 45, // 0x0000002D + B, /// The C key. - C = 46, // 0x0000002E + C, /// The D key. - D = 47, // 0x0000002F + D, /// The E key. - E = 48, // 0x00000030 + E, /// The F key. - F = 49, // 0x00000031 + F, /// The G key. - G = 50, // 0x00000032 + G, /// The H key. - H = 51, // 0x00000033 + H, /// The I key. - I = 52, // 0x00000034 + I, /// The J key. - J = 53, // 0x00000035 + J, /// The K key. - K = 54, // 0x00000036 + K, /// The L key. - L = 55, // 0x00000037 + L, /// The M key. - M = 56, // 0x00000038 + M, /// The N key. - N = 57, // 0x00000039 + N, /// The O key. - O = 58, // 0x0000003A + O, /// The P key. - P = 59, // 0x0000003B + P, /// The Q key. - Q = 60, // 0x0000003C + Q, /// The R key. - R = 61, // 0x0000003D + R, /// The S key. - S = 62, // 0x0000003E + S, /// The T key. - T = 63, // 0x0000003F + T, /// The U key. - U = 64, // 0x00000040 + U, /// The V key. - V = 65, // 0x00000041 + V, /// The W key. - W = 66, // 0x00000042 + W, /// The X key. - X = 67, // 0x00000043 + X, /// The Y key. - Y = 68, // 0x00000044 + Y, /// The Z key. - Z = 69, // 0x00000045 + Z, /// The left Windows logo key (Microsoft Natural Keyboard). - LWin = 70, // 0x00000046 + LeftWin, /// The right Windows logo key (Microsoft Natural Keyboard). - RWin = 71, // 0x00000047 + RightWin, - /// - /// The Application key (Microsoft Natural Keyboard). Also known as the Menu key, as it displays an - /// application-specific context menu. - /// - Apps = 72, // 0x00000048 + /// The Application key. Displays an application-specific context menu. + Application, /// The Computer Sleep key. - Sleep = 73, // 0x00000049 + Sleep, + + /// The Num Lock key. + NumLock, /// The 0 key on the numeric keypad. - NumPad0 = 74, // 0x0000004A + NumPad0, /// The 1 key on the numeric keypad. - NumPad1 = 75, // 0x0000004B + NumPad1, /// The 2 key on the numeric keypad. - NumPad2 = 76, // 0x0000004C + NumPad2, /// The 3 key on the numeric keypad. - NumPad3 = 77, // 0x0000004D + NumPad3, /// The 4 key on the numeric keypad. - NumPad4 = 78, // 0x0000004E + NumPad4, /// The 5 key on the numeric keypad. - NumPad5 = 79, // 0x0000004F + NumPad5, /// The 6 key on the numeric keypad. - NumPad6 = 80, // 0x00000050 + NumPad6, /// The 7 key on the numeric keypad. - NumPad7 = 81, // 0x00000051 + NumPad7, /// The 8 key on the numeric keypad. - NumPad8 = 82, // 0x00000052 + NumPad8, /// The 9 key on the numeric keypad. - NumPad9 = 83, // 0x00000053 - - /// The Multiply key. - Multiply = 84, // 0x00000054 - - /// The Add key. - Add = 85, // 0x00000055 - - /// The Separator key. - Separator = 86, // 0x00000056 - - /// The Subtract key. - Subtract = 87, // 0x00000057 - - /// The Decimal key. - Decimal = 88, // 0x00000058 - - /// The Divide key. - Divide = 89, // 0x00000059 - - /// The F1 key. - F1 = 90, // 0x0000005A - - /// The F2 key. - F2 = 91, // 0x0000005B - - /// The F3 key. - F3 = 92, // 0x0000005C - - /// The F4 key. - F4 = 93, // 0x0000005D - - /// The F5 key. - F5 = 94, // 0x0000005E - - /// The F6 key. - F6 = 95, // 0x0000005F - - /// The F7 key. - F7 = 96, // 0x00000060 - - /// The F8 key. - F8 = 97, // 0x00000061 - - /// The F9 key. - F9 = 98, // 0x00000062 - - /// The F10 key. - F10 = 99, // 0x00000063 - - /// The F11 key. - F11 = 100, // 0x00000064 - - /// The F12 key. - F12 = 101, // 0x00000065 - - /// The F13 key. - F13 = 102, // 0x00000066 - - /// The F14 key. - F14 = 103, // 0x00000067 - - /// The F15 key. - F15 = 104, // 0x00000068 - - /// The F16 key. - F16 = 105, // 0x00000069 - - /// The F17 key. - F17 = 106, // 0x0000006A - - /// The F18 key. - F18 = 107, // 0x0000006B - - /// The F19 key. - F19 = 108, // 0x0000006C - - /// The F20 key. - F20 = 109, // 0x0000006D - - /// The F21 key. - F21 = 110, // 0x0000006E - - /// The F22 key. - F22 = 111, // 0x0000006F - - /// The F23 key. - F23 = 112, // 0x00000070 - - /// The F24 key. - F24 = 113, // 0x00000071 - - /// The Num Lock key. - NumLock = 114, // 0x00000072 - - /// The Scroll Lock key. - Scroll = 115, // 0x00000073 - - /// The left Shift key. - LeftShift = 116, // 0x00000074 - - /// The right Shift key. - RightShift = 117, // 0x00000075 - - /// The left CTRL key. - LeftCtrl = 118, // 0x00000076 - - /// The right CTRL key. - RightCtrl = 119, // 0x00000077 - - /// The left ALT key. - LeftAlt = 120, // 0x00000078 - - /// The right ALT key. - RightAlt = 121, // 0x00000079 - - /// The Browser Back key. - BrowserBack = 122, // 0x0000007A - - /// The Browser Forward key. - BrowserForward = 123, // 0x0000007B - - /// The Browser Refresh key. - BrowserRefresh = 124, // 0x0000007C - - /// The Browser Stop key. - BrowserStop = 125, // 0x0000007D - - /// The Browser Search key. - BrowserSearch = 126, // 0x0000007E - - /// The Browser Favorites key. - BrowserFavorites = 127, // 0x0000007F - - /// The Browser Home key. - BrowserHome = 128, // 0x00000080 - - /// The Volume Mute key. - VolumeMute = 129, // 0x00000081 - - /// The Volume Down key. - VolumeDown = 130, // 0x00000082 - - /// The Volume Up key. - VolumeUp = 131, // 0x00000083 - - /// The Media Next Track key. - MediaNextTrack = 132, // 0x00000084 - - /// The Media Previous Track key. - MediaPreviousTrack = 133, // 0x00000085 - - /// The Media Stop key. - MediaStop = 134, // 0x00000086 - - /// The Media Play Pause key. - MediaPlayPause = 135, // 0x00000087 - - /// The Launch Mail key. - LaunchMail = 136, // 0x00000088 - - /// The Select Media key. - SelectMedia = 137, // 0x00000089 - - /// The Launch Application1 key. - LaunchApplication1 = 138, // 0x0000008A - - /// The Launch Application2 key. - LaunchApplication2 = 139, // 0x0000008B - - /// The OEM Semicolon key. - OemSemicolon = 140, // 0x0000008C - - /// The OEM Addition key. - OemPlus = 141, // 0x0000008D - - /// The OEM Comma key. - OemComma = 142, // 0x0000008E - - /// The OEM Minus key. - OemMinus = 143, // 0x0000008F - - /// The OEM Period key. - OemPeriod = 144, // 0x00000091 - - /// The OEM Question key. - OemQuestion = 145, // 0x00000092 - - /// The OEM Tilde key. - OemTilde = 146, // 0x00000092 - - /// The ABNT_C1 (Brazilian) key. - AbntC1 = 147, // 0x00000093 - - /// The ABNT_C2 (Brazilian) key. - AbntC2 = 148, // 0x00000095 - - /// The OEM Open Brackets key. - OemOpenBrackets = 149, // 0x00000096 - - /// The OEM Pipe key. - OemPipe = 150, // 0x00000096 - - /// The OEM Close Brackets key. - OemCloseBrackets = 151, // 0x00000097 - - /// The OEM Quotes key. - OemQuotes = 152, // 0x00000098 - - /// The OEM Backslash key. - OemBackslash = 154, // 0x0000009A - - /// A special key masking the real key being processed by an IME. - ImeProcessed = 155, // 0x0000009B - - /// A special key masking the real key being processed as a system key. - System = 156, // 0x0000009C - - /// The OEM ATTN key. - OemAttn = 157, // 0x0000009D - - /// The OEM FINISH key. - OemFinish = 158, // 0x0000009E - - /// The OEM COPY key. - OemCopy = 159, // 0x0000009F - - /// The OEM AUTO key. - OemAuto = 160, // 0x000000A0 - - /// The OEM ENLW key. - OemEnlw = 161, // 0x000000A1 - - /// The OEM BACKTAB key. - OemBackTab = 162, // 0x000000A2 - - /// The ATTN key. - Attn = 163, // 0x000000A3 - - /// The CRSEL key. - CrSel = 164, // 0x000000A4 - - /// The EXSEL key. - ExSel = 165, // 0x000000A5 - - /// The ERASE EOF key. - EraseEof = 166, // 0x000000A6 - - /// The PLAY key. - Play = 167, // 0x000000A7 - - /// The ZOOM key. - Zoom = 168, // 0x000000A8 - - /// A constant reserved for future use. - NoName = 169, // 0x000000A9 - - /// The PA1 key. - Pa1 = 170, // 0x000000AA - - /// The OEM Clear key. - OemClear = 171, // 0x000000AB - - /// The key is used with another key to create a single combined character. - DeadCharProcessed = 172, // 0x000000AC, - + NumPad9, + /// The NumPad enter key NumPadEnter, @@ -548,4 +233,190 @@ public enum KeyboardKey /// The NumPad decimal key NumPadDecimal, + + /// The NumPad separator key (lower half of the "Add" key on some keyboards) + NumPadSeparator, + + /// The F1 key. + F1, + + /// The F2 key. + F2, + + /// The F3 key. + F3, + + /// The F4 key. + F4, + + /// The F5 key. + F5, + + /// The F6 key. + F6, + + /// The F7 key. + F7, + + /// The F8 key. + F8, + + /// The F9 key. + F9, + + /// The F10 key. + F10, + + /// The F11 key. + F11, + + /// The F12 key. + F12, + + /// The F13 key. + F13, + + /// The F14 key. + F14, + + /// The F15 key. + F15, + + /// The F16 key. + F16, + + /// The F17 key. + F17, + + /// The F18 key. + F18, + + /// The F19 key. + F19, + + /// The F20 key. + F20, + + /// The F21 key. + F21, + + /// The F22 key. + F22, + + /// The F23 key. + F23, + + /// The F24 key. + F24, + + /// The Scroll Lock key. + ScrollLock, + + /// The left Shift key. + LeftShift, + + /// The right Shift key. + RightShift, + + /// The left CTRL key. + LeftCtrl, + + /// The right CTRL key. + RightCtrl, + + /// The left ALT key. + LeftAlt, + + /// The right ALT key. + RightAlt, + + /// The Browser Back key. + BrowserBack, + + /// The Browser Forward key. + BrowserForward, + + /// The Browser Refresh key. + BrowserRefresh, + + /// The Browser Stop key. + BrowserStop, + + /// The Browser Search key. + BrowserSearch, + + /// The Browser Favorites key. + BrowserFavorites, + + /// The Browser Home key. + BrowserHome, + + /// The Volume Mute key. + VolumeMute, + + /// The Volume Down key. + VolumeDown, + + /// The Volume Up key. + VolumeUp, + + /// The Media Next Track key. + MediaNextTrack, + + /// The Media Previous Track key. + MediaPreviousTrack, + + /// The Media Stop key. + MediaStop, + + /// The Media Play Pause key. + MediaPlayPause, + + /// The Launch Mail key. + LaunchMail, + + /// The Select Media key. + SelectMedia, + + /// The Launch Application1 key. + FileBrowser, + + /// The Launch Application2 key. + Calculator, + + /// The Semicolon key. + OemSemicolon, + + /// The Addition key. + OemPlus, + + /// The Comma key. + OemComma, + + /// The Minus key. + OemMinus, + + /// The Period key. + OemPeriod, + + /// The Question key. + OemQuestion, + + /// The Tilde key. + OemTilde, + + /// The OEM Open Brackets key. + OemOpenBrackets, + + /// The OEM Close Brackets key. + OemCloseBrackets, + + /// The OEM Pipe key. The backslash key next to enter. + OemPipe, + + /// The OEM Quotes key. + OemQuotes, + + /// The OEM Backslash key. On iso, it's the key between left shift and Z + OemBackslash, } \ No newline at end of file diff --git a/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs b/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs index b240c7f51..45608664e 100644 --- a/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs +++ b/src/Artemis.Core/Services/Input/InputKeyLedIdMap.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using RGB.NET.Core; namespace Artemis.Core.Services; @@ -9,199 +10,186 @@ namespace Artemis.Core.Services; public static class InputKeyUtilities { /// - /// A dictionary of mappings between and + /// Tries to convert a to a . /// - public static readonly Dictionary KeyboardKeyLedIdMap = new() + public static bool TryGetLedIdFromKeyboardKey(KeyboardKey key, out LedId ledId) { - {KeyboardKey.None, LedId.Keyboard_Custom1}, - {KeyboardKey.Cancel, LedId.Keyboard_Custom2}, - {KeyboardKey.Back, LedId.Keyboard_Backspace}, - {KeyboardKey.Tab, LedId.Keyboard_Tab}, - {KeyboardKey.LineFeed, LedId.Keyboard_Custom3}, - {KeyboardKey.Clear, LedId.Keyboard_Custom4}, - {KeyboardKey.Enter, LedId.Keyboard_Enter}, - {KeyboardKey.Pause, LedId.Keyboard_PauseBreak}, - {KeyboardKey.CapsLock, LedId.Keyboard_CapsLock}, - {KeyboardKey.HangulMode, LedId.Keyboard_Custom4}, - {KeyboardKey.JunjaMode, LedId.Keyboard_Custom5}, - {KeyboardKey.FinalMode, LedId.Keyboard_Custom6}, - {KeyboardKey.HanjaMode, LedId.Keyboard_Custom7}, - {KeyboardKey.Escape, LedId.Keyboard_Escape}, - {KeyboardKey.ImeConvert, LedId.Keyboard_Custom8}, - {KeyboardKey.ImeNonConvert, LedId.Keyboard_Custom9}, - {KeyboardKey.ImeAccept, LedId.Keyboard_Custom10}, - {KeyboardKey.ImeModeChange, LedId.Keyboard_Custom11}, - {KeyboardKey.Space, LedId.Keyboard_Space}, - {KeyboardKey.PageUp, LedId.Keyboard_PageUp}, - {KeyboardKey.PageDown, LedId.Keyboard_PageDown}, - {KeyboardKey.End, LedId.Keyboard_End}, - {KeyboardKey.Home, LedId.Keyboard_Home}, - {KeyboardKey.Left, LedId.Keyboard_ArrowLeft}, - {KeyboardKey.Up, LedId.Keyboard_ArrowUp}, - {KeyboardKey.Right, LedId.Keyboard_ArrowRight}, - {KeyboardKey.Down, LedId.Keyboard_ArrowDown}, - {KeyboardKey.Select, LedId.Keyboard_Custom12}, - {KeyboardKey.Print, LedId.Keyboard_Custom13}, - {KeyboardKey.Execute, LedId.Keyboard_Custom14}, - {KeyboardKey.PrintScreen, LedId.Keyboard_PrintScreen}, - {KeyboardKey.Insert, LedId.Keyboard_Insert}, - {KeyboardKey.Delete, LedId.Keyboard_Delete}, - {KeyboardKey.Help, LedId.Keyboard_Custom15}, - {KeyboardKey.D0, LedId.Keyboard_0}, - {KeyboardKey.D1, LedId.Keyboard_1}, - {KeyboardKey.D2, LedId.Keyboard_2}, - {KeyboardKey.D3, LedId.Keyboard_3}, - {KeyboardKey.D4, LedId.Keyboard_4}, - {KeyboardKey.D5, LedId.Keyboard_5}, - {KeyboardKey.D6, LedId.Keyboard_6}, - {KeyboardKey.D7, LedId.Keyboard_7}, - {KeyboardKey.D8, LedId.Keyboard_8}, - {KeyboardKey.D9, LedId.Keyboard_9}, - {KeyboardKey.A, LedId.Keyboard_A}, - {KeyboardKey.B, LedId.Keyboard_B}, - {KeyboardKey.C, LedId.Keyboard_C}, - {KeyboardKey.D, LedId.Keyboard_D}, - {KeyboardKey.E, LedId.Keyboard_E}, - {KeyboardKey.F, LedId.Keyboard_F}, - {KeyboardKey.G, LedId.Keyboard_G}, - {KeyboardKey.H, LedId.Keyboard_H}, - {KeyboardKey.I, LedId.Keyboard_I}, - {KeyboardKey.J, LedId.Keyboard_J}, - {KeyboardKey.K, LedId.Keyboard_K}, - {KeyboardKey.L, LedId.Keyboard_L}, - {KeyboardKey.M, LedId.Keyboard_M}, - {KeyboardKey.N, LedId.Keyboard_N}, - {KeyboardKey.O, LedId.Keyboard_O}, - {KeyboardKey.P, LedId.Keyboard_P}, - {KeyboardKey.Q, LedId.Keyboard_Q}, - {KeyboardKey.R, LedId.Keyboard_R}, - {KeyboardKey.S, LedId.Keyboard_S}, - {KeyboardKey.T, LedId.Keyboard_T}, - {KeyboardKey.U, LedId.Keyboard_U}, - {KeyboardKey.V, LedId.Keyboard_V}, - {KeyboardKey.W, LedId.Keyboard_W}, - {KeyboardKey.X, LedId.Keyboard_X}, - {KeyboardKey.Y, LedId.Keyboard_Y}, - {KeyboardKey.Z, LedId.Keyboard_Z}, - {KeyboardKey.LWin, LedId.Keyboard_LeftGui}, - {KeyboardKey.RWin, LedId.Keyboard_RightGui}, - {KeyboardKey.Apps, LedId.Keyboard_Application}, - {KeyboardKey.Sleep, LedId.Keyboard_Custom16}, - {KeyboardKey.NumPad0, LedId.Keyboard_Num0}, - {KeyboardKey.NumPad1, LedId.Keyboard_Num1}, - {KeyboardKey.NumPad2, LedId.Keyboard_Num2}, - {KeyboardKey.NumPad3, LedId.Keyboard_Num3}, - {KeyboardKey.NumPad4, LedId.Keyboard_Num4}, - {KeyboardKey.NumPad5, LedId.Keyboard_Num5}, - {KeyboardKey.NumPad6, LedId.Keyboard_Num6}, - {KeyboardKey.NumPad7, LedId.Keyboard_Num7}, - {KeyboardKey.NumPad8, LedId.Keyboard_Num8}, - {KeyboardKey.NumPad9, LedId.Keyboard_Num9}, - {KeyboardKey.Multiply, LedId.Keyboard_NumAsterisk}, - {KeyboardKey.Add, LedId.Keyboard_NumPlus}, - {KeyboardKey.Separator, LedId.Keyboard_NumEnter}, // unverified - {KeyboardKey.Subtract, LedId.Keyboard_NumMinus}, - {KeyboardKey.Decimal, LedId.Keyboard_NumPeriodAndDelete}, - {KeyboardKey.Divide, LedId.Keyboard_NumSlash}, - {KeyboardKey.F1, LedId.Keyboard_F1}, - {KeyboardKey.F2, LedId.Keyboard_F2}, - {KeyboardKey.F3, LedId.Keyboard_F3}, - {KeyboardKey.F4, LedId.Keyboard_F4}, - {KeyboardKey.F5, LedId.Keyboard_F5}, - {KeyboardKey.F6, LedId.Keyboard_F6}, - {KeyboardKey.F7, LedId.Keyboard_F7}, - {KeyboardKey.F8, LedId.Keyboard_F8}, - {KeyboardKey.F9, LedId.Keyboard_F9}, - {KeyboardKey.F10, LedId.Keyboard_F10}, - {KeyboardKey.F11, LedId.Keyboard_F11}, - {KeyboardKey.F12, LedId.Keyboard_F12}, - {KeyboardKey.F13, LedId.Keyboard_Custom17}, - {KeyboardKey.F14, LedId.Keyboard_Custom18}, - {KeyboardKey.F15, LedId.Keyboard_Custom19}, - {KeyboardKey.F16, LedId.Keyboard_Custom20}, - {KeyboardKey.F17, LedId.Keyboard_Custom21}, - {KeyboardKey.F18, LedId.Keyboard_Custom22}, - {KeyboardKey.F19, LedId.Keyboard_Custom23}, - {KeyboardKey.F20, LedId.Keyboard_Custom24}, - {KeyboardKey.F21, LedId.Keyboard_Custom25}, - {KeyboardKey.F22, LedId.Keyboard_Custom26}, - {KeyboardKey.F23, LedId.Keyboard_Custom27}, - {KeyboardKey.F24, LedId.Keyboard_Custom28}, - {KeyboardKey.NumLock, LedId.Keyboard_NumLock}, - {KeyboardKey.Scroll, LedId.Keyboard_ScrollLock}, - {KeyboardKey.LeftShift, LedId.Keyboard_LeftShift}, - {KeyboardKey.RightShift, LedId.Keyboard_RightShift}, - {KeyboardKey.LeftCtrl, LedId.Keyboard_LeftCtrl}, - {KeyboardKey.RightCtrl, LedId.Keyboard_RightCtrl}, - {KeyboardKey.LeftAlt, LedId.Keyboard_LeftAlt}, - {KeyboardKey.RightAlt, LedId.Keyboard_RightAlt}, - {KeyboardKey.BrowserBack, LedId.Keyboard_Custom29}, - {KeyboardKey.BrowserForward, LedId.Keyboard_Custom30}, - {KeyboardKey.BrowserRefresh, LedId.Keyboard_Custom31}, - {KeyboardKey.BrowserStop, LedId.Keyboard_Custom32}, - {KeyboardKey.BrowserSearch, LedId.Keyboard_Custom33}, - {KeyboardKey.BrowserFavorites, LedId.Keyboard_Custom34}, - {KeyboardKey.BrowserHome, LedId.Keyboard_Custom35}, - {KeyboardKey.VolumeMute, LedId.Keyboard_MediaMute}, - {KeyboardKey.VolumeDown, LedId.Keyboard_MediaVolumeDown}, - {KeyboardKey.VolumeUp, LedId.Keyboard_MediaVolumeUp}, - {KeyboardKey.MediaNextTrack, LedId.Keyboard_MediaNextTrack}, - {KeyboardKey.MediaPreviousTrack, LedId.Keyboard_MediaPreviousTrack}, - {KeyboardKey.MediaStop, LedId.Keyboard_MediaStop}, - {KeyboardKey.MediaPlayPause, LedId.Keyboard_MediaPlay}, - {KeyboardKey.LaunchMail, LedId.Keyboard_Custom36}, - {KeyboardKey.SelectMedia, LedId.Keyboard_Custom37}, - {KeyboardKey.LaunchApplication1, LedId.Keyboard_Custom38}, - {KeyboardKey.LaunchApplication2, LedId.Keyboard_Custom39}, - {KeyboardKey.OemSemicolon, LedId.Keyboard_SemicolonAndColon}, - {KeyboardKey.OemPlus, LedId.Keyboard_EqualsAndPlus}, - {KeyboardKey.OemMinus, LedId.Keyboard_MinusAndUnderscore}, - {KeyboardKey.OemComma, LedId.Keyboard_CommaAndLessThan}, - {KeyboardKey.OemPeriod, LedId.Keyboard_PeriodAndBiggerThan}, - {KeyboardKey.OemQuestion, LedId.Keyboard_SlashAndQuestionMark}, - {KeyboardKey.OemTilde, LedId.Keyboard_GraveAccentAndTilde}, - {KeyboardKey.AbntC1, LedId.Keyboard_Custom40}, - {KeyboardKey.AbntC2, LedId.Keyboard_Custom41}, - {KeyboardKey.OemOpenBrackets, LedId.Keyboard_BracketLeft}, - {KeyboardKey.OemPipe, LedId.Keyboard_Backslash}, - {KeyboardKey.OemCloseBrackets, LedId.Keyboard_BracketRight}, - {KeyboardKey.OemQuotes, LedId.Keyboard_ApostropheAndDoubleQuote}, - {KeyboardKey.OemBackslash, LedId.Keyboard_NonUsBackslash}, - {KeyboardKey.ImeProcessed, LedId.Keyboard_Custom43}, - {KeyboardKey.System, LedId.Keyboard_Custom44}, - {KeyboardKey.OemAttn, LedId.Keyboard_Custom45}, - {KeyboardKey.OemFinish, LedId.Keyboard_Custom46}, - {KeyboardKey.OemCopy, LedId.Keyboard_Custom47}, - {KeyboardKey.OemAuto, LedId.Keyboard_Custom48}, - {KeyboardKey.OemEnlw, LedId.Keyboard_Custom49}, - {KeyboardKey.OemBackTab, LedId.Keyboard_Custom50}, - {KeyboardKey.Attn, LedId.Keyboard_Custom51}, - {KeyboardKey.CrSel, LedId.Keyboard_Custom52}, - {KeyboardKey.ExSel, LedId.Keyboard_Custom53}, - {KeyboardKey.EraseEof, LedId.Keyboard_Custom54}, - {KeyboardKey.Play, LedId.Keyboard_MediaPlay}, - {KeyboardKey.Zoom, LedId.Keyboard_Custom55}, - {KeyboardKey.NoName, LedId.Keyboard_Custom56}, - {KeyboardKey.Pa1, LedId.Keyboard_Custom57}, - {KeyboardKey.OemClear, LedId.Keyboard_Custom58}, - {KeyboardKey.DeadCharProcessed, LedId.Keyboard_Custom59}, - {KeyboardKey.NumPadEnter, LedId.Keyboard_NumEnter}, - {KeyboardKey.NumPadDecimal, LedId.Keyboard_NumPeriodAndDelete}, - {KeyboardKey.NumPadDivide, LedId.Keyboard_NumSlash}, - {KeyboardKey.NumPadMultiply, LedId.Keyboard_NumAsterisk}, - {KeyboardKey.NumPadSubtract, LedId.Keyboard_NumMinus}, - {KeyboardKey.NumPadAdd, LedId.Keyboard_NumPlus}, - }; - + ledId = LedIdFromKeyboardKey(key); + return ledId != LedId.Invalid; + } + /// - /// A dictionary of mappings between and + /// Tries to convert a to a . /// - public static readonly Dictionary MouseButtonLedIdMap = new() + public static bool TryGetLedIdFromMouseButton(MouseButton button, out LedId ledId) { - {MouseButton.Left, LedId.Mouse1}, - {MouseButton.Middle, LedId.Mouse2}, - {MouseButton.Right, LedId.Mouse3}, - {MouseButton.Button4, LedId.Mouse4}, - {MouseButton.Button5, LedId.Mouse5} - }; + ledId = LedIdFromMouseButton(button); + return ledId != LedId.Invalid; + } + + /// + /// Converts a to a . + /// + public static LedId LedIdFromKeyboardKey(KeyboardKey key) + { + return key switch + { + KeyboardKey.None => LedId.Keyboard_Custom1, + KeyboardKey.Backspace => LedId.Keyboard_Backspace, + KeyboardKey.Tab => LedId.Keyboard_Tab, + KeyboardKey.Clear => LedId.Keyboard_Custom4, + KeyboardKey.Enter => LedId.Keyboard_Enter, + KeyboardKey.PauseBreak => LedId.Keyboard_PauseBreak, + KeyboardKey.CapsLock => LedId.Keyboard_CapsLock, + KeyboardKey.Escape => LedId.Keyboard_Escape, + KeyboardKey.Space => LedId.Keyboard_Space, + KeyboardKey.PageUp => LedId.Keyboard_PageUp, + KeyboardKey.PageDown => LedId.Keyboard_PageDown, + KeyboardKey.End => LedId.Keyboard_End, + KeyboardKey.Home => LedId.Keyboard_Home, + KeyboardKey.ArrowLeft => LedId.Keyboard_ArrowLeft, + KeyboardKey.ArrowUp => LedId.Keyboard_ArrowUp, + KeyboardKey.ArrowRight => LedId.Keyboard_ArrowRight, + KeyboardKey.ArrowDown => LedId.Keyboard_ArrowDown, + KeyboardKey.PrintScreen => LedId.Keyboard_PrintScreen, + KeyboardKey.Insert => LedId.Keyboard_Insert, + KeyboardKey.Delete => LedId.Keyboard_Delete, + KeyboardKey.D0 => LedId.Keyboard_0, + KeyboardKey.D1 => LedId.Keyboard_1, + KeyboardKey.D2 => LedId.Keyboard_2, + KeyboardKey.D3 => LedId.Keyboard_3, + KeyboardKey.D4 => LedId.Keyboard_4, + KeyboardKey.D5 => LedId.Keyboard_5, + KeyboardKey.D6 => LedId.Keyboard_6, + KeyboardKey.D7 => LedId.Keyboard_7, + KeyboardKey.D8 => LedId.Keyboard_8, + KeyboardKey.D9 => LedId.Keyboard_9, + KeyboardKey.A => LedId.Keyboard_A, + KeyboardKey.B => LedId.Keyboard_B, + KeyboardKey.C => LedId.Keyboard_C, + KeyboardKey.D => LedId.Keyboard_D, + KeyboardKey.E => LedId.Keyboard_E, + KeyboardKey.F => LedId.Keyboard_F, + KeyboardKey.G => LedId.Keyboard_G, + KeyboardKey.H => LedId.Keyboard_H, + KeyboardKey.I => LedId.Keyboard_I, + KeyboardKey.J => LedId.Keyboard_J, + KeyboardKey.K => LedId.Keyboard_K, + KeyboardKey.L => LedId.Keyboard_L, + KeyboardKey.M => LedId.Keyboard_M, + KeyboardKey.N => LedId.Keyboard_N, + KeyboardKey.O => LedId.Keyboard_O, + KeyboardKey.P => LedId.Keyboard_P, + KeyboardKey.Q => LedId.Keyboard_Q, + KeyboardKey.R => LedId.Keyboard_R, + KeyboardKey.S => LedId.Keyboard_S, + KeyboardKey.T => LedId.Keyboard_T, + KeyboardKey.U => LedId.Keyboard_U, + KeyboardKey.V => LedId.Keyboard_V, + KeyboardKey.W => LedId.Keyboard_W, + KeyboardKey.X => LedId.Keyboard_X, + KeyboardKey.Y => LedId.Keyboard_Y, + KeyboardKey.Z => LedId.Keyboard_Z, + KeyboardKey.LeftWin => LedId.Keyboard_LeftGui, + KeyboardKey.RightWin => LedId.Keyboard_RightGui, + KeyboardKey.Application => LedId.Keyboard_Application, + KeyboardKey.Sleep => LedId.Keyboard_Custom16, + KeyboardKey.NumPad0 => LedId.Keyboard_Num0, + KeyboardKey.NumPad1 => LedId.Keyboard_Num1, + KeyboardKey.NumPad2 => LedId.Keyboard_Num2, + KeyboardKey.NumPad3 => LedId.Keyboard_Num3, + KeyboardKey.NumPad4 => LedId.Keyboard_Num4, + KeyboardKey.NumPad5 => LedId.Keyboard_Num5, + KeyboardKey.NumPad6 => LedId.Keyboard_Num6, + KeyboardKey.NumPad7 => LedId.Keyboard_Num7, + KeyboardKey.NumPad8 => LedId.Keyboard_Num8, + KeyboardKey.NumPad9 => LedId.Keyboard_Num9, + KeyboardKey.NumPadMultiply => LedId.Keyboard_NumAsterisk, + KeyboardKey.NumPadAdd => LedId.Keyboard_NumPlus, + KeyboardKey.NumPadSeparator => LedId.Keyboard_NumEnter, + KeyboardKey.NumPadSubtract => LedId.Keyboard_NumMinus, + KeyboardKey.NumPadDecimal => LedId.Keyboard_NumPeriodAndDelete, + KeyboardKey.NumPadDivide => LedId.Keyboard_NumSlash, + KeyboardKey.F1 => LedId.Keyboard_F1, + KeyboardKey.F2 => LedId.Keyboard_F2, + KeyboardKey.F3 => LedId.Keyboard_F3, + KeyboardKey.F4 => LedId.Keyboard_F4, + KeyboardKey.F5 => LedId.Keyboard_F5, + KeyboardKey.F6 => LedId.Keyboard_F6, + KeyboardKey.F7 => LedId.Keyboard_F7, + KeyboardKey.F8 => LedId.Keyboard_F8, + KeyboardKey.F9 => LedId.Keyboard_F9, + KeyboardKey.F10 => LedId.Keyboard_F10, + KeyboardKey.F11 => LedId.Keyboard_F11, + KeyboardKey.F12 => LedId.Keyboard_F12, + KeyboardKey.F13 => LedId.Keyboard_Custom17, + KeyboardKey.F14 => LedId.Keyboard_Custom18, + KeyboardKey.F15 => LedId.Keyboard_Custom19, + KeyboardKey.F16 => LedId.Keyboard_Custom20, + KeyboardKey.F17 => LedId.Keyboard_Custom21, + KeyboardKey.F18 => LedId.Keyboard_Custom22, + KeyboardKey.F19 => LedId.Keyboard_Custom23, + KeyboardKey.F20 => LedId.Keyboard_Custom24, + KeyboardKey.F21 => LedId.Keyboard_Custom25, + KeyboardKey.F22 => LedId.Keyboard_Custom26, + KeyboardKey.F23 => LedId.Keyboard_Custom27, + KeyboardKey.F24 => LedId.Keyboard_Custom28, + KeyboardKey.NumLock => LedId.Keyboard_NumLock, + KeyboardKey.ScrollLock => LedId.Keyboard_ScrollLock, + KeyboardKey.LeftShift => LedId.Keyboard_LeftShift, + KeyboardKey.RightShift => LedId.Keyboard_RightShift, + KeyboardKey.LeftCtrl => LedId.Keyboard_LeftCtrl, + KeyboardKey.RightCtrl => LedId.Keyboard_RightCtrl, + KeyboardKey.LeftAlt => LedId.Keyboard_LeftAlt, + KeyboardKey.RightAlt => LedId.Keyboard_RightAlt, + KeyboardKey.BrowserBack => LedId.Keyboard_Custom29, + KeyboardKey.BrowserForward => LedId.Keyboard_Custom30, + KeyboardKey.BrowserRefresh => LedId.Keyboard_Custom31, + KeyboardKey.BrowserStop => LedId.Keyboard_Custom32, + KeyboardKey.BrowserSearch => LedId.Keyboard_Custom33, + KeyboardKey.BrowserFavorites => LedId.Keyboard_Custom34, + KeyboardKey.BrowserHome => LedId.Keyboard_Custom35, + KeyboardKey.VolumeMute => LedId.Keyboard_MediaMute, + KeyboardKey.VolumeDown => LedId.Keyboard_MediaVolumeDown, + KeyboardKey.VolumeUp => LedId.Keyboard_MediaVolumeUp, + KeyboardKey.MediaNextTrack => LedId.Keyboard_MediaNextTrack, + KeyboardKey.MediaPreviousTrack => LedId.Keyboard_MediaPreviousTrack, + KeyboardKey.MediaStop => LedId.Keyboard_MediaStop, + KeyboardKey.MediaPlayPause => LedId.Keyboard_MediaPlay, + KeyboardKey.LaunchMail => LedId.Keyboard_Custom36, + KeyboardKey.SelectMedia => LedId.Keyboard_Custom37, + KeyboardKey.FileBrowser => LedId.Keyboard_Custom38, + KeyboardKey.Calculator => LedId.Keyboard_Custom39, + KeyboardKey.OemSemicolon => LedId.Keyboard_SemicolonAndColon, + KeyboardKey.OemPlus => LedId.Keyboard_EqualsAndPlus, + KeyboardKey.OemMinus => LedId.Keyboard_MinusAndUnderscore, + KeyboardKey.OemComma => LedId.Keyboard_CommaAndLessThan, + KeyboardKey.OemPeriod => LedId.Keyboard_PeriodAndBiggerThan, + KeyboardKey.OemQuestion => LedId.Keyboard_SlashAndQuestionMark, + KeyboardKey.OemTilde => LedId.Keyboard_GraveAccentAndTilde, + KeyboardKey.OemOpenBrackets => LedId.Keyboard_BracketLeft, + KeyboardKey.OemPipe => LedId.Keyboard_Backslash, + KeyboardKey.OemCloseBrackets => LedId.Keyboard_BracketRight, + KeyboardKey.OemQuotes => LedId.Keyboard_ApostropheAndDoubleQuote, + KeyboardKey.OemBackslash => LedId.Keyboard_NonUsBackslash, + KeyboardKey.NumPadEnter => LedId.Keyboard_NumEnter, + _ => LedId.Invalid + }; + } + + /// + /// Converts a to a + /// + public static LedId LedIdFromMouseButton(MouseButton button) + { + return button switch + { + MouseButton.Left => LedId.Mouse1, + MouseButton.Middle => LedId.Mouse2, + MouseButton.Right => LedId.Mouse3, + MouseButton.Button4 => LedId.Mouse4, + MouseButton.Button5 => LedId.Mouse5, + _ => LedId.Invalid + }; + } } \ No newline at end of file diff --git a/src/Artemis.Core/Services/Input/InputService.cs b/src/Artemis.Core/Services/Input/InputService.cs index fa6c983f4..a7502c6ef 100644 --- a/src/Artemis.Core/Services/Input/InputService.cs +++ b/src/Artemis.Core/Services/Input/InputService.cs @@ -268,7 +268,7 @@ internal class InputService : IInputService return; // Get the LED - bool foundLedId = InputKeyUtilities.KeyboardKeyLedIdMap.TryGetValue(e.Key, out LedId ledId); + bool foundLedId = InputKeyUtilities.TryGetLedIdFromKeyboardKey(e.Key, out LedId ledId); // If we find a backslash but the keyboard is ISO, we need to use the non-US backslash. // The scancode is the same, but the LED ID is different if (ledId == LedId.Keyboard_Backslash && e.Device?.PhysicalLayout == KeyboardLayoutType.ISO) @@ -355,7 +355,7 @@ internal class InputService : IInputService else modifiers &= ~KeyboardModifierKey.Shift; } - else if (key == KeyboardKey.LWin || key == KeyboardKey.RWin) + else if (key == KeyboardKey.LeftWin || key == KeyboardKey.RightWin) { if (isDown) modifiers |= KeyboardModifierKey.Windows; @@ -394,7 +394,7 @@ internal class InputService : IInputService private void InputProviderOnMouseButtonDataReceived(object? sender, InputProviderMouseButtonEventArgs e) { - bool foundLedId = InputKeyUtilities.MouseButtonLedIdMap.TryGetValue(e.Button, out LedId ledId); + bool foundLedId = InputKeyUtilities.TryGetLedIdFromMouseButton(e.Button, out LedId ledId); ArtemisLed? led = null; if (foundLedId && e.Device != null) led = e.Device.Leds.FirstOrDefault(l => l.RgbLed.Id == ledId); diff --git a/src/Artemis.UI.Linux/Utilities/InputUtilities.cs b/src/Artemis.UI.Linux/Utilities/InputUtilities.cs index 44017e602..f898ebb1e 100644 --- a/src/Artemis.UI.Linux/Utilities/InputUtilities.cs +++ b/src/Artemis.UI.Linux/Utilities/InputUtilities.cs @@ -23,7 +23,7 @@ public static class InputUtilities LinuxKeyboardKeyCodes.KEY_0 => KeyboardKey.D0, LinuxKeyboardKeyCodes.KEY_MINUS => KeyboardKey.OemMinus, LinuxKeyboardKeyCodes.KEY_EQUAL => KeyboardKey.OemPlus, - LinuxKeyboardKeyCodes.KEY_BACKSPACE => KeyboardKey.Back, + LinuxKeyboardKeyCodes.KEY_BACKSPACE => KeyboardKey.Backspace, LinuxKeyboardKeyCodes.KEY_TAB => KeyboardKey.Tab, LinuxKeyboardKeyCodes.KEY_Q => KeyboardKey.Q, LinuxKeyboardKeyCodes.KEY_W => KeyboardKey.W, @@ -79,20 +79,20 @@ public static class InputUtilities LinuxKeyboardKeyCodes.KEY_F9 => KeyboardKey.F9, LinuxKeyboardKeyCodes.KEY_F10 => KeyboardKey.F10, LinuxKeyboardKeyCodes.KEY_NUMLOCK => KeyboardKey.NumLock, - LinuxKeyboardKeyCodes.KEY_SCROLLLOCK => KeyboardKey.Scroll, + LinuxKeyboardKeyCodes.KEY_SCROLLLOCK => KeyboardKey.ScrollLock, LinuxKeyboardKeyCodes.KEY_KP7 => KeyboardKey.NumPad7, LinuxKeyboardKeyCodes.KEY_KP8 => KeyboardKey.NumPad8, LinuxKeyboardKeyCodes.KEY_KP9 => KeyboardKey.NumPad9, - LinuxKeyboardKeyCodes.KEY_KPMINUS => KeyboardKey.Subtract, + LinuxKeyboardKeyCodes.KEY_KPMINUS => KeyboardKey.NumPadSubtract, LinuxKeyboardKeyCodes.KEY_KP4 => KeyboardKey.NumPad4, LinuxKeyboardKeyCodes.KEY_KP5 => KeyboardKey.NumPad5, LinuxKeyboardKeyCodes.KEY_KP6 => KeyboardKey.NumPad6, - LinuxKeyboardKeyCodes.KEY_KPPLUS => KeyboardKey.Add, + LinuxKeyboardKeyCodes.KEY_KPPLUS => KeyboardKey.NumPadAdd, LinuxKeyboardKeyCodes.KEY_KP1 => KeyboardKey.NumPad1, LinuxKeyboardKeyCodes.KEY_KP2 => KeyboardKey.NumPad2, LinuxKeyboardKeyCodes.KEY_KP3 => KeyboardKey.NumPad3, LinuxKeyboardKeyCodes.KEY_KP0 => KeyboardKey.NumPad0, - LinuxKeyboardKeyCodes.KEY_KPDOT => KeyboardKey.Decimal, + LinuxKeyboardKeyCodes.KEY_KPDOT => KeyboardKey.NumPadDecimal, // LinuxKeyboardKeyCodes.KEY_ZENKAKUHANKAKU => expr, // LinuxKeyboardKeyCodes.KEY_102ND => expr, LinuxKeyboardKeyCodes.KEY_F11 => KeyboardKey.F11, @@ -106,17 +106,16 @@ public static class InputUtilities // LinuxKeyboardKeyCodes.KEY_KPJPCOMMA => expr, LinuxKeyboardKeyCodes.KEY_KPENTER => KeyboardKey.NumPadEnter, LinuxKeyboardKeyCodes.KEY_RIGHTCTRL => KeyboardKey.RightCtrl, - LinuxKeyboardKeyCodes.KEY_KPSLASH => KeyboardKey.Divide, + LinuxKeyboardKeyCodes.KEY_KPSLASH => KeyboardKey.NumPadDivide, LinuxKeyboardKeyCodes.KEY_SYSRQ => KeyboardKey.PrintScreen, LinuxKeyboardKeyCodes.KEY_RIGHTALT => KeyboardKey.RightAlt, - LinuxKeyboardKeyCodes.KEY_LINEFEED => KeyboardKey.LineFeed, LinuxKeyboardKeyCodes.KEY_HOME => KeyboardKey.Home, - LinuxKeyboardKeyCodes.KEY_UP => KeyboardKey.Up, + LinuxKeyboardKeyCodes.KEY_UP => KeyboardKey.ArrowUp, LinuxKeyboardKeyCodes.KEY_PAGEUP => KeyboardKey.PageUp, - LinuxKeyboardKeyCodes.KEY_LEFT => KeyboardKey.Left, - LinuxKeyboardKeyCodes.KEY_RIGHT => KeyboardKey.Right, + LinuxKeyboardKeyCodes.KEY_LEFT => KeyboardKey.ArrowLeft, + LinuxKeyboardKeyCodes.KEY_RIGHT => KeyboardKey.ArrowRight, LinuxKeyboardKeyCodes.KEY_END => KeyboardKey.End, - LinuxKeyboardKeyCodes.KEY_DOWN => KeyboardKey.Down, + LinuxKeyboardKeyCodes.KEY_DOWN => KeyboardKey.ArrowDown, LinuxKeyboardKeyCodes.KEY_PAGEDOWN => KeyboardKey.PageDown, LinuxKeyboardKeyCodes.KEY_INSERT => KeyboardKey.Insert, LinuxKeyboardKeyCodes.KEY_DELETE => KeyboardKey.Delete, @@ -127,15 +126,15 @@ public static class InputUtilities // LinuxKeyboardKeyCodes.KEY_POWER => KeyboardKey.power, LinuxKeyboardKeyCodes.KEY_KPEQUAL => KeyboardKey.NumPadEnter, //todo: ? // LinuxKeyboardKeyCodes.KEY_KPPLUSMINUS => KeyboardKey.numpad, - LinuxKeyboardKeyCodes.KEY_PAUSE => KeyboardKey.Pause, + LinuxKeyboardKeyCodes.KEY_PAUSE => KeyboardKey.PauseBreak, // LinuxKeyboardKeyCodes.KEY_SCALE => KeyboardKey.scal, // LinuxKeyboardKeyCodes.KEY_KPCOMMA => KeyboardKey.ke, // LinuxKeyboardKeyCodes.KEY_HANGEUL => expr, // LinuxKeyboardKeyCodes.KEY_HANJA => expr, // LinuxKeyboardKeyCodes.KEY_YEN => expr, - LinuxKeyboardKeyCodes.KEY_LEFTMETA => KeyboardKey.LWin, - LinuxKeyboardKeyCodes.KEY_RIGHTMETA => KeyboardKey.RWin, - LinuxKeyboardKeyCodes.KEY_COMPOSE => KeyboardKey.Apps, + LinuxKeyboardKeyCodes.KEY_LEFTMETA => KeyboardKey.LeftWin, + LinuxKeyboardKeyCodes.KEY_RIGHTMETA => KeyboardKey.RightWin, + LinuxKeyboardKeyCodes.KEY_COMPOSE => KeyboardKey.Application, LinuxKeyboardKeyCodes.KEY_STOP => KeyboardKey.MediaStop, // LinuxKeyboardKeyCodes.KEY_AGAIN => , // LinuxKeyboardKeyCodes.KEY_PROPS => expr, diff --git a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs index 1adc2b292..2c375b3e4 100644 --- a/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs +++ b/src/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs @@ -105,7 +105,7 @@ public class WindowsInputProvider : InputProvider } catch (Exception e) { - _logger.Error("Failed to convert virtual key to Artemis key, please share this log with the developers. ScanCode: {scanCode} VK: {virtualKey} Flags: {flags}", + _logger.Error(e, "Failed to convert virtual key to Artemis key, please share this log with the developers. ScanCode: {scanCode} VK: {virtualKey} Flags: {flags}", keyboardData.Keyboard.ScanCode, keyboardData.Keyboard.VirutalKey, keyboardData.Keyboard.Flags); } // Debug.WriteLine($"VK: {key} ({keyboardData.Keyboard.VirutalKey}), Flags: {keyboardData.Keyboard.Flags}, Scan code: {keyboardData.Keyboard.ScanCode}"); @@ -130,9 +130,7 @@ public class WindowsInputProvider : InputProvider _logger.Warning(e, "Failed to retrieve input device by its identifier"); } - bool isDown = keyboardData.Keyboard.Flags != RawKeyboardFlags.Up && - keyboardData.Keyboard.Flags != (RawKeyboardFlags.Up | RawKeyboardFlags.KeyE0) && - keyboardData.Keyboard.Flags != (RawKeyboardFlags.Up | RawKeyboardFlags.KeyE1); + bool isDown = (keyboardData.Keyboard.Flags & RawKeyboardFlags.Up) == 0; OnKeyboardDataReceived(device, key, isDown); UpdateToggleStatus(); @@ -143,7 +141,7 @@ public class WindowsInputProvider : InputProvider OnKeyboardToggleStatusReceived(new KeyboardToggleStatus( InputUtilities.IsKeyToggled(KeyboardKey.NumLock), InputUtilities.IsKeyToggled(KeyboardKey.CapsLock), - InputUtilities.IsKeyToggled(KeyboardKey.Scroll) + InputUtilities.IsKeyToggled(KeyboardKey.ScrollLock) )); } @@ -201,39 +199,24 @@ public class WindowsInputProvider : InputProvider } // Button presses - MouseButton button = MouseButton.Left; - bool isDown = false; - - // Left - if (DetermineMouseButton(mouseData, RawMouseButtonFlags.LeftButtonDown, RawMouseButtonFlags.LeftButtonUp, ref isDown)) - button = MouseButton.Left; - // Middle - else if (DetermineMouseButton(mouseData, RawMouseButtonFlags.MiddleButtonDown, RawMouseButtonFlags.MiddleButtonUp, ref isDown)) - button = MouseButton.Middle; - // Right - else if (DetermineMouseButton(mouseData, RawMouseButtonFlags.RightButtonDown, RawMouseButtonFlags.RightButtonUp, ref isDown)) - button = MouseButton.Right; - // Button 4 - else if (DetermineMouseButton(mouseData, RawMouseButtonFlags.Button4Down, RawMouseButtonFlags.Button4Up, ref isDown)) - button = MouseButton.Button4; - else if (DetermineMouseButton(mouseData, RawMouseButtonFlags.Button5Down, RawMouseButtonFlags.Button5Up, ref isDown)) - button = MouseButton.Button5; + (MouseButton button, bool isDown) = mouseData.Mouse.Buttons switch + { + RawMouseButtonFlags.LeftButtonDown => (MouseButton.Left, true), + RawMouseButtonFlags.LeftButtonUp => (MouseButton.Left, false), + RawMouseButtonFlags.MiddleButtonDown => (MouseButton.Middle, true), + RawMouseButtonFlags.MiddleButtonUp => (MouseButton.Middle, false), + RawMouseButtonFlags.RightButtonDown => (MouseButton.Right, true), + RawMouseButtonFlags.RightButtonUp => (MouseButton.Right, false), + RawMouseButtonFlags.Button4Down => (MouseButton.Button4, true), + RawMouseButtonFlags.Button4Up => (MouseButton.Button4, false), + RawMouseButtonFlags.Button5Down => (MouseButton.Button5, true), + RawMouseButtonFlags.Button5Up => (MouseButton.Button5, false), + _ => (MouseButton.Left, false) + }; OnMouseButtonDataReceived(device, button, isDown); } - private bool DetermineMouseButton(RawInputMouseData data, RawMouseButtonFlags downButton, RawMouseButtonFlags upButton, ref bool isDown) - { - if (data.Mouse.Buttons == downButton || data.Mouse.Buttons == upButton) - { - isDown = data.Mouse.Buttons == downButton; - return true; - } - - isDown = false; - return false; - } - #endregion #region Native diff --git a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs index d6b5a2fc6..663ec341e 100644 --- a/src/Artemis.UI.Windows/Utilities/InputUtilities.cs +++ b/src/Artemis.UI.Windows/Utilities/InputUtilities.cs @@ -14,10 +14,7 @@ public static class InputUtilities { [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] private static extern short GetKeyState(int keyCode); - - [DllImport("user32.dll")] - private static extern uint MapVirtualKey(uint uCode, MapVirtualKeyMapTypes uMapType); - + [Flags] private enum KeyStates { @@ -25,48 +22,7 @@ public static class InputUtilities Down = 1, Toggled = 2 } - - /// - /// The set of valid MapTypes used in MapVirtualKey - /// - private enum MapVirtualKeyMapTypes : uint - { - /// - /// uCode is a virtual-key code and is translated into a scan code. - /// If it is a virtual-key code that does not distinguish between left- and - /// right-hand keys, the left-hand scan code is returned. - /// If there is no translation, the function returns 0. - /// - MAPVK_VK_TO_VSC = 0x00, - /// - /// uCode is a scan code and is translated into a virtual-key code that - /// does not distinguish between left- and right-hand keys. If there is no - /// translation, the function returns 0. - /// - MAPVK_VSC_TO_VK = 0x01, - - /// - /// uCode is a virtual-key code and is translated into an unshifted - /// character value in the low-order word of the return value. Dead keys (diacritics) - /// are indicated by setting the top bit of the return value. If there is no - /// translation, the function returns 0. - /// - MAPVK_VK_TO_CHAR = 0x02, - - /// - /// Windows NT/2000/XP: uCode is a scan code and is translated into a - /// virtual-key code that distinguishes between left- and right-hand keys. If - /// there is no translation, the function returns 0. - /// - MAPVK_VSC_TO_VK_EX = 0x03, - - /// - /// Not currently documented - /// - MAPVK_VK_TO_VSC_EX = 0x04 - } - private readonly record struct KeystrokeInfo(int ScanCode, int VirtualKey, bool IsE0, bool IsE1); /// @@ -82,6 +38,12 @@ public static class InputUtilities IsE1 = (flags & 4) != 0 }; + if (info.ScanCode == 0) + { + // These keys are media or browser keys, they don't have a scan code + return KeyFromVirtualKey(info.VirtualKey); + } + return info switch { // Fake keys, usually escape sequences @@ -90,8 +52,8 @@ public static class InputUtilities { ScanCode: 56, VirtualKey: NativeMethods.VK_CONTROL, IsE0: true } => KeyboardKey.None, { ScanCode: 28, IsE0: true } => KeyboardKey.NumPadEnter, - { ScanCode: 28, IsE0: false } => KeyboardKey.Return, - { ScanCode: 29, IsE1: true } => KeyboardKey.Pause, + { ScanCode: 28, IsE0: false } => KeyboardKey.Enter, + { ScanCode: 29, IsE1: true } => KeyboardKey.PauseBreak, { ScanCode: 29, IsE0: true } => KeyboardKey.RightCtrl, { ScanCode: 29, IsE0: false } => KeyboardKey.LeftCtrl, { ScanCode: 56, IsE0: true } => KeyboardKey.RightAlt, @@ -102,19 +64,19 @@ public static class InputUtilities { ScanCode: 55, IsE0: false } => KeyboardKey.NumPadMultiply, { ScanCode: 71, IsE0: true } => KeyboardKey.Home, { ScanCode: 71, IsE0: false } => KeyboardKey.NumPad7, - { ScanCode: 72, IsE0: true } => KeyboardKey.Up, + { ScanCode: 72, IsE0: true } => KeyboardKey.ArrowUp, { ScanCode: 72, IsE0: false } => KeyboardKey.NumPad8, { ScanCode: 73, IsE0: true } => KeyboardKey.PageUp, { ScanCode: 73, IsE0: false } => KeyboardKey.NumPad9, - { ScanCode: 75, IsE0: true } => KeyboardKey.Left, + { ScanCode: 75, IsE0: true } => KeyboardKey.ArrowLeft, { ScanCode: 75, IsE0: false } => KeyboardKey.NumPad4, { ScanCode: 76, IsE0: true } => KeyboardKey.Clear, { ScanCode: 76, IsE0: false } => KeyboardKey.NumPad5, - { ScanCode: 77, IsE0: true } => KeyboardKey.Right, + { ScanCode: 77, IsE0: true } => KeyboardKey.ArrowRight, { ScanCode: 77, IsE0: false } => KeyboardKey.NumPad6, { ScanCode: 79, IsE0: true } => KeyboardKey.End, { ScanCode: 79, IsE0: false } => KeyboardKey.NumPad1, - { ScanCode: 80, IsE0: true } => KeyboardKey.Down, + { ScanCode: 80, IsE0: true } => KeyboardKey.ArrowDown, { ScanCode: 80, IsE0: false } => KeyboardKey.NumPad2, { ScanCode: 81, IsE0: true } => KeyboardKey.PageDown, { ScanCode: 81, IsE0: false } => KeyboardKey.NumPad3, @@ -125,10 +87,6 @@ public static class InputUtilities _ => KeyFromScanCode((uint)info.ScanCode), }; } - public static bool IsKeyDown(KeyboardKey key) - { - return KeyStates.Down == (GetKeyState(key) & KeyStates.Down); - } public static bool IsKeyToggled(KeyboardKey key) { @@ -160,35 +118,25 @@ public static class InputUtilities { return virtualKey switch { - NativeMethods.VK_CANCEL => KeyboardKey.Cancel, - NativeMethods.VK_BACK => KeyboardKey.Back, + NativeMethods.VK_BACK => KeyboardKey.Backspace, NativeMethods.VK_TAB => KeyboardKey.Tab, NativeMethods.VK_CLEAR => KeyboardKey.Clear, - NativeMethods.VK_RETURN => KeyboardKey.Return, - NativeMethods.VK_PAUSE => KeyboardKey.Pause, + NativeMethods.VK_RETURN => KeyboardKey.Enter, + NativeMethods.VK_PAUSE => KeyboardKey.PauseBreak, NativeMethods.VK_CAPSLOCK => KeyboardKey.CapsLock, - NativeMethods.VK_JUNJA => KeyboardKey.JunjaMode, - NativeMethods.VK_FINAL => KeyboardKey.FinalMode, NativeMethods.VK_ESCAPE => KeyboardKey.Escape, - NativeMethods.VK_CONVERT => KeyboardKey.ImeConvert, - NativeMethods.VK_NONCONVERT => KeyboardKey.ImeNonConvert, - NativeMethods.VK_ACCEPT => KeyboardKey.ImeAccept, - NativeMethods.VK_MODECHANGE => KeyboardKey.ImeModeChange, NativeMethods.VK_SPACE => KeyboardKey.Space, NativeMethods.VK_PRIOR => KeyboardKey.PageUp, NativeMethods.VK_NEXT => KeyboardKey.PageDown, NativeMethods.VK_END => KeyboardKey.End, NativeMethods.VK_HOME => KeyboardKey.Home, - NativeMethods.VK_LEFT => KeyboardKey.Left, - NativeMethods.VK_UP => KeyboardKey.Up, - NativeMethods.VK_RIGHT => KeyboardKey.Right, - NativeMethods.VK_DOWN => KeyboardKey.Down, - NativeMethods.VK_SELECT => KeyboardKey.Select, - NativeMethods.VK_PRINT => KeyboardKey.Print, - NativeMethods.VK_EXECUTE => KeyboardKey.Execute, + NativeMethods.VK_LEFT => KeyboardKey.ArrowLeft, + NativeMethods.VK_UP => KeyboardKey.ArrowUp, + NativeMethods.VK_RIGHT => KeyboardKey.ArrowRight, + NativeMethods.VK_DOWN => KeyboardKey.ArrowDown, + NativeMethods.VK_PRINT => KeyboardKey.PrintScreen, NativeMethods.VK_INSERT => KeyboardKey.Insert, NativeMethods.VK_DELETE => KeyboardKey.Delete, - NativeMethods.VK_HELP => KeyboardKey.Help, NativeMethods.VK_0 => KeyboardKey.D0, NativeMethods.VK_1 => KeyboardKey.D1, NativeMethods.VK_2 => KeyboardKey.D2, @@ -225,9 +173,9 @@ public static class InputUtilities NativeMethods.VK_X => KeyboardKey.X, NativeMethods.VK_Y => KeyboardKey.Y, NativeMethods.VK_Z => KeyboardKey.Z, - NativeMethods.VK_LWIN => KeyboardKey.LWin, - NativeMethods.VK_RWIN => KeyboardKey.RWin, - NativeMethods.VK_APPS => KeyboardKey.Apps, + NativeMethods.VK_LWIN => KeyboardKey.LeftWin, + NativeMethods.VK_RWIN => KeyboardKey.RightWin, + NativeMethods.VK_APPS => KeyboardKey.Application, NativeMethods.VK_SLEEP => KeyboardKey.Sleep, NativeMethods.VK_NUMPAD0 => KeyboardKey.NumPad0, NativeMethods.VK_NUMPAD1 => KeyboardKey.NumPad1, @@ -239,12 +187,12 @@ public static class InputUtilities NativeMethods.VK_NUMPAD7 => KeyboardKey.NumPad7, NativeMethods.VK_NUMPAD8 => KeyboardKey.NumPad8, NativeMethods.VK_NUMPAD9 => KeyboardKey.NumPad9, - NativeMethods.VK_MULTIPLY => KeyboardKey.Multiply, - NativeMethods.VK_ADD => KeyboardKey.Add, - NativeMethods.VK_SEPARATOR => KeyboardKey.Separator, - NativeMethods.VK_SUBTRACT => KeyboardKey.Subtract, - NativeMethods.VK_DECIMAL => KeyboardKey.Decimal, - NativeMethods.VK_DIVIDE => KeyboardKey.Divide, + NativeMethods.VK_MULTIPLY => KeyboardKey.NumPadMultiply, + NativeMethods.VK_ADD => KeyboardKey.NumPadAdd, + NativeMethods.VK_SEPARATOR => KeyboardKey.NumPadSeparator, + NativeMethods.VK_SUBTRACT => KeyboardKey.NumPadSubtract, + NativeMethods.VK_DECIMAL => KeyboardKey.NumPadDecimal, + NativeMethods.VK_DIVIDE => KeyboardKey.NumPadDivide, NativeMethods.VK_F1 => KeyboardKey.F1, NativeMethods.VK_F2 => KeyboardKey.F2, NativeMethods.VK_F3 => KeyboardKey.F3, @@ -270,7 +218,7 @@ public static class InputUtilities NativeMethods.VK_F23 => KeyboardKey.F23, NativeMethods.VK_F24 => KeyboardKey.F24, NativeMethods.VK_NUMLOCK => KeyboardKey.NumLock, - NativeMethods.VK_SCROLL => KeyboardKey.Scroll, + NativeMethods.VK_SCROLL => KeyboardKey.ScrollLock, NativeMethods.VK_SHIFT => KeyboardKey.LeftShift, NativeMethods.VK_LSHIFT => KeyboardKey.LeftShift, NativeMethods.VK_RSHIFT => KeyboardKey.RightShift, @@ -296,8 +244,8 @@ public static class InputUtilities NativeMethods.VK_MEDIA_PLAY_PAUSE => KeyboardKey.MediaPlayPause, NativeMethods.VK_LAUNCH_MAIL => KeyboardKey.LaunchMail, NativeMethods.VK_LAUNCH_MEDIA_SELECT => KeyboardKey.SelectMedia, - NativeMethods.VK_LAUNCH_APP1 => KeyboardKey.LaunchApplication1, - NativeMethods.VK_LAUNCH_APP2 => KeyboardKey.LaunchApplication2, + NativeMethods.VK_LAUNCH_APP1 => KeyboardKey.FileBrowser, + NativeMethods.VK_LAUNCH_APP2 => KeyboardKey.Calculator, NativeMethods.VK_OEM_1 => KeyboardKey.OemSemicolon, NativeMethods.VK_OEM_PLUS => KeyboardKey.OemPlus, NativeMethods.VK_OEM_COMMA => KeyboardKey.OemComma, @@ -310,22 +258,6 @@ public static class InputUtilities NativeMethods.VK_OEM_6 => KeyboardKey.OemCloseBrackets, NativeMethods.VK_OEM_7 => KeyboardKey.OemQuotes, NativeMethods.VK_OEM_102 => KeyboardKey.OemBackslash, - NativeMethods.VK_PROCESSKEY => KeyboardKey.ImeProcessed, - NativeMethods.VK_OEM_ATTN => KeyboardKey.Attn, - NativeMethods.VK_OEM_FINISH => KeyboardKey.OemFinish, - NativeMethods.VK_OEM_COPY => KeyboardKey.OemCopy, - NativeMethods.VK_OEM_AUTO => KeyboardKey.OemAuto, - NativeMethods.VK_OEM_ENLW => KeyboardKey.OemEnlw, - NativeMethods.VK_OEM_BACKTAB => KeyboardKey.OemBackTab, - NativeMethods.VK_ATTN => KeyboardKey.Attn, - NativeMethods.VK_CRSEL => KeyboardKey.CrSel, - NativeMethods.VK_EXSEL => KeyboardKey.ExSel, - NativeMethods.VK_EREOF => KeyboardKey.EraseEof, - NativeMethods.VK_PLAY => KeyboardKey.Play, - NativeMethods.VK_ZOOM => KeyboardKey.Zoom, - NativeMethods.VK_NONAME => KeyboardKey.NoName, - NativeMethods.VK_PA1 => KeyboardKey.Pa1, - NativeMethods.VK_OEM_CLEAR => KeyboardKey.OemClear, _ => KeyboardKey.None }; } @@ -337,35 +269,25 @@ public static class InputUtilities { return key switch { - KeyboardKey.Cancel => NativeMethods.VK_CANCEL, - KeyboardKey.Back => NativeMethods.VK_BACK, + KeyboardKey.Backspace => NativeMethods.VK_BACK, KeyboardKey.Tab => NativeMethods.VK_TAB, KeyboardKey.Clear => NativeMethods.VK_CLEAR, - KeyboardKey.Return => NativeMethods.VK_RETURN, - KeyboardKey.Pause => NativeMethods.VK_PAUSE, + KeyboardKey.Enter => NativeMethods.VK_RETURN, + KeyboardKey.PauseBreak => NativeMethods.VK_PAUSE, KeyboardKey.CapsLock => NativeMethods.VK_CAPITAL, - KeyboardKey.JunjaMode => NativeMethods.VK_JUNJA, - KeyboardKey.FinalMode => NativeMethods.VK_FINAL, KeyboardKey.Escape => NativeMethods.VK_ESCAPE, - KeyboardKey.ImeConvert => NativeMethods.VK_CONVERT, - KeyboardKey.ImeNonConvert => NativeMethods.VK_NONCONVERT, - KeyboardKey.ImeAccept => NativeMethods.VK_ACCEPT, - KeyboardKey.ImeModeChange => NativeMethods.VK_MODECHANGE, KeyboardKey.Space => NativeMethods.VK_SPACE, - KeyboardKey.Prior => NativeMethods.VK_PRIOR, - KeyboardKey.Next => NativeMethods.VK_NEXT, + KeyboardKey.PageUp => NativeMethods.VK_PRIOR, + KeyboardKey.PageDown => NativeMethods.VK_NEXT, KeyboardKey.End => NativeMethods.VK_END, KeyboardKey.Home => NativeMethods.VK_HOME, - KeyboardKey.Left => NativeMethods.VK_LEFT, - KeyboardKey.Up => NativeMethods.VK_UP, - KeyboardKey.Right => NativeMethods.VK_RIGHT, - KeyboardKey.Down => NativeMethods.VK_DOWN, - KeyboardKey.Select => NativeMethods.VK_SELECT, - KeyboardKey.Print => NativeMethods.VK_PRINT, - KeyboardKey.Execute => NativeMethods.VK_EXECUTE, + KeyboardKey.ArrowLeft => NativeMethods.VK_LEFT, + KeyboardKey.ArrowUp => NativeMethods.VK_UP, + KeyboardKey.ArrowRight => NativeMethods.VK_RIGHT, + KeyboardKey.ArrowDown => NativeMethods.VK_DOWN, + KeyboardKey.PrintScreen => NativeMethods.VK_PRINT, KeyboardKey.Insert => NativeMethods.VK_INSERT, KeyboardKey.Delete => NativeMethods.VK_DELETE, - KeyboardKey.Help => NativeMethods.VK_HELP, KeyboardKey.D0 => NativeMethods.VK_0, KeyboardKey.D1 => NativeMethods.VK_1, KeyboardKey.D2 => NativeMethods.VK_2, @@ -402,9 +324,9 @@ public static class InputUtilities KeyboardKey.X => NativeMethods.VK_X, KeyboardKey.Y => NativeMethods.VK_Y, KeyboardKey.Z => NativeMethods.VK_Z, - KeyboardKey.LWin => NativeMethods.VK_LWIN, - KeyboardKey.RWin => NativeMethods.VK_RWIN, - KeyboardKey.Apps => NativeMethods.VK_APPS, + KeyboardKey.LeftWin => NativeMethods.VK_LWIN, + KeyboardKey.RightWin => NativeMethods.VK_RWIN, + KeyboardKey.Application => NativeMethods.VK_APPS, KeyboardKey.Sleep => NativeMethods.VK_SLEEP, KeyboardKey.NumPad0 => NativeMethods.VK_NUMPAD0, KeyboardKey.NumPad1 => NativeMethods.VK_NUMPAD1, @@ -416,12 +338,12 @@ public static class InputUtilities KeyboardKey.NumPad7 => NativeMethods.VK_NUMPAD7, KeyboardKey.NumPad8 => NativeMethods.VK_NUMPAD8, KeyboardKey.NumPad9 => NativeMethods.VK_NUMPAD9, - KeyboardKey.Multiply => NativeMethods.VK_MULTIPLY, - KeyboardKey.Add => NativeMethods.VK_ADD, - KeyboardKey.Separator => NativeMethods.VK_SEPARATOR, - KeyboardKey.Subtract => NativeMethods.VK_SUBTRACT, - KeyboardKey.Decimal => NativeMethods.VK_DECIMAL, - KeyboardKey.Divide => NativeMethods.VK_DIVIDE, + KeyboardKey.NumPadMultiply => NativeMethods.VK_MULTIPLY, + KeyboardKey.NumPadAdd => NativeMethods.VK_ADD, + KeyboardKey.NumPadSeparator => NativeMethods.VK_SEPARATOR, + KeyboardKey.NumPadSubtract => NativeMethods.VK_SUBTRACT, + KeyboardKey.NumPadDecimal => NativeMethods.VK_DECIMAL, + KeyboardKey.NumPadDivide => NativeMethods.VK_DIVIDE, KeyboardKey.F1 => NativeMethods.VK_F1, KeyboardKey.F2 => NativeMethods.VK_F2, KeyboardKey.F3 => NativeMethods.VK_F3, @@ -447,7 +369,7 @@ public static class InputUtilities KeyboardKey.F23 => NativeMethods.VK_F23, KeyboardKey.F24 => NativeMethods.VK_F24, KeyboardKey.NumLock => NativeMethods.VK_NUMLOCK, - KeyboardKey.Scroll => NativeMethods.VK_SCROLL, + KeyboardKey.ScrollLock => NativeMethods.VK_SCROLL, KeyboardKey.LeftShift => NativeMethods.VK_LSHIFT, KeyboardKey.RightShift => NativeMethods.VK_RSHIFT, KeyboardKey.LeftCtrl => NativeMethods.VK_LCONTROL, @@ -470,8 +392,8 @@ public static class InputUtilities KeyboardKey.MediaPlayPause => NativeMethods.VK_MEDIA_PLAY_PAUSE, KeyboardKey.LaunchMail => NativeMethods.VK_LAUNCH_MAIL, KeyboardKey.SelectMedia => NativeMethods.VK_LAUNCH_MEDIA_SELECT, - KeyboardKey.LaunchApplication1 => NativeMethods.VK_LAUNCH_APP1, - KeyboardKey.LaunchApplication2 => NativeMethods.VK_LAUNCH_APP2, + KeyboardKey.FileBrowser => NativeMethods.VK_LAUNCH_APP1, + KeyboardKey.Calculator => NativeMethods.VK_LAUNCH_APP2, KeyboardKey.OemSemicolon => NativeMethods.VK_OEM_1, KeyboardKey.OemPlus => NativeMethods.VK_OEM_PLUS, KeyboardKey.OemComma => NativeMethods.VK_OEM_COMMA, @@ -484,29 +406,12 @@ public static class InputUtilities KeyboardKey.OemCloseBrackets => NativeMethods.VK_OEM_6, KeyboardKey.OemQuotes => NativeMethods.VK_OEM_7, KeyboardKey.OemBackslash => NativeMethods.VK_OEM_102, - KeyboardKey.ImeProcessed => NativeMethods.VK_PROCESSKEY, - KeyboardKey.OemAttn => NativeMethods.VK_ATTN, - KeyboardKey.OemFinish => NativeMethods.VK_OEM_FINISH, - KeyboardKey.OemCopy => NativeMethods.VK_OEM_COPY, - KeyboardKey.OemAuto => NativeMethods.VK_OEM_AUTO, - KeyboardKey.OemEnlw => NativeMethods.VK_OEM_ENLW, - KeyboardKey.OemBackTab => NativeMethods.VK_OEM_BACKTAB, - KeyboardKey.Attn => NativeMethods.VK_ATTN, - KeyboardKey.CrSel => NativeMethods.VK_CRSEL, - KeyboardKey.ExSel => NativeMethods.VK_EXSEL, - KeyboardKey.EraseEof => NativeMethods.VK_EREOF, - KeyboardKey.Play => NativeMethods.VK_PLAY, - KeyboardKey.Zoom => NativeMethods.VK_ZOOM, - KeyboardKey.NoName => NativeMethods.VK_NONAME, - KeyboardKey.Pa1 => NativeMethods.VK_PA1, - KeyboardKey.OemClear => NativeMethods.VK_OEM_CLEAR, - KeyboardKey.DeadCharProcessed => 0, _ => 0 }; } /// - /// Convert a scan code to a key, following US keyboard layout. + /// Convert a scan code to our Key enum, following US keyboard layout. /// This is useful because we don't care about the keyboard layout, just the key location for effects. /// public static KeyboardKey KeyFromScanCode(uint scanCode) @@ -526,7 +431,7 @@ public static class InputUtilities 11 => KeyboardKey.D0, 12 => KeyboardKey.OemMinus, 13 => KeyboardKey.OemPlus, - 14 => KeyboardKey.Back, + 14 => KeyboardKey.Backspace, 15 => KeyboardKey.Tab, 16 => KeyboardKey.Q, 17 => KeyboardKey.W, @@ -577,14 +482,14 @@ public static class InputUtilities 67 => KeyboardKey.F9, 68 => KeyboardKey.F10, 69 => KeyboardKey.NumLock, - 70 => KeyboardKey.Scroll, + 70 => KeyboardKey.ScrollLock, 74 => KeyboardKey.NumPadSubtract, 78 => KeyboardKey.NumPadAdd, - 86 => KeyboardKey.OemBackslash, //On iso, it's the key between left shift and Z + 86 => KeyboardKey.OemBackslash, 87 => KeyboardKey.F11, 88 => KeyboardKey.F12, - 91 => KeyboardKey.LWin, - 92 => KeyboardKey.RWin, + 91 => KeyboardKey.LeftWin, + 92 => KeyboardKey.RightWin, //28 = enter or numpad enter //29 = left ctrl or right ctrl diff --git a/src/Artemis.UI/Screens/Device/Tabs/InputMappingsTabViewModel.cs b/src/Artemis.UI/Screens/Device/Tabs/InputMappingsTabViewModel.cs index a2cbf9e18..355c4a117 100644 --- a/src/Artemis.UI/Screens/Device/Tabs/InputMappingsTabViewModel.cs +++ b/src/Artemis.UI/Screens/Device/Tabs/InputMappingsTabViewModel.cs @@ -68,7 +68,7 @@ public class InputMappingsTabViewModel : ActivatableViewModelBase return; // Locate the original LED the same way the InputService did it, but supply false to Device.GetLed - bool foundLedId = InputKeyUtilities.KeyboardKeyLedIdMap.TryGetValue(e.Key, out LedId ledId); + bool foundLedId = InputKeyUtilities.TryGetLedIdFromKeyboardKey(e.Key, out LedId ledId); if (!foundLedId) return; ArtemisLed? artemisLed = Device.GetLed(ledId, false);