This commit is contained in:
Frank Skare
2019-04-16 18:14:22 +02:00
parent 9cdd76e1ac
commit c18c70c2af
15 changed files with 535 additions and 336 deletions

View File

@@ -1,5 +1,4 @@
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
@@ -10,7 +9,6 @@ namespace mpvInputEdit
{
public partial class InputWindow : Window
{
string InputString = "";
public InputItem InputItem { get; set; }
public string NewKey { get; set; } = "";
@@ -32,22 +30,21 @@ namespace mpvInputEdit
void OnKeyUp(WF.KeyEventArgs e)
{
if (e.KeyCode == WF.Keys.None) return;
char c = Convert.ToChar(e.KeyCode);
string text = InputString;
if (e.KeyCode == WF.Keys.ControlKey || e.KeyCode == WF.Keys.ShiftKey ||
e.KeyCode == WF.Keys.Menu)
{
return;
}
e.KeyCode == WF.Keys.Menu || e.KeyCode == WF.Keys.None)
if (text == "")
{
text = e.KeyCode.ToString();
if (text.Length == 1)
text = text.ToLowerInvariant();
}
return;
string text = "";
uint charValue = MapVirtualKey((uint)e.KeyCode, 2);
if (charValue == 0 || (charValue & 1 << 31) == 1 << 31)
text = e.KeyCode.ToString().Trim();
else
try {
text = Convert.ToChar(charValue).ToString().ToLower().Trim();
}
catch {}
for (int i = 0; i < 13; i++)
if ("D" + i.ToString() == text)
@@ -90,14 +87,6 @@ namespace mpvInputEdit
text = "Esc"; break;
case WF.Keys.PrintScreen:
text = "Print"; break;
case WF.Keys.Right:
text = "Right"; break;
case WF.Keys.Left:
text = "Left"; break;
case WF.Keys.Up:
text = "Up"; break;
case WF.Keys.Down:
text = "Down"; break;
case WF.Keys.Play:
text = "Play"; break;
case WF.Keys.Pause:
@@ -130,20 +119,24 @@ namespace mpvInputEdit
text = "Cancel"; break;
}
if (text == "#")
text = "Sharp";
bool shiftWasHandled = false;
bool isAlt = GetKeyState(18) < (short)0;
bool isAlt = GetKeyState(18) < (short)0;
bool isShift = GetKeyState(16) < (short)0;
bool isCtrl = GetKeyState(17) < (short)0;
bool isCtrl = GetKeyState(17) < (short)0;
if (!(isAlt && isCtrl && !isShift) && !(isShift && !isAlt && !isCtrl && !int.TryParse(text.Replace("F", ""), out int value)))
if (text.Length == 1 && isShift && text[0] != GetModifiedKey(text[0]))
{
if (isAlt) text = "Alt+" + text;
if (isShift) text = "Shift+" + text;
if (isCtrl) text = "Ctrl+" + text;
text = GetModifiedKey(text[0]).ToString();
shiftWasHandled = true;
}
if (text == "#") text = "Sharp";
if (isAlt) text = "Alt+" + text;
if (isShift && !shiftWasHandled) text = "Shift+" + text;
if (isCtrl) text = "Ctrl+" + text;
if (!string.IsNullOrEmpty(text))
SetKey(text);
}
@@ -155,13 +148,8 @@ namespace mpvInputEdit
KeyLabel.Content = key;
}
void OnKeyPress(WF.KeyPressEventArgs e)
{
if (char.IsControl(e.KeyChar))
InputString = "";
else
InputString = e.KeyChar.ToString();
}
[DllImport("user32.dll")]
static extern uint MapVirtualKey(uint uCode, uint uMapType);
public static WF.Keys ModifierKeys {
get {
@@ -176,80 +164,78 @@ namespace mpvInputEdit
}
}
public static char GetModifiedKey(char c)
{
short vkKeyScanResult = VkKeyScan(c);
if (vkKeyScanResult == -1)
return c;
uint code = (uint)vkKeyScanResult & 0xff;
byte[] b = new byte[256];
b[0x10] = 0x80;
uint r;
if (1 != ToAscii(code, code, b, out r, 0))
return c;
return (char)r;
}
void ProcessKeyEventArgs(ref WF.Message m)
{
int WM_CHAR = 258, WM_SYSCHAR = 262, /*WM_KEYDOWN = 256, WM_SYSKEYDOWN = 260,*/
WM_KEYUP = 0x0101, WM_SYSKEYUP = 0x0105, WM_APPCOMMAND = 0x0319;
int WM_KEYUP = 0x0101, WM_SYSKEYUP = 0x0105, WM_APPCOMMAND = 0x0319;
IntPtr newWParam = IntPtr.Zero;
WF.KeyEventArgs ke = null;
WF.KeyPressEventArgs kpe = null;
if (m.Msg == WM_CHAR || m.Msg == WM_SYSCHAR)
if (m.Msg == WM_KEYUP || m.Msg == WM_SYSKEYUP)
OnKeyUp(new WF.KeyEventArgs((WF.Keys)(unchecked((int)(long)m.WParam)) | ModifierKeys));
else if (m.Msg == WM_APPCOMMAND)
{
kpe = new WF.KeyPressEventArgs(unchecked((char)(long)m.WParam));
OnKeyPress(kpe);
newWParam = (IntPtr)kpe.KeyChar;
}
else
{
ke = new WF.KeyEventArgs((WF.Keys)(unchecked((int)(long)m.WParam)) | ModifierKeys);
if (m.Msg == WM_KEYUP || m.Msg == WM_SYSKEYUP)
OnKeyUp(ke);
if (m.Msg == WM_APPCOMMAND)
switch ((AppCommand)(m.LParam.ToInt32() >> 16))
{
switch ((AppCommand)(m.LParam.ToInt32() >> 16))
{
case AppCommand.MEDIA_CHANNEL_DOWN:
SetKey("Channel_Down");
break;
case AppCommand.MEDIA_CHANNEL_UP:
SetKey("Channel_Up");
break;
case AppCommand.MEDIA_FAST_FORWARD:
SetKey("Forward");
break;
case AppCommand.MEDIA_REWIND:
SetKey("Rewind");
break;
case AppCommand.MEDIA_PAUSE:
SetKey("Pause");
break;
case AppCommand.MEDIA_PLAY:
SetKey("Play");
break;
case AppCommand.MEDIA_PLAY_PAUSE:
SetKey("PlayPause");
break;
case AppCommand.MEDIA_NEXTTRACK:
SetKey("Next");
break;
case AppCommand.MEDIA_PREVIOUSTRACK:
SetKey("Prev");
break;
case AppCommand.MEDIA_RECORD:
SetKey("Record");
break;
case AppCommand.MEDIA_STOP:
SetKey("Stop");
break;
case AppCommand.VolumeUp:
SetKey("Volume_Up");
break;
case AppCommand.VolumeDown:
SetKey("Volume_Down");
break;
case AppCommand.VolumeMute:
SetKey("Mute");
break;
}
case AppCommand.MEDIA_CHANNEL_DOWN:
SetKey("Channel_Down");
break;
case AppCommand.MEDIA_CHANNEL_UP:
SetKey("Channel_Up");
break;
case AppCommand.MEDIA_FAST_FORWARD:
SetKey("Forward");
break;
case AppCommand.MEDIA_REWIND:
SetKey("Rewind");
break;
case AppCommand.MEDIA_PAUSE:
SetKey("Pause");
break;
case AppCommand.MEDIA_PLAY:
SetKey("Play");
break;
case AppCommand.MEDIA_PLAY_PAUSE:
SetKey("PlayPause");
break;
case AppCommand.MEDIA_NEXTTRACK:
SetKey("Next");
break;
case AppCommand.MEDIA_PREVIOUSTRACK:
SetKey("Prev");
break;
case AppCommand.MEDIA_RECORD:
SetKey("Record");
break;
case AppCommand.MEDIA_STOP:
SetKey("Stop");
break;
case AppCommand.VolumeUp:
SetKey("Volume_Up");
break;
case AppCommand.VolumeDown:
SetKey("Volume_Down");
break;
case AppCommand.VolumeMute:
SetKey("Mute");
break;
}
}
if (kpe != null)
m.WParam = newWParam;
}
internal enum AppCommand
@@ -273,6 +259,16 @@ namespace mpvInputEdit
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern short GetKeyState(int keyCode);
[DllImport("user32.dll")]
static extern short VkKeyScan(char c);
[DllImport("user32.dll", SetLastError = true)]
static extern int ToAscii(uint uVirtKey,
uint uScanCode,
byte[] lpKeyState,
out uint lpChar,
uint flags);
private void Window_Loaded(object sender, RoutedEventArgs e)
{
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);

