-
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user