From 72dea26fde03af57eac2be8b7e500001d8225c0f Mon Sep 17 00:00:00 2001 From: Serge <5920850+seerge@users.noreply.github.com> Date: Sun, 21 Jan 2024 13:31:48 +0100 Subject: [PATCH] New Ally bindings and Touch Keyboard Support --- app/Ally/AllyControl.cs | 26 +++-- app/GHelper.csproj | 2 +- app/Helpers/OnScreenKeyboard.cs | 176 ++++++++++++++++++++++++++++++++ app/Input/InputDispatcher.cs | 3 + app/Mode/ModeControl.cs | 2 +- app/USB/Aura.cs | 18 +++- 6 files changed, 214 insertions(+), 13 deletions(-) create mode 100644 app/Helpers/OnScreenKeyboard.cs diff --git a/app/Ally/AllyControl.cs b/app/Ally/AllyControl.cs index 88e11b8f..170e4aff 100644 --- a/app/Ally/AllyControl.cs +++ b/app/Ally/AllyControl.cs @@ -81,6 +81,7 @@ namespace GHelper.Ally public const string BindShift = "02-88"; public const string BindCtrl = "02-8C"; public const string BindAlt = "02-8A"; + public const string BindWin = "02-82"; public const string BindTaskManager = "04-03-8C-88-76"; public const string BindCloseWindow = "04-02-8A-0C"; @@ -98,6 +99,10 @@ namespace GHelper.Ally public const string BindPrintScrn = "02-C3"; + public const string BindScreenshot = "04-03-82-88-1B"; + + public const string BindShowKeyboard = "05-19"; + static byte[] CommandReady = new byte[] { AsusHid.INPUT_ID, 0xd1, 0x0a, 0x01 }; static byte[] CommandSave = new byte[] { AsusHid.INPUT_ID, 0xd1, 0x0f, 0x20 }; @@ -137,13 +142,15 @@ namespace GHelper.Ally { BindBrightnessUp, "Bright Up" }, { BindBrightnessDown, "Bright Down" }, + { BindShowKeyboard, "Show Keyboard" }, + { BindScreenshot, "Screenshot" }, + { BindOverlay, "AMD Overlay" }, { BindTaskManager, "Task Manager" }, { BindCloseWindow, "Close Window" }, { BindShiftTab, "Shift-Tab" }, { BindAltTab, "Alt-Tab" }, - { BindPrintScrn, "PrntScn" }, { BindEsc, "Esc" }, { BindBack, "Backspace" }, { BindTab, "Tab" }, @@ -151,6 +158,8 @@ namespace GHelper.Ally { BindShift, "LShift" }, { BindAlt, "LAlt" }, { BindCtrl, "LCtl" }, + { BindWin, "WIN" }, + { BindPrintScrn, "PrntScn" }, { BindPgU, "PgUp" }, { BindPgD, "PgDwn" }, @@ -218,7 +227,6 @@ namespace GHelper.Ally { "02-41", "," }, { "02-49", "." }, { "02-89", "RShift" }, - { "02-82", "Meta" }, { "02-29", "Space" }, { "02-8B", "RAlt" }, { "02-84", "App menu" }, @@ -252,8 +260,8 @@ namespace GHelper.Ally { "03-04", "Mouse scroll up" }, { "03-05", "Mouse scroll down" }, - { "05-16", "Screenshot" }, - { "05-19", "Show keyboard" }, + //{ "05-16", "Screenshot" }, + { "05-1C", "Show desktop" }, { "05-1E", "Begin recording" }, { "05-01", "Mic off" }, @@ -393,14 +401,14 @@ namespace GHelper.Ally case BindingZone.DPadUpDown: KeyL1 = AppConfig.GetString("bind_du", desktop ? BindKBU : BindDU); KeyR1 = AppConfig.GetString("bind_dd", desktop ? BindKBD : BindDD); - KeyL2 = AppConfig.GetString("bind2_du", BindBrightnessUp); - KeyR2 = AppConfig.GetString("bind2_dd", BindBrightnessDown); + KeyL2 = AppConfig.GetString("bind2_du", BindShowKeyboard); + KeyR2 = AppConfig.GetString("bind2_dd", BindAltTab); break; case BindingZone.DPadLeftRight: KeyL1 = AppConfig.GetString("bind_dl", desktop ? BindKBL : BindDL); KeyR1 = AppConfig.GetString("bind_dr", desktop ? BindKBR : BindDR); - KeyL2 = AppConfig.GetString("bind2_dl"); - KeyR2 = AppConfig.GetString("bind2_dr"); + KeyL2 = AppConfig.GetString("bind2_dl", BindBrightnessDown); + KeyR2 = AppConfig.GetString("bind2_dr", BindBrightnessUp); break; case BindingZone.StickClick: KeyL1 = AppConfig.GetString("bind_ls", desktop ? BindShift : BindLS); @@ -423,7 +431,7 @@ namespace GHelper.Ally case BindingZone.XY: KeyL1 = AppConfig.GetString("bind_x", desktop ? BindPgD : BindX); KeyR1 = AppConfig.GetString("bind_y", desktop ? BindPgU : BindY); - KeyL2 = AppConfig.GetString("bind2_x"); + KeyL2 = AppConfig.GetString("bind2_x", BindScreenshot); KeyR2 = AppConfig.GetString("bind2_y", BindOverlay); break; case BindingZone.ViewMenu: diff --git a/app/GHelper.csproj b/app/GHelper.csproj index 819bb1dc..ce70eea1 100644 --- a/app/GHelper.csproj +++ b/app/GHelper.csproj @@ -15,7 +15,7 @@ AnyCPU False True - 0.149 + 0.149.1 diff --git a/app/Helpers/OnScreenKeyboard.cs b/app/Helpers/OnScreenKeyboard.cs new file mode 100644 index 00000000..ee586eb5 --- /dev/null +++ b/app/Helpers/OnScreenKeyboard.cs @@ -0,0 +1,176 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace GHelper.Helpers +{ + public static class OnScreenKeyboard + { + static OnScreenKeyboard() + { + var version = Environment.OSVersion.Version; + switch (version.Major) + { + case 6: + switch (version.Minor) + { + case 2: + // Windows 10 (ok) + break; + } + break; + default: + break; + } + } + + private static void StartTabTip() + { + var p = Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe"); + int handle = 0; + while ((handle = NativeMethods.FindWindow("IPTIP_Main_Window", "")) <= 0) + { + Thread.Sleep(100); + } + } + + public static void ToggleVisibility() + { + var type = Type.GetTypeFromCLSID(Guid.Parse("4ce576fa-83dc-4F88-951c-9d0782b4e376")); + var instance = (ITipInvocation)Activator.CreateInstance(type); + instance.Toggle(NativeMethods.GetDesktopWindow()); + Marshal.ReleaseComObject(instance); + } + + public static void Show() + { + int handle = NativeMethods.FindWindow("IPTIP_Main_Window", ""); + if (handle <= 0) // nothing found + { + StartTabTip(); + Thread.Sleep(100); + } + // on some devices starting TabTip don't show keyboard, on some does ¯\_(ツ)_/¯ + if (!IsOpen()) + { + ToggleVisibility(); + } + } + + public static void Hide() + { + if (IsOpen()) + { + ToggleVisibility(); + } + } + + + public static bool Close() + { + // find it + int handle = NativeMethods.FindWindow("IPTIP_Main_Window", ""); + bool active = handle > 0; + if (active) + { + // don't check style - just close + NativeMethods.SendMessage(handle, NativeMethods.WM_SYSCOMMAND, NativeMethods.SC_CLOSE, 0); + } + return active; + } + + public static bool IsOpen() + { + return GetIsOpen1709() ?? GetIsOpenLegacy(); + } + + + [DllImport("user32.dll", SetLastError = false)] + private static extern IntPtr FindWindowEx(IntPtr parent, IntPtr after, string className, string title = null); + + [DllImport("user32.dll", SetLastError = false)] + private static extern uint GetWindowLong(IntPtr wnd, int index); + + private static bool? GetIsOpen1709() + { + // if there is a top-level window - the keyboard is closed + var wnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, WindowClass1709, WindowCaption1709); + if (wnd != IntPtr.Zero) + return false; + + var parent = IntPtr.Zero; + for (; ; ) + { + parent = FindWindowEx(IntPtr.Zero, parent, WindowParentClass1709); + if (parent == IntPtr.Zero) + return null; // no more windows, keyboard state is unknown + + // if it's a child of a WindowParentClass1709 window - the keyboard is open + wnd = FindWindowEx(parent, IntPtr.Zero, WindowClass1709, WindowCaption1709); + if (wnd != IntPtr.Zero) + return true; + } + } + + private static bool GetIsOpenLegacy() + { + var wnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, WindowClass); + if (wnd == IntPtr.Zero) + return false; + + var style = GetWindowStyle(wnd); + return style.HasFlag(WindowStyle.Visible) + && !style.HasFlag(WindowStyle.Disabled); + } + + private const string WindowClass = "IPTip_Main_Window"; + private const string WindowParentClass1709 = "ApplicationFrameWindow"; + private const string WindowClass1709 = "Windows.UI.Core.CoreWindow"; + private const string WindowCaption1709 = "Microsoft Text Input Application"; + + private enum WindowStyle : uint + { + Disabled = 0x08000000, + Visible = 0x10000000, + } + + private static WindowStyle GetWindowStyle(IntPtr wnd) + { + return (WindowStyle)GetWindowLong(wnd, -16); + } + + } + + + [ComImport] + [Guid("37c994e7-432b-4834-a2f7-dce1f13b834b")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + interface ITipInvocation + { + void Toggle(IntPtr hwnd); + } + + internal static class NativeMethods + { + [DllImport("user32.dll", EntryPoint = "FindWindow")] + internal static extern int FindWindow(string lpClassName, string lpWindowName); + + [DllImport("user32.dll", EntryPoint = "SendMessage")] + internal static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam); + + [DllImport("user32.dll", EntryPoint = "GetDesktopWindow", SetLastError = false)] + internal static extern IntPtr GetDesktopWindow(); + + [DllImport("user32.dll", EntryPoint = "GetWindowLong")] + internal static extern int GetWindowLong(int hWnd, int nIndex); + + internal const int GWL_STYLE = -16; + internal const int GWL_EXSTYLE = -20; + internal const int WM_SYSCOMMAND = 0x0112; + internal const int SC_CLOSE = 0xF060; + + internal const int WS_DISABLED = 0x08000000; + + internal const int WS_VISIBLE = 0x10000000; + + } +} \ No newline at end of file diff --git a/app/Input/InputDispatcher.cs b/app/Input/InputDispatcher.cs index f054a396..5792dca8 100644 --- a/app/Input/InputDispatcher.cs +++ b/app/Input/InputDispatcher.cs @@ -602,6 +602,9 @@ namespace GHelper.Input case 56: KeyProcess("m4"); return; + case 162: + OnScreenKeyboard.Show(); + return; } } diff --git a/app/Mode/ModeControl.cs b/app/Mode/ModeControl.cs index a3fe3f6c..c7406ed9 100644 --- a/app/Mode/ModeControl.cs +++ b/app/Mode/ModeControl.cs @@ -318,7 +318,7 @@ namespace GHelper.Mode int memory = AppConfig.GetMode("gpu_memory"); int clock_limit = AppConfig.GetMode("gpu_clock_limit"); - //if (core == -1 && memory == -1 && clock_limit == -1) return; + if (core == -1 && memory == -1 && clock_limit == -1) return; //if ((gpu_core > -5 && gpu_core < 5) && (gpu_memory > -5 && gpu_memory < 5)) launchAsAdmin = false; if (Program.acpi.DeviceGet(AsusACPI.GPUEco) == 1) { Logger.WriteLine("Clocks: Eco"); return; } diff --git a/app/USB/Aura.cs b/app/USB/Aura.cs index 2da6d60c..dc7c6af8 100644 --- a/app/USB/Aura.cs +++ b/app/USB/Aura.cs @@ -261,9 +261,23 @@ namespace GHelper.USB public static void Init() { AsusHid.Write(new List { - new byte[] { AsusHid.AURA_ID, 0xb9 }, + new byte[] { AsusHid.AURA_ID, 0xB9 }, Encoding.ASCII.GetBytes("]ASUS Tech.Inc."), - new byte[] { AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x1a }, + new byte[] { AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x1A }, + + // Random data AC sends to keyboard on start + new byte[] { AsusHid.AURA_ID, 0x9F, 0x01 }, + new byte[] { AsusHid.AURA_ID, 0xBF }, + + new byte[] { AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x10 }, + new byte[] { AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x20 }, + + new byte[] { AsusHid.AURA_ID, 0xC0, 0x03, 0x01}, + new byte[] { AsusHid.AURA_ID, 0x9E, 0x01, 0x20 }, + + Encoding.ASCII.GetBytes("]ASUS Tech.Inc."), + new byte[] { AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x1A }, + new byte[] { AsusHid.AURA_ID, 0xC0, 0x00, 0x01}, }, "Init"); AsusHid.WriteInput(Encoding.ASCII.GetBytes("ZASUS Tech.Inc."));