View File

@@ -37,9 +37,10 @@ namespace mpvInputEdit
string searchText = SearchControl.SearchTextBox.Text.ToLower();
if (searchText == "") return true;
if (searchText.StartsWith("i ") || searchText.StartsWith("i:"))
if (searchText.StartsWith("i ") || searchText.StartsWith("i:") || searchText.Length == 1)
{
searchText = searchText.Substring(2).Trim();
if (searchText.Length > 1)
searchText = searchText.Substring(2).Trim();
if (searchText.Length < 3)
return item.Input.ToLower().Replace("ctrl+", "").Replace("shift+", "").Replace("alt+", "").Contains(searchText);

View File

@@ -12,7 +12,7 @@ using System.Windows;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("mpv(.net) input edit")]
[assembly: AssemblyCopyright("Copyright © 2017 stax76")]
[assembly: AssemblyCopyright("Copyright © 2017-2019 stax76")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -51,5 +51,5 @@ using System.Windows;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.3.0.0")]
[assembly: AssemblyFileVersion("1.3.0.0")]
[assembly: AssemblyVersion("1.5.0.0")]
[assembly: AssemblyFileVersion("1.5.0.0")]

View File

@@ -29,7 +29,7 @@ namespace Controls
SearchClearButton.Visibility = Visibility.Visible;
if (SearchTextBox.Text == "?")
MessageBox.Show("Filtering works by searching in the Input, Menu and Command but it's possible to reduce the filter scope to either of Input, Menu or Command by prefixing as follows:\n\ni <input search>\ni: <input search>\n\nm <menu search>\nm: <menu search>\n\nc <command search>\nc: <command search>", "Filtering", MessageBoxButton.OK, MessageBoxImage.Information);
MessageBox.Show("Filtering works by searching in the Input, Menu and Command but it's possible to reduce the filter scope to either of Input, Menu or Command by prefixing as follows:\n\ni <input search>\ni: <input search>\n\nm <menu search>\nm: <menu search>\n\nc <command search>\nc: <command search>\n\nIf only one character is entered the search will be performed only in the input.", "Filtering", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
}

View File

@@ -110,6 +110,9 @@
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="..\README.md">
<Link>README.md</Link>
</None>
<None Include="app.manifest" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>