diff --git a/src/modules/MouseWithoutBorders/App/Class/Common.Encryption.cs b/src/modules/MouseWithoutBorders/App/Class/Common.Encryption.cs deleted file mode 100644 index 1293a4ef39..0000000000 --- a/src/modules/MouseWithoutBorders/App/Class/Common.Encryption.cs +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -// -// Encrypt/decrypt implementation. -// -// -// 2008 created by Truong Do (ductdo). -// 2009-... modified by Truong Do (TruongDo). -// 2023- Included in PowerToys. -// -using System; -using System.Collections.Concurrent; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Security.Cryptography; -using System.Threading.Tasks; - -using MouseWithoutBorders.Core; - -namespace MouseWithoutBorders -{ - internal partial class Common - { -#pragma warning disable SYSLIB0021 - private static AesCryptoServiceProvider symAl; -#pragma warning restore SYSLIB0021 -#pragma warning disable SA1307 // Accessible fields should begin with upper-case letter - internal static string myKey; -#pragma warning restore SA1307 - private static uint magicNumber; - private static Random ran = new(); // Used for non encryption related functionality. - internal const int SymAlBlockSize = 16; - - /// - /// This is used for the first encryption block, the following blocks will be combined with the cipher text of the previous block. - /// Thus identical blocks in the socket stream would be encrypted to different cipher text blocks. - /// The first block is a handshake one containing random data. - /// Related Unit Test: TestEncryptDecrypt - /// - internal static readonly string InitialIV = ulong.MaxValue.ToString(CultureInfo.InvariantCulture); - - internal static Random Ran - { - get => Common.ran ??= new Random(); - set => Common.ran = value; - } - - internal static uint MagicNumber - { - get => Common.magicNumber; - set => Common.magicNumber = value; - } - - internal static string MyKey - { - get => Common.myKey; - - set - { - if (Common.myKey != value) - { - Common.myKey = value; - _ = Task.Factory.StartNew( - () => Common.GenLegalKey(), - System.Threading.CancellationToken.None, - TaskCreationOptions.None, - TaskScheduler.Default); // Cache the key to improve UX. - } - } - } - - internal static string KeyDisplayedText(string key) - { - string displayedValue = string.Empty; - int i = 0; - - do - { - int length = Math.Min(4, key.Length - i); - displayedValue += string.Concat(key.AsSpan(i, length), " "); - i += 4; - } - while (i < key.Length - 1); - - return displayedValue.Trim(); - } - - internal static bool GeneratedKey { get; set; } - - internal static bool KeyCorrupted { get; set; } - - internal static void InitEncryption() - { - try - { - if (symAl == null) - { -#pragma warning disable SYSLIB0021 // No proper replacement for now - symAl = new AesCryptoServiceProvider(); -#pragma warning restore SYSLIB0021 - symAl.KeySize = 256; - symAl.BlockSize = SymAlBlockSize * 8; - symAl.Padding = PaddingMode.Zeros; - symAl.Mode = CipherMode.CBC; - symAl.GenerateIV(); - } - } - catch (Exception e) - { - Logger.Log(e); - } - } - - private static readonly ConcurrentDictionary LegalKeyDictionary = new(StringComparer.OrdinalIgnoreCase); - - internal static byte[] GenLegalKey() - { - byte[] rv; - string myKey = Common.MyKey; - - if (!LegalKeyDictionary.TryGetValue(myKey, out byte[] value)) - { - Rfc2898DeriveBytes key = new( - myKey, - Common.GetBytesU(InitialIV), - 50000, - HashAlgorithmName.SHA512); - rv = key.GetBytes(32); - _ = LegalKeyDictionary.AddOrUpdate(myKey, rv, (k, v) => rv); - } - else - { - rv = value; - } - - return rv; - } - - private static byte[] GenLegalIV() - { - string st = InitialIV; - int ivLength = symAl.IV.Length; - if (st.Length > ivLength) - { - st = st[..ivLength]; - } - else if (st.Length < ivLength) - { - st = st.PadRight(ivLength, ' '); - } - - return GetBytes(st); - } - - internal static Stream GetEncryptedStream(Stream encryptedStream) - { - ICryptoTransform encryptor; - encryptor = symAl.CreateEncryptor(GenLegalKey(), GenLegalIV()); - return new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write); - } - - internal static Stream GetDecryptedStream(Stream encryptedStream) - { - ICryptoTransform decryptor; - decryptor = symAl.CreateDecryptor(GenLegalKey(), GenLegalIV()); - return new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read); - } - - internal static uint Get24BitHash(string st) - { - if (string.IsNullOrEmpty(st)) - { - return 0; - } - - byte[] bytes = new byte[PACKAGE_SIZE]; - for (int i = 0; i < PACKAGE_SIZE; i++) - { - if (i < st.Length) - { - bytes[i] = (byte)st[i]; - } - } - - var hash = SHA512.Create(); - byte[] hashValue = hash.ComputeHash(bytes); - - for (int i = 0; i < 50000; i++) - { - hashValue = hash.ComputeHash(hashValue); - } - - Logger.LogDebug(string.Format(CultureInfo.CurrentCulture, "magic: {0},{1},{2}", hashValue[0], hashValue[1], hashValue[^1])); - hash.Clear(); - return (uint)((hashValue[0] << 23) + (hashValue[1] << 16) + (hashValue[^1] << 8) + hashValue[2]); - } - - internal static string GetDebugInfo(string st) - { - return string.IsNullOrEmpty(st) ? st : ((byte)(Common.GetBytesU(st).Sum(value => value) % 256)).ToString(CultureInfo.InvariantCulture); - } - - internal static string CreateDefaultKey() - { - return CreateRandomKey(); - } - - private const int PW_LENGTH = 16; - - public static string CreateRandomKey() - { - // Not including characters like "'`O0& since they are confusing to users. - string[] chars = new[] { "abcdefghjkmnpqrstuvxyz", "ABCDEFGHJKMNPQRSTUVXYZ", "123456789", "~!@#$%^*()_-+=:;<,>.?/\\|[]" }; - char[][] charactersUsedForKey = chars.Select(charset => Enumerable.Range(0, charset.Length - 1).Select(i => charset[i]).ToArray()).ToArray(); - byte[] randomData = new byte[1]; - string key = string.Empty; - - do - { - foreach (string set in chars) - { - randomData = RandomNumberGenerator.GetBytes(1); - key += set[randomData[0] % set.Length]; - - if (key.Length >= PW_LENGTH) - { - break; - } - } - } - while (key.Length < PW_LENGTH); - - return key; - } - - internal static bool IsKeyValid(string key, out string error) - { - error = string.IsNullOrEmpty(key) || key.Length < 16 - ? "Key must have at least 16 characters in length (spaces are discarded). Key must be auto generated in one of the machines." - : null; - - return error == null; - } - } -} diff --git a/src/modules/MouseWithoutBorders/App/Class/Common.Package.cs b/src/modules/MouseWithoutBorders/App/Class/Common.Package.cs deleted file mode 100644 index baaf1c0544..0000000000 --- a/src/modules/MouseWithoutBorders/App/Class/Common.Package.cs +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -// -// Package format/conversion. -// -// -// 2008 created by Truong Do (ductdo). -// 2009-... modified by Truong Do (TruongDo). -// 2023- Included in PowerToys. -// -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; - -// In X64, we are WOW -[module: SuppressMessage("Microsoft.Portability", "CA1900:ValueTypeFieldsShouldBePortable", Scope = "type", Target = "MouseWithoutBorders.DATA", Justification = "Dotnet port with style preservation")] - -namespace MouseWithoutBorders -{ - internal enum PackageType// : int - { - // Search for PACKAGE_TYPE_RELATED before changing these! - Invalid = 0xFF, - - Error = 0xFE, - - Hi = 2, - Hello = 3, - ByeBye = 4, - - Heartbeat = 20, - Awake = 21, - HideMouse = 50, - Heartbeat_ex = 51, - Heartbeat_ex_l2 = 52, - Heartbeat_ex_l3 = 53, - - Clipboard = 69, - ClipboardDragDrop = 70, - ClipboardDragDropEnd = 71, - ExplorerDragDrop = 72, - ClipboardCapture = 73, - CaptureScreenCommand = 74, - ClipboardDragDropOperation = 75, - ClipboardDataEnd = 76, - MachineSwitched = 77, - ClipboardAsk = 78, - ClipboardPush = 79, - - NextMachine = 121, - Keyboard = 122, - Mouse = 123, - ClipboardText = 124, - ClipboardImage = 125, - - Handshake = 126, - HandshakeAck = 127, - - Matrix = 128, - MatrixSwapFlag = 2, - MatrixTwoRowFlag = 4, - } - - internal struct PackageMonitor - { - internal ulong Keyboard; - internal ulong Mouse; - internal ulong Heartbeat; - internal ulong ByeBye; - internal ulong Hello; - internal ulong Matrix; - internal ulong ClipboardText; - internal ulong ClipboardImage; - internal ulong Clipboard; - internal ulong ClipboardDragDrop; - internal ulong ClipboardDragDropEnd; - internal ulong ClipboardAsk; - internal ulong ExplorerDragDrop; - internal ulong Nil; - - internal PackageMonitor(ulong value) - { - ClipboardDragDrop = ClipboardDragDropEnd = ExplorerDragDrop = - Keyboard = Mouse = Heartbeat = ByeBye = Hello = Clipboard = - Matrix = ClipboardImage = ClipboardText = Nil = ClipboardAsk = value; - } - } - - internal enum ID : uint - { - NONE = 0, - ALL = 255, - } - - internal enum ClipboardPostAction : uint - { - Other = 0, - Desktop = 1, - Mspaint = 2, - } - - [StructLayout(LayoutKind.Sequential)] - internal struct KEYBDDATA - { - [SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Same name as in winAPI")] - internal int wVk; - [SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Same name as in winAPI")] - internal int dwFlags; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct MOUSEDATA - { - internal int X; - internal int Y; - internal int WheelDelta; - [SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Same name as in winAPI")] - internal int dwFlags; - } - - // The beauty of "union" in C# - [StructLayout(LayoutKind.Explicit)] - internal class DATA - { - [FieldOffset(0)] - internal PackageType Type; // 4 (first byte = package type, 1 = checksum, 2+3 = magic no.) - - [FieldOffset(sizeof(PackageType))] - internal int Id; // 4 - - [FieldOffset(sizeof(PackageType) + sizeof(uint))] - internal ID Src; // 4 - - [FieldOffset(sizeof(PackageType) + (2 * sizeof(uint)))] - internal ID Des; // 4 - - [FieldOffset(sizeof(PackageType) + (3 * sizeof(uint)))] - internal long DateTime; - - [FieldOffset(sizeof(PackageType) + (3 * sizeof(uint)) + sizeof(long))] - internal KEYBDDATA Kd; - - [FieldOffset(sizeof(PackageType) + (3 * sizeof(uint)))] - internal MOUSEDATA Md; - - [FieldOffset(sizeof(PackageType) + (3 * sizeof(uint)))] - internal ID Machine1; - - [FieldOffset(sizeof(PackageType) + (4 * sizeof(uint)))] - internal ID Machine2; - - [FieldOffset(sizeof(PackageType) + (5 * sizeof(uint)))] - internal ID Machine3; - - [FieldOffset(sizeof(PackageType) + (6 * sizeof(uint)))] - internal ID Machine4; - - [FieldOffset(sizeof(PackageType) + (3 * sizeof(uint)))] - internal ClipboardPostAction PostAction; - - [FieldOffset(sizeof(PackageType) + (7 * sizeof(uint)))] - private long machineNameP1; - - [FieldOffset(sizeof(PackageType) + (7 * sizeof(uint)) + sizeof(long))] - private long machineNameP2; - - [FieldOffset(sizeof(PackageType) + (7 * sizeof(uint)) + (2 * sizeof(long)))] - private long machineNameP3; - - [FieldOffset(sizeof(PackageType) + (7 * sizeof(uint)) + (3 * sizeof(long)))] - private long machineNameP4; - - internal string MachineName - { - get - { - string name = Common.GetString(BitConverter.GetBytes(machineNameP1)) - + Common.GetString(BitConverter.GetBytes(machineNameP2)) - + Common.GetString(BitConverter.GetBytes(machineNameP3)) - + Common.GetString(BitConverter.GetBytes(machineNameP4)); - return name.Trim(); - } - - set - { - byte[] machineName = Common.GetBytes(value.PadRight(32, ' ')); - machineNameP1 = BitConverter.ToInt64(machineName, 0); - machineNameP2 = BitConverter.ToInt64(machineName, 8); - machineNameP3 = BitConverter.ToInt64(machineName, 16); - machineNameP4 = BitConverter.ToInt64(machineName, 24); - } - } - - public DATA() - { - } - - public DATA(byte[] initialData) - { - Bytes = initialData; - } - - internal byte[] Bytes - { - get - { - byte[] buf = new byte[IsBigPackage ? Common.PACKAGE_SIZE_EX : Common.PACKAGE_SIZE]; - Array.Copy(StructToBytes(this), buf, IsBigPackage ? Common.PACKAGE_SIZE_EX : Common.PACKAGE_SIZE); - - return buf; - } - - set - { - Debug.Assert(value.Length <= Common.PACKAGE_SIZE_EX, "Length > package size"); - byte[] buf = new byte[Common.PACKAGE_SIZE_EX]; - Array.Copy(value, buf, value.Length); - BytesToStruct(buf, this); - } - } - - internal bool IsBigPackage - { - get => Type == 0 - ? throw new InvalidOperationException("Package type not set.") - : Type switch - { - PackageType.Hello or PackageType.Awake or PackageType.Heartbeat or PackageType.Heartbeat_ex or PackageType.Handshake or PackageType.HandshakeAck or PackageType.ClipboardPush or PackageType.Clipboard or PackageType.ClipboardAsk or PackageType.ClipboardImage or PackageType.ClipboardText or PackageType.ClipboardDataEnd => true, - _ => (Type & PackageType.Matrix) == PackageType.Matrix, - }; - } - - private byte[] StructToBytes(object structObject) - { - byte[] bytes = new byte[Common.PACKAGE_SIZE_EX]; - GCHandle bHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned); - Marshal.StructureToPtr(structObject, Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0), false); - bHandle.Free(); - return bytes; - } - - private void BytesToStruct(byte[] value, object structObject) - { - GCHandle bHandle = GCHandle.Alloc(value, GCHandleType.Pinned); - Marshal.PtrToStructure(Marshal.UnsafeAddrOfPinnedArrayElement(value, 0), structObject); - bHandle.Free(); - } - } - - internal partial class Common - { - internal const byte PACKAGE_SIZE = 32; - internal const byte PACKAGE_SIZE_EX = 64; - internal const byte WP_PACKAGE_SIZE = 6; - internal static PackageMonitor PackageSent; - internal static PackageMonitor PackageReceived; - internal static int PackageID; - } -} diff --git a/src/modules/MouseWithoutBorders/App/Class/Common.ShutdownWithPowerToys.cs b/src/modules/MouseWithoutBorders/App/Class/Common.ShutdownWithPowerToys.cs deleted file mode 100644 index 7c0dd4eb9b..0000000000 --- a/src/modules/MouseWithoutBorders/App/Class/Common.ShutdownWithPowerToys.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; - -using ManagedCommon; -using Microsoft.PowerToys.Telemetry; -using MouseWithoutBorders.Class; - -using Logger = MouseWithoutBorders.Core.Logger; - -namespace MouseWithoutBorders -{ - internal class ShutdownWithPowerToys - { - public static void WaitForPowerToysRunner(ETWTrace etwTrace) - { - try - { - RunnerHelper.WaitForPowerToysRunnerExitFallback(() => - { - etwTrace?.Dispose(); - Common.MainForm.Quit(true, false); - }); - } - catch (Exception e) - { - Logger.Log(e); - } - } - } -} diff --git a/src/modules/MouseWithoutBorders/App/Class/Common.VK.cs b/src/modules/MouseWithoutBorders/App/Class/Common.VK.cs deleted file mode 100644 index 3f54a0281d..0000000000 --- a/src/modules/MouseWithoutBorders/App/Class/Common.VK.cs +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -// -// Virtual key constants. -// -// -// 2008 created by Truong Do (ductdo). -// 2009-... modified by Truong Do (TruongDo). -// 2023- Included in PowerToys. -// -using System; - -namespace MouseWithoutBorders -{ - internal enum VK : ushort - { - CAPITAL = 0x14, - NUMLOCK = 0x90, - SHIFT = 0x10, - CONTROL = 0x11, - MENU = 0x12, - ESCAPE = 0x1B, - BACK = 0x08, - TAB = 0x09, - RETURN = 0x0D, - PRIOR = 0x21, - NEXT = 0x22, - END = 0x23, - HOME = 0x24, - LEFT = 0x25, - UP = 0x26, - RIGHT = 0x27, - DOWN = 0x28, - SELECT = 0x29, - PRINT = 0x2A, - EXECUTE = 0x2B, - SNAPSHOT = 0x2C, - INSERT = 0x2D, - DELETE = 0x2E, - HELP = 0x2F, - NUMPAD0 = 0x60, - NUMPAD1 = 0x61, - NUMPAD2 = 0x62, - NUMPAD3 = 0x63, - NUMPAD4 = 0x64, - NUMPAD5 = 0x65, - NUMPAD6 = 0x66, - NUMPAD7 = 0x67, - NUMPAD8 = 0x68, - NUMPAD9 = 0x69, - MULTIPLY = 0x6A, - ADD = 0x6B, - SEPARATOR = 0x6C, - SUBTRACT = 0x6D, - DECIMAL = 0x6E, - DIVIDE = 0x6F, - F1 = 0x70, - F2 = 0x71, - F3 = 0x72, - F4 = 0x73, - F5 = 0x74, - F6 = 0x75, - F7 = 0x76, - F8 = 0x77, - F9 = 0x78, - F10 = 0x79, - F11 = 0x7A, - F12 = 0x7B, - OEM_1 = 0xBA, - OEM_PLUS = 0xBB, - OEM_COMMA = 0xBC, - OEM_MINUS = 0xBD, - OEM_PERIOD = 0xBE, - OEM_2 = 0xBF, - OEM_3 = 0xC0, - MEDIA_NEXT_TRACK = 0xB0, - MEDIA_PREV_TRACK = 0xB1, - MEDIA_STOP = 0xB2, - MEDIA_PLAY_PAUSE = 0xB3, - LWIN = 0x5B, - RWIN = 0x5C, - LSHIFT = 0xA0, - RSHIFT = 0xA1, - LCONTROL = 0xA2, - RCONTROL = 0xA3, - LMENU = 0xA4, - RMENU = 0xA5, - } - - internal partial class Common - { - internal const ushort KEYEVENTF_KEYDOWN = 0x0001; - internal const ushort KEYEVENTF_KEYUP = 0x0002; - - internal const int WH_MOUSE = 7; - internal const int WH_KEYBOARD = 2; - internal const int WH_MOUSE_LL = 14; - internal const int WH_KEYBOARD_LL = 13; - - internal const int WM_MOUSEMOVE = 0x200; - internal const int WM_LBUTTONDOWN = 0x201; - internal const int WM_RBUTTONDOWN = 0x204; - internal const int WM_MBUTTONDOWN = 0x207; - internal const int WM_XBUTTONDOWN = 0x20B; - internal const int WM_LBUTTONUP = 0x202; - internal const int WM_RBUTTONUP = 0x205; - internal const int WM_MBUTTONUP = 0x208; - internal const int WM_XBUTTONUP = 0x20C; - internal const int WM_LBUTTONDBLCLK = 0x203; - internal const int WM_RBUTTONDBLCLK = 0x206; - internal const int WM_MBUTTONDBLCLK = 0x209; - internal const int WM_MOUSEWHEEL = 0x020A; - internal const int WM_MOUSEHWHEEL = 0x020E; - - internal const int WM_KEYDOWN = 0x100; - internal const int WM_KEYUP = 0x101; - internal const int WM_SYSKEYDOWN = 0x104; - internal const int WM_SYSKEYUP = 0x105; - - [Flags] - internal enum LLKHF - { - EXTENDED = 0x01, - INJECTED = 0x10, - ALTDOWN = 0x20, - UP = 0x80, - } - } -} diff --git a/src/modules/MouseWithoutBorders/App/Class/Common.WinAPI.cs b/src/modules/MouseWithoutBorders/App/Class/Common.WinAPI.cs deleted file mode 100644 index ee2d99398c..0000000000 --- a/src/modules/MouseWithoutBorders/App/Class/Common.WinAPI.cs +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Globalization; -using System.Linq; -using System.Runtime.InteropServices; -using System.Threading; -using System.Windows.Forms; - -// -// Screen/Desktop helper functions. -// -// -// 2008 created by Truong Do (ductdo). -// 2009-... modified by Truong Do (TruongDo). -// 2023- Included in PowerToys. -// -using MouseWithoutBorders.Class; -using MouseWithoutBorders.Core; - -using Thread = MouseWithoutBorders.Core.Thread; - -namespace MouseWithoutBorders -{ - // Desktops, and GetScreenConfig routines - internal partial class Common - { - private static MyRectangle newDesktopBounds; - private static MyRectangle newPrimaryScreenBounds; - private static string activeDesktop; - - internal static string ActiveDesktop => Common.activeDesktop; - - internal static void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e) - { - GetScreenConfig(); - } - - internal static readonly List SensitivePoints = new(); - - private static bool MonitorEnumProc(IntPtr hMonitor, IntPtr hdcMonitor, ref NativeMethods.RECT lprcMonitor, IntPtr dwData) - { - // lprcMonitor is wrong!!! => using GetMonitorInfo(...) - // Log(String.Format( CultureInfo.CurrentCulture,"MONITOR: l{0}, t{1}, r{2}, b{3}", lprcMonitor.Left, lprcMonitor.Top, lprcMonitor.Right, lprcMonitor.Bottom)); - NativeMethods.MonitorInfoEx mi = default; - mi.cbSize = Marshal.SizeOf(mi); - _ = NativeMethods.GetMonitorInfo(hMonitor, ref mi); - - try - { - // For logging only - _ = NativeMethods.GetDpiForMonitor(hMonitor, 0, out uint dpiX, out uint dpiY); - Logger.Log(string.Format(CultureInfo.CurrentCulture, "MONITOR: ({0}, {1}, {2}, {3}). DPI: ({4}, {5})", mi.rcMonitor.Left, mi.rcMonitor.Top, mi.rcMonitor.Right, mi.rcMonitor.Bottom, dpiX, dpiY)); - } - catch (DllNotFoundException) - { - Logger.Log("GetDpiForMonitor is unsupported in Windows 7 and lower."); - } - catch (EntryPointNotFoundException) - { - Logger.Log("GetDpiForMonitor is unsupported in Windows 7 and lower."); - } - catch (Exception e) - { - Logger.Log(e); - } - - if (mi.rcMonitor.Left == 0 && mi.rcMonitor.Top == 0 && mi.rcMonitor.Right != 0 && mi.rcMonitor.Bottom != 0) - { - // Primary screen - _ = Interlocked.Exchange(ref screenWidth, mi.rcMonitor.Right - mi.rcMonitor.Left); - _ = Interlocked.Exchange(ref screenHeight, mi.rcMonitor.Bottom - mi.rcMonitor.Top); - - newPrimaryScreenBounds.Left = mi.rcMonitor.Left; - newPrimaryScreenBounds.Top = mi.rcMonitor.Top; - newPrimaryScreenBounds.Right = mi.rcMonitor.Right; - newPrimaryScreenBounds.Bottom = mi.rcMonitor.Bottom; - } - else - { - if (mi.rcMonitor.Left < newDesktopBounds.Left) - { - newDesktopBounds.Left = mi.rcMonitor.Left; - } - - if (mi.rcMonitor.Top < newDesktopBounds.Top) - { - newDesktopBounds.Top = mi.rcMonitor.Top; - } - - if (mi.rcMonitor.Right > newDesktopBounds.Right) - { - newDesktopBounds.Right = mi.rcMonitor.Right; - } - - if (mi.rcMonitor.Bottom > newDesktopBounds.Bottom) - { - newDesktopBounds.Bottom = mi.rcMonitor.Bottom; - } - } - - lock (SensitivePoints) - { - SensitivePoints.Add(new Point(mi.rcMonitor.Left, mi.rcMonitor.Top)); - SensitivePoints.Add(new Point(mi.rcMonitor.Right, mi.rcMonitor.Top)); - SensitivePoints.Add(new Point(mi.rcMonitor.Right, mi.rcMonitor.Bottom)); - SensitivePoints.Add(new Point(mi.rcMonitor.Left, mi.rcMonitor.Bottom)); - } - - return true; - } - - internal static void GetScreenConfig() - { - try - { - Logger.LogDebug("==================== GetScreenConfig started"); - newDesktopBounds = new MyRectangle(); - newPrimaryScreenBounds = new MyRectangle(); - newDesktopBounds.Left = newPrimaryScreenBounds.Left = Screen.PrimaryScreen.Bounds.Left; - newDesktopBounds.Top = newPrimaryScreenBounds.Top = Screen.PrimaryScreen.Bounds.Top; - newDesktopBounds.Right = newPrimaryScreenBounds.Right = Screen.PrimaryScreen.Bounds.Right; - newDesktopBounds.Bottom = newPrimaryScreenBounds.Bottom = Screen.PrimaryScreen.Bounds.Bottom; - - Logger.Log(string.Format( - CultureInfo.CurrentCulture, - "logon = {0} PrimaryScreenBounds = {1},{2},{3},{4} desktopBounds = {5},{6},{7},{8}", - Common.RunOnLogonDesktop, - Common.newPrimaryScreenBounds.Left, - Common.newPrimaryScreenBounds.Top, - Common.newPrimaryScreenBounds.Right, - Common.newPrimaryScreenBounds.Bottom, - Common.newDesktopBounds.Left, - Common.newDesktopBounds.Top, - Common.newDesktopBounds.Right, - Common.newDesktopBounds.Bottom)); - -#if USE_MANAGED_ROUTINES - // Managed routines do not work well when running on secure desktop:( - screenWidth = Screen.PrimaryScreen.Bounds.Width; - screenHeight = Screen.PrimaryScreen.Bounds.Height; - screenCount = Screen.AllScreens.Length; - for (int i = 0; i < Screen.AllScreens.Length; i++) - { - if (Screen.AllScreens[i].Bounds.Left < desktopBounds.Left) desktopBounds.Left = Screen.AllScreens[i].Bounds.Left; - if (Screen.AllScreens[i].Bounds.Top < desktopBounds.Top) desktopBounds.Top = Screen.AllScreens[i].Bounds.Top; - if (Screen.AllScreens[i].Bounds.Right > desktopBounds.Right) desktopBounds.Right = Screen.AllScreens[i].Bounds.Right; - if (Screen.AllScreens[i].Bounds.Bottom > desktopBounds.Bottom) desktopBounds.Bottom = Screen.AllScreens[i].Bounds.Bottom; - } -#else - lock (SensitivePoints) - { - SensitivePoints.Clear(); - } - - NativeMethods.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, MonitorEnumProc, IntPtr.Zero); - - // 1000 calls to EnumDisplayMonitors cost a dozen of milliseconds -#endif - Interlocked.Exchange(ref MachineStuff.desktopBounds, newDesktopBounds); - Interlocked.Exchange(ref MachineStuff.primaryScreenBounds, newPrimaryScreenBounds); - - Logger.Log(string.Format( - CultureInfo.CurrentCulture, - "logon = {0} PrimaryScreenBounds = {1},{2},{3},{4} desktopBounds = {5},{6},{7},{8}", - Common.RunOnLogonDesktop, - MachineStuff.PrimaryScreenBounds.Left, - MachineStuff.PrimaryScreenBounds.Top, - MachineStuff.PrimaryScreenBounds.Right, - MachineStuff.PrimaryScreenBounds.Bottom, - MachineStuff.DesktopBounds.Left, - MachineStuff.DesktopBounds.Top, - MachineStuff.DesktopBounds.Right, - MachineStuff.DesktopBounds.Bottom)); - - Logger.Log("==================== GetScreenConfig ended"); - } - catch (Exception e) - { - Logger.Log(e); - } - } - -#if USING_SCREEN_SAVER_ROUTINES - [DllImport("user32.dll", CharSet = CharSet.Auto)] - private static extern int PostMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - private static extern IntPtr OpenDesktop(string hDesktop, int Flags, bool Inherit, UInt32 DesiredAccess); - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - private static extern bool CloseDesktop(IntPtr hDesktop); - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - private static extern bool EnumDesktopWindows( IntPtr hDesktop, EnumDesktopWindowsProc callback, IntPtr lParam); - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - private static extern bool IsWindowVisible(IntPtr hWnd); - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - private static extern bool SystemParametersInfo(int uAction, int uParam, ref int pvParam, int flags); - - private delegate bool EnumDesktopWindowsProc(IntPtr hDesktop, IntPtr lParam); - private const int WM_CLOSE = 16; - private const int SPI_GETSCREENSAVERRUNNING = 114; - - internal static bool IsScreenSaverRunning() - { - int isRunning = 0; - SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0,ref isRunning, 0); - return (isRunning != 0); - } - - internal static void CloseScreenSaver() - { - IntPtr hDesktop = OpenDesktop("Screen-saver", 0, false, DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS); - if (hDesktop != IntPtr.Zero) - { - LogDebug("Closing screen saver..."); - EnumDesktopWindows(hDesktop, new EnumDesktopWindowsProc(CloseScreenSaverFunc), IntPtr.Zero); - CloseDesktop(hDesktop); - } - } - - private static bool CloseScreenSaverFunc(IntPtr hWnd, IntPtr lParam) - { - if (IsWindowVisible(hWnd)) - { - LogDebug("Posting WM_CLOSE to " + hWnd.ToString(CultureInfo.InvariantCulture)); - PostMessage(hWnd, WM_CLOSE, 0, 0); - } - return true; - } -#endif - - internal static string GetMyDesktop() - { - byte[] arThreadDesktop = new byte[256]; - IntPtr hD = NativeMethods.GetThreadDesktop(NativeMethods.GetCurrentThreadId()); - if (hD != IntPtr.Zero) - { - _ = NativeMethods.GetUserObjectInformation(hD, NativeMethods.UOI_NAME, arThreadDesktop, arThreadDesktop.Length, out _); - return GetString(arThreadDesktop).Replace("\0", string.Empty); - } - - return string.Empty; - } - - internal static string GetInputDesktop() - { - byte[] arInputDesktop = new byte[256]; - IntPtr hD = NativeMethods.OpenInputDesktop(0, false, NativeMethods.DESKTOP_READOBJECTS); - if (hD != IntPtr.Zero) - { - _ = NativeMethods.GetUserObjectInformation(hD, NativeMethods.UOI_NAME, arInputDesktop, arInputDesktop.Length, out _); - return GetString(arInputDesktop).Replace("\0", string.Empty); - } - - return string.Empty; - } - - internal static void StartMMService(string desktopToRunMouseWithoutBordersOn) - { - if (!Common.RunWithNoAdminRight) - { - Logger.LogDebug("*** Starting on active Desktop: " + desktopToRunMouseWithoutBordersOn); - Service.StartMouseWithoutBordersService(desktopToRunMouseWithoutBordersOn); - } - } - - internal static void CheckForDesktopSwitchEvent(bool cleanupIfExit) - { - try - { - if (!IsMyDesktopActive() || Common.CurrentProcess.SessionId != NativeMethods.WTSGetActiveConsoleSessionId()) - { - Helper.RunDDHelper(true); - int waitCount = 20; - - while (NativeMethods.WTSGetActiveConsoleSessionId() == 0xFFFFFFFF && waitCount > 0) - { - waitCount--; - Logger.LogDebug("The session is detached/attached."); - Thread.Sleep(500); - } - - string myDesktop = GetMyDesktop(); - activeDesktop = GetInputDesktop(); - - Logger.LogDebug("*** Active Desktop = " + activeDesktop); - Logger.LogDebug("*** My Desktop = " + myDesktop); - - if (myDesktop.Equals(activeDesktop, StringComparison.OrdinalIgnoreCase)) - { - Logger.LogDebug("*** Active Desktop == My Desktop (TS session)"); - } - - if (!activeDesktop.Equals("winlogon", StringComparison.OrdinalIgnoreCase) && - !activeDesktop.Equals("default", StringComparison.OrdinalIgnoreCase) && - !activeDesktop.Equals("disconnect", StringComparison.OrdinalIgnoreCase)) - { - try - { - StartMMService(activeDesktop); - } - catch (Exception e) - { - Logger.Log($"{nameof(CheckForDesktopSwitchEvent)}: {e}"); - } - } - else - { - if (!myDesktop.Equals(activeDesktop, StringComparison.OrdinalIgnoreCase)) - { - Logger.Log("*** Active Desktop <> My Desktop"); - } - - uint sid = NativeMethods.WTSGetActiveConsoleSessionId(); - - if (Process.GetProcessesByName(Common.BinaryName).Any(p => (uint)p.SessionId == sid)) - { - Logger.Log("Found MouseWithoutBorders on the active session!"); - } - else - { - Logger.Log("MouseWithoutBorders not found on the active session!"); - StartMMService(null); - } - } - - if (!myDesktop.Equals("winlogon", StringComparison.OrdinalIgnoreCase) && - !myDesktop.Equals("default", StringComparison.OrdinalIgnoreCase)) - { - Logger.LogDebug("*** Desktop inactive, exiting: " + myDesktop); - Setting.Values.LastX = JUST_GOT_BACK_FROM_SCREEN_SAVER; - if (cleanupIfExit) - { - InitAndCleanup.Cleanup(); - } - - Process.GetCurrentProcess().KillProcess(); - } - } - } - catch (Exception e) - { - Logger.Log(e); - } - } - - private static Point p; - - internal static bool IsMyDesktopActive() - { - return NativeMethods.GetCursorPos(ref p); - } - } -} diff --git a/src/modules/MouseWithoutBorders/App/Class/Common.cs b/src/modules/MouseWithoutBorders/App/Class/Common.cs index ba5a1655e0..9a34500b52 100644 --- a/src/modules/MouseWithoutBorders/App/Class/Common.cs +++ b/src/modules/MouseWithoutBorders/App/Class/Common.cs @@ -315,7 +315,7 @@ namespace MouseWithoutBorders if (!acquireMutex) { Process[] ps = Process.GetProcessesByName(Common.BinaryName); - Logger.TelemetryLogTrace($"Balance: {socketMutexBalance}, Active: {IsMyDesktopActive()}, Sid/Console: {Process.GetCurrentProcess().SessionId}/{NativeMethods.WTSGetActiveConsoleSessionId()}, Desktop/Input: {GetMyDesktop()}/{GetInputDesktop()}, count: {ps?.Length}.", SeverityLevel.Warning); + Logger.TelemetryLogTrace($"Balance: {socketMutexBalance}, Active: {WinAPI.IsMyDesktopActive()}, Sid/Console: {Process.GetCurrentProcess().SessionId}/{NativeMethods.WTSGetActiveConsoleSessionId()}, Desktop/Input: {WinAPI.GetMyDesktop()}/{WinAPI.GetInputDesktop()}, count: {ps?.Length}.", SeverityLevel.Warning); } Logger.LogDebug("SOCKET MUTEX ENDED."); @@ -358,7 +358,7 @@ namespace MouseWithoutBorders Logger.TelemetryLogTrace($"[{actionName}] took more than {(long)timeout.TotalSeconds}, restarting the process.", SeverityLevel.Warning, true); - string desktop = Common.GetMyDesktop(); + string desktop = WinAPI.GetMyDesktop(); MachineStuff.oneInstanceCheck?.Close(); _ = Process.Start(Application.ExecutablePath, desktop); Logger.LogDebug($"Started on desktop {desktop}"); @@ -514,7 +514,7 @@ namespace MouseWithoutBorders internal static void SendHeartBeat(bool initial = false) { - SendPackage(ID.ALL, initial && Common.GeneratedKey ? PackageType.Heartbeat_ex : PackageType.Heartbeat); + SendPackage(ID.ALL, initial && Encryption.GeneratedKey ? PackageType.Heartbeat_ex : PackageType.Heartbeat); } private static long lastSendNextMachine; @@ -550,7 +550,7 @@ namespace MouseWithoutBorders internal static void SendAwakeBeat() { - if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop && Common.IsMyDesktopActive() && + if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop && WinAPI.IsMyDesktopActive() && Setting.Values.BlockScreenSaver && lastRealInputEventCount != Event.RealInputEventCount) { SendPackage(ID.ALL, PackageType.Awake); @@ -568,7 +568,7 @@ namespace MouseWithoutBorders { if (lastInputEventCount == Event.InputEventCount) { - if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop && Common.IsMyDesktopActive()) + if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop && WinAPI.IsMyDesktopActive()) { PokeMyself(); } @@ -577,13 +577,13 @@ namespace MouseWithoutBorders lastInputEventCount = Event.InputEventCount; } - private static void PokeMyself() + internal static void PokeMyself() { int x, y = 0; for (int i = 0; i < 10; i++) { - x = Ran.Next(-9, 10); + x = Encryption.Ran.Next(-9, 10); InputSimulation.MoveMouseRelative(x, y); Thread.Sleep(50); InputSimulation.MoveMouseRelative(-x, -y); @@ -677,7 +677,7 @@ namespace MouseWithoutBorders { Common.MMSleep(0.2); InputSimulation.SendKey(new KEYBDDATA() { wVk = (int)VK.SNAPSHOT }); - InputSimulation.SendKey(new KEYBDDATA() { dwFlags = (int)Common.LLKHF.UP, wVk = (int)VK.SNAPSHOT }); + InputSimulation.SendKey(new KEYBDDATA() { dwFlags = (int)WM.LLKHF.UP, wVk = (int)VK.SNAPSHOT }); Logger.LogDebug("PrepareScreenCapture: SNAPSHOT simulated."); @@ -710,7 +710,7 @@ namespace MouseWithoutBorders "\"" + Environment.ExpandEnvironmentVariables(@"%SystemRoot%\System32\Mspaint.exe") + "\"", "\"" + file + "\"", - GetInputDesktop(), + WinAPI.GetInputDesktop(), 1); // CreateNormalIntegrityProcess(Environment.ExpandEnvironmentVariables(@"%SystemRoot%\System32\Mspaint.exe") + @@ -919,7 +919,7 @@ namespace MouseWithoutBorders try { - data.Id = Interlocked.Increment(ref PackageID); + data.Id = Interlocked.Increment(ref Package.PackageID); bool updateClientSockets = false; @@ -999,7 +999,7 @@ namespace MouseWithoutBorders } else { - PackageSent.Nil++; + Package.PackageSent.Nil++; } } @@ -1379,7 +1379,7 @@ namespace MouseWithoutBorders if (string.IsNullOrEmpty(machine_Name)) { - machine_Name = "RANDOM" + Ran.Next().ToString(CultureInfo.CurrentCulture); + machine_Name = "RANDOM" + Encryption.Ran.Next().ToString(CultureInfo.CurrentCulture); } } @@ -1533,13 +1533,13 @@ namespace MouseWithoutBorders internal static void SendOrReceiveARandomDataBlockPerInitialIV(Stream st, bool send = true) { - byte[] ranData = new byte[SymAlBlockSize]; + byte[] ranData = new byte[Encryption.SymAlBlockSize]; try { if (send) { - ranData = RandomNumberGenerator.GetBytes(SymAlBlockSize); + ranData = RandomNumberGenerator.GetBytes(Encryption.SymAlBlockSize); st.Write(ranData, 0, ranData.Length); } else diff --git a/src/modules/MouseWithoutBorders/App/Class/InputHook.cs b/src/modules/MouseWithoutBorders/App/Class/InputHook.cs index d68b1a1584..53e815c1a0 100644 --- a/src/modules/MouseWithoutBorders/App/Class/InputHook.cs +++ b/src/modules/MouseWithoutBorders/App/Class/InputHook.cs @@ -109,7 +109,7 @@ namespace MouseWithoutBorders.Class // Install Mouse Hook mouseHookProcedure = new NativeMethods.HookProc(MouseHookProc); hMouseHook = NativeMethods.SetWindowsHookEx( - Common.WH_MOUSE_LL, + WM.WH_MOUSE_LL, mouseHookProcedure, Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly().GetModules()[0]), @@ -126,7 +126,7 @@ namespace MouseWithoutBorders.Class // Install Keyboard Hook keyboardHookProcedure = new NativeMethods.HookProc(KeyboardHookProc); hKeyboardHook = NativeMethods.SetWindowsHookEx( - Common.WH_KEYBOARD_LL, + WM.WH_KEYBOARD_LL, keyboardHookProcedure, Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly().GetModules()[0]), @@ -233,7 +233,7 @@ namespace MouseWithoutBorders.Class if (nCode >= 0 && MouseEvent != null) { - if (wParam == Common.WM_LBUTTONUP && SkipMouseUpCount > 0) + if (wParam == WM.WM_LBUTTONUP && SkipMouseUpCount > 0) { Logger.LogDebug($"{nameof(SkipMouseUpCount)}: {SkipMouseUpCount}."); SkipMouseUpCount--; @@ -241,7 +241,7 @@ namespace MouseWithoutBorders.Class return rv; } - if ((wParam == Common.WM_LBUTTONUP || wParam == Common.WM_LBUTTONDOWN) && SkipMouseUpDown) + if ((wParam == WM.WM_LBUTTONUP || wParam == WM.WM_LBUTTONDOWN) && SkipMouseUpDown) { rv = NativeMethods.CallNextHookEx(hMouseHook, nCode, wParam, lParam); return rv; @@ -370,7 +370,7 @@ namespace MouseWithoutBorders.Class private bool ProcessKeyEx(int vkCode, int flags, KEYBDDATA hookCallbackKeybdData) { - if ((flags & (int)Common.LLKHF.UP) == (int)Common.LLKHF.UP) + if ((flags & (int)WM.LLKHF.UP) == (int)WM.LLKHF.UP) { EasyMouseKeyDown = false; @@ -553,7 +553,7 @@ namespace MouseWithoutBorders.Class KeyboardEvent(hookCallbackKeybdData); } - hookCallbackKeybdData.dwFlags |= (int)Common.LLKHF.UP; + hookCallbackKeybdData.dwFlags |= (int)WM.LLKHF.UP; foreach (var code in codes) { diff --git a/src/modules/MouseWithoutBorders/App/Class/InputSimulation.cs b/src/modules/MouseWithoutBorders/App/Class/InputSimulation.cs index e735db814c..156f69597d 100644 --- a/src/modules/MouseWithoutBorders/App/Class/InputSimulation.cs +++ b/src/modules/MouseWithoutBorders/App/Class/InputSimulation.cs @@ -112,12 +112,12 @@ namespace MouseWithoutBorders.Class uint scanCode = 0; // http://msdn.microsoft.com/en-us/library/ms644967(VS.85).aspx - if ((kd.dwFlags & (int)Common.LLKHF.UP) == (int)Common.LLKHF.UP) + if ((kd.dwFlags & (int)WM.LLKHF.UP) == (int)WM.LLKHF.UP) { dwFlags = NativeMethods.KEYEVENTF.KEYUP; } - if ((kd.dwFlags & (int)Common.LLKHF.EXTENDED) == (int)Common.LLKHF.EXTENDED) + if ((kd.dwFlags & (int)WM.LLKHF.EXTENDED) == (int)WM.LLKHF.EXTENDED) { dwFlags |= NativeMethods.KEYEVENTF.EXTENDEDKEY; } @@ -173,44 +173,44 @@ namespace MouseWithoutBorders.Class mouse_input.mi.dy = (int)dy; mouse_input.mi.mouseData = md.WheelDelta; - if (md.dwFlags != Common.WM_MOUSEMOVE) + if (md.dwFlags != WM.WM_MOUSEMOVE) { Logger.LogDebug($"InputSimulation.SendMouse: x = {md.X}, y = {md.Y}, WheelDelta = {md.WheelDelta}, dwFlags = {md.dwFlags}."); } switch (md.dwFlags) { - case Common.WM_MOUSEMOVE: + case WM.WM_MOUSEMOVE: mouse_input.mi.dwFlags |= (int)(NativeMethods.MOUSEEVENTF.MOVE | NativeMethods.MOUSEEVENTF.ABSOLUTE); break; - case Common.WM_LBUTTONDOWN: + case WM.WM_LBUTTONDOWN: mouse_input.mi.dwFlags |= (int)NativeMethods.MOUSEEVENTF.LEFTDOWN; break; - case Common.WM_LBUTTONUP: + case WM.WM_LBUTTONUP: mouse_input.mi.dwFlags |= (int)NativeMethods.MOUSEEVENTF.LEFTUP; break; - case Common.WM_RBUTTONDOWN: + case WM.WM_RBUTTONDOWN: mouse_input.mi.dwFlags |= (int)NativeMethods.MOUSEEVENTF.RIGHTDOWN; break; - case Common.WM_RBUTTONUP: + case WM.WM_RBUTTONUP: mouse_input.mi.dwFlags |= (int)NativeMethods.MOUSEEVENTF.RIGHTUP; break; - case Common.WM_MBUTTONDOWN: + case WM.WM_MBUTTONDOWN: mouse_input.mi.dwFlags |= (int)NativeMethods.MOUSEEVENTF.MIDDLEDOWN; break; - case Common.WM_MBUTTONUP: + case WM.WM_MBUTTONUP: mouse_input.mi.dwFlags |= (int)NativeMethods.MOUSEEVENTF.MIDDLEUP; break; - case Common.WM_MOUSEWHEEL: + case WM.WM_MOUSEWHEEL: mouse_input.mi.dwFlags |= (int)NativeMethods.MOUSEEVENTF.WHEEL; break; - case Common.WM_MOUSEHWHEEL: + case WM.WM_MOUSEHWHEEL: mouse_input.mi.dwFlags |= (int)NativeMethods.MOUSEEVENTF.HWHEEL; break; - case Common.WM_XBUTTONUP: + case WM.WM_XBUTTONUP: mouse_input.mi.dwFlags |= (int)NativeMethods.MOUSEEVENTF.XUP; break; - case Common.WM_XBUTTONDOWN: + case WM.WM_XBUTTONDOWN: mouse_input.mi.dwFlags |= (int)NativeMethods.MOUSEEVENTF.XDOWN; break; @@ -373,7 +373,7 @@ namespace MouseWithoutBorders.Class { eatKey = false; - if ((flags & (int)Common.LLKHF.UP) == (int)Common.LLKHF.UP) + if ((flags & (int)WM.LLKHF.UP) == (int)WM.LLKHF.UP) { switch ((VK)vkCode) { diff --git a/src/modules/MouseWithoutBorders/App/Class/Program.cs b/src/modules/MouseWithoutBorders/App/Class/Program.cs index c139da46e9..23513e1515 100644 --- a/src/modules/MouseWithoutBorders/App/Class/Program.cs +++ b/src/modules/MouseWithoutBorders/App/Class/Program.cs @@ -143,7 +143,7 @@ namespace MouseWithoutBorders.Class return; } - string myDesktop = Common.GetMyDesktop(); + string myDesktop = WinAPI.GetMyDesktop(); if (firstArg.Equals("winlogon", StringComparison.OrdinalIgnoreCase)) { @@ -305,8 +305,8 @@ namespace MouseWithoutBorders.Class MachineStuff.ClearComputerMatrix(); Setting.Values.MyKey = securityKey; - Common.MyKey = securityKey; - Common.MagicNumber = Common.Get24BitHash(Common.MyKey); + Encryption.MyKey = securityKey; + Encryption.MagicNumber = Encryption.Get24BitHash(Encryption.MyKey); MachineStuff.MachineMatrix = new string[MachineStuff.MAX_MACHINE] { pcName.Trim().ToUpper(CultureInfo.CurrentCulture), Common.MachineName.Trim(), string.Empty, string.Empty }; string[] machines = MachineStuff.MachineMatrix; @@ -328,8 +328,8 @@ namespace MouseWithoutBorders.Class Setting.Values.EasyMouse = (int)EasyMouseOption.Enable; MachineStuff.ClearComputerMatrix(); - Setting.Values.MyKey = Common.MyKey = Common.CreateRandomKey(); - Common.GeneratedKey = true; + Setting.Values.MyKey = Encryption.MyKey = Encryption.CreateRandomKey(); + Encryption.GeneratedKey = true; Setting.Values.PauseInstantSaving = false; Setting.Values.SaveSettings(); diff --git a/src/modules/MouseWithoutBorders/App/Class/Setting.cs b/src/modules/MouseWithoutBorders/App/Class/Setting.cs index 623571f6ce..c526c70976 100644 --- a/src/modules/MouseWithoutBorders/App/Class/Setting.cs +++ b/src/modules/MouseWithoutBorders/App/Class/Setting.cs @@ -109,9 +109,9 @@ namespace MouseWithoutBorders.Class var shouldReopenSockets = false; - if (Common.MyKey != _properties.SecurityKey.Value) + if (Encryption.MyKey != _properties.SecurityKey.Value) { - Common.MyKey = _properties.SecurityKey.Value; + Encryption.MyKey = _properties.SecurityKey.Value; shouldReopenSockets = true; } @@ -489,7 +489,7 @@ namespace MouseWithoutBorders.Class } else { - string randomKey = Common.CreateDefaultKey(); + string randomKey = Encryption.CreateDefaultKey(); _properties.SecurityKey.Value = randomKey; return randomKey; @@ -1055,7 +1055,7 @@ namespace MouseWithoutBorders.Class if (machineId == 0) { - var newMachineId = Common.Ran.Next(); + var newMachineId = Encryption.Ran.Next(); _properties.MachineID.Value = newMachineId; machineId = newMachineId; if (!PauseInstantSaving) diff --git a/src/modules/MouseWithoutBorders/App/Class/SocketStuff.cs b/src/modules/MouseWithoutBorders/App/Class/SocketStuff.cs index c5241beddf..575c9582df 100644 --- a/src/modules/MouseWithoutBorders/App/Class/SocketStuff.cs +++ b/src/modules/MouseWithoutBorders/App/Class/SocketStuff.cs @@ -101,7 +101,7 @@ namespace MouseWithoutBorders.Class { if (encryptedStream == null && BackingSocket.Connected) { - encryptedStream = Common.GetEncryptedStream(new NetworkStream(BackingSocket)); + encryptedStream = Encryption.GetEncryptedStream(new NetworkStream(BackingSocket)); Common.SendOrReceiveARandomDataBlockPerInitialIV(encryptedStream); } @@ -115,7 +115,7 @@ namespace MouseWithoutBorders.Class { if (decryptedStream == null && BackingSocket.Connected) { - decryptedStream = Common.GetDecryptedStream(new NetworkStream(BackingSocket)); + decryptedStream = Encryption.GetDecryptedStream(new NetworkStream(BackingSocket)); Common.SendOrReceiveARandomDataBlockPerInitialIV(decryptedStream, false); } @@ -181,7 +181,7 @@ namespace MouseWithoutBorders.Class Logger.LogDebug("SocketStuff started."); bASE_PORT = port; - Common.Ran = new Random(); + Encryption.Ran = new Random(); Logger.LogDebug("Validating session..."); @@ -221,11 +221,11 @@ namespace MouseWithoutBorders.Class if (Setting.Values.IsMyKeyRandom) { - Setting.Values.MyKey = Common.MyKey; + Setting.Values.MyKey = Encryption.MyKey; } - Common.MagicNumber = Common.Get24BitHash(Common.MyKey); - Common.PackageID = Setting.Values.PackageID; + Encryption.MagicNumber = Encryption.Get24BitHash(Encryption.MyKey); + Package.PackageID = Setting.Values.PackageID; TcpPort = bASE_PORT; @@ -242,7 +242,7 @@ namespace MouseWithoutBorders.Class Logger.TelemetryLogTrace($"{nameof(SocketStuff)}: {e.Message}", SeverityLevel.Warning); } - Common.GetScreenConfig(); + WinAPI.GetScreenConfig(); if (firstRun && Common.RunOnScrSaverDesktop) { @@ -305,7 +305,7 @@ namespace MouseWithoutBorders.Class sleepSecs = 10; // It is reasonable to give a try on restarting MwB processes in other sessions. - if (restartCount++ < 5 && Common.IsMyDesktopActive() && !Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop) + if (restartCount++ < 5 && WinAPI.IsMyDesktopActive() && !Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop) { Logger.TelemetryLogTrace("Restarting the service dues to WSAEADDRINUSE.", SeverityLevel.Warning); Program.StartService(); @@ -361,7 +361,7 @@ namespace MouseWithoutBorders.Class { Setting.Values.LastX = Common.LastX; Setting.Values.LastY = Common.LastY; - Setting.Values.PackageID = Common.PackageID; + Setting.Values.PackageID = Package.PackageID; // Common.Log("Saving IP: " + Setting.Values.DesMachineID.ToString(CultureInfo.CurrentCulture)); Setting.Values.DesMachineID = (uint)Common.DesMachineID; @@ -505,10 +505,10 @@ namespace MouseWithoutBorders.Class throw new ExpectedSocketException(log); } - bytes[3] = (byte)((Common.MagicNumber >> 24) & 0xFF); - bytes[2] = (byte)((Common.MagicNumber >> 16) & 0xFF); + bytes[3] = (byte)((Encryption.MagicNumber >> 24) & 0xFF); + bytes[2] = (byte)((Encryption.MagicNumber >> 16) & 0xFF); bytes[1] = 0; - for (int i = 2; i < Common.PACKAGE_SIZE; i++) + for (int i = 2; i < Package.PACKAGE_SIZE; i++) { bytes[1] = (byte)(bytes[1] + bytes[i]); } @@ -535,13 +535,13 @@ namespace MouseWithoutBorders.Class magic = (buf[3] << 24) + (buf[2] << 16); - if (magic != (Common.MagicNumber & 0xFFFF0000)) + if (magic != (Encryption.MagicNumber & 0xFFFF0000)) { Logger.Log("Magic number invalid!"); buf[0] = (byte)PackageType.Invalid; } - for (int i = 2; i < Common.PACKAGE_SIZE; i++) + for (int i = 2; i < Package.PACKAGE_SIZE; i++) { checksum = (byte)(checksum + buf[i]); } @@ -557,7 +557,7 @@ namespace MouseWithoutBorders.Class internal static DATA TcpReceiveData(TcpSk tcp, out int bytesReceived) { - byte[] buf = new byte[Common.PACKAGE_SIZE_EX]; + byte[] buf = new byte[Package.PACKAGE_SIZE_EX]; Stream decryptedStream = tcp.DecryptedStream; if (tcp.BackingSocket == null || !tcp.BackingSocket.Connected || decryptedStream == null) @@ -571,9 +571,9 @@ namespace MouseWithoutBorders.Class try { - bytesReceived = decryptedStream.ReadEx(buf, 0, Common.PACKAGE_SIZE); + bytesReceived = decryptedStream.ReadEx(buf, 0, Package.PACKAGE_SIZE); - if (bytesReceived != Common.PACKAGE_SIZE) + if (bytesReceived != Package.PACKAGE_SIZE) { buf[0] = bytesReceived == 0 ? (byte)PackageType.Error : (byte)PackageType.Invalid; } @@ -586,9 +586,9 @@ namespace MouseWithoutBorders.Class if (package.IsBigPackage) { - bytesReceived = decryptedStream.ReadEx(buf, Common.PACKAGE_SIZE, Common.PACKAGE_SIZE); + bytesReceived = decryptedStream.ReadEx(buf, Package.PACKAGE_SIZE, Package.PACKAGE_SIZE); - if (bytesReceived != Common.PACKAGE_SIZE) + if (bytesReceived != Package.PACKAGE_SIZE) { buf[0] = bytesReceived == 0 ? (byte)PackageType.Error : (byte)PackageType.Invalid; } @@ -614,28 +614,28 @@ namespace MouseWithoutBorders.Class switch (type) { case PackageType.Keyboard: - Common.PackageSent.Keyboard++; + Package.PackageSent.Keyboard++; break; case PackageType.Mouse: - Common.PackageSent.Mouse++; + Package.PackageSent.Mouse++; break; case PackageType.Heartbeat: case PackageType.Heartbeat_ex: - Common.PackageSent.Heartbeat++; + Package.PackageSent.Heartbeat++; break; case PackageType.Hello: - Common.PackageSent.Hello++; + Package.PackageSent.Hello++; break; case PackageType.ByeBye: - Common.PackageSent.ByeBye++; + Package.PackageSent.ByeBye++; break; case PackageType.Matrix: - Common.PackageSent.Matrix++; + Package.PackageSent.Matrix++; break; default: @@ -643,11 +643,11 @@ namespace MouseWithoutBorders.Class switch (subtype) { case (byte)PackageType.ClipboardText: - Common.PackageSent.ClipboardText++; + Package.PackageSent.ClipboardText++; break; case (byte)PackageType.ClipboardImage: - Common.PackageSent.ClipboardImage++; + Package.PackageSent.ClipboardImage++; break; default: @@ -1266,7 +1266,7 @@ namespace MouseWithoutBorders.Class string strIP = string.Empty; ID remoteID = ID.NONE; - byte[] buf = RandomNumberGenerator.GetBytes(Common.PACKAGE_SIZE_EX); + byte[] buf = RandomNumberGenerator.GetBytes(Package.PACKAGE_SIZE_EX); d = new DATA(buf); TcpSk currentTcp = tcp; @@ -1280,8 +1280,8 @@ namespace MouseWithoutBorders.Class try { - currentSocket.SendBufferSize = Common.PACKAGE_SIZE * 10000; - currentSocket.ReceiveBufferSize = Common.PACKAGE_SIZE * 10000; + currentSocket.SendBufferSize = Package.PACKAGE_SIZE * 10000; + currentSocket.ReceiveBufferSize = Package.PACKAGE_SIZE * 10000; currentSocket.NoDelay = true; // This is very interesting to know:( currentSocket.SendTimeout = 500; d.MachineName = Common.MachineName; @@ -1829,7 +1829,7 @@ namespace MouseWithoutBorders.Class } while (rv > 0); - if ((rv = Common.PACKAGE_SIZE - (sentCount % Common.PACKAGE_SIZE)) > 0) + if ((rv = Package.PACKAGE_SIZE - (sentCount % Package.PACKAGE_SIZE)) > 0) { Array.Clear(buf, 0, buf.Length); ecStream.Write(buf, 0, rv); @@ -1900,7 +1900,7 @@ namespace MouseWithoutBorders.Class } while (rv > 0); - if ((rv = sentCount % Common.PACKAGE_SIZE) > 0) + if ((rv = sentCount % Package.PACKAGE_SIZE) > 0) { Array.Clear(buf, 0, buf.Length); ecStream.Write(buf, 0, rv); @@ -1984,7 +1984,7 @@ namespace MouseWithoutBorders.Class if (tcp.MachineId == Setting.Values.MachineId) { tcp = null; - Setting.Values.MachineId = Common.Ran.Next(); + Setting.Values.MachineId = Encryption.Ran.Next(); InitAndCleanup.UpdateMachineTimeAndID(); InitAndCleanup.PleaseReopenSocket = InitAndCleanup.REOPEN_WHEN_HOTKEY; diff --git a/src/modules/MouseWithoutBorders/App/Class/TcpServer.cs b/src/modules/MouseWithoutBorders/App/Class/TcpServer.cs index f915ae94e0..cc98381483 100644 --- a/src/modules/MouseWithoutBorders/App/Class/TcpServer.cs +++ b/src/modules/MouseWithoutBorders/App/Class/TcpServer.cs @@ -70,7 +70,7 @@ namespace MouseWithoutBorders.Class continue; } - if (!Common.IsMyDesktopActive()) + if (!WinAPI.IsMyDesktopActive()) { // We can just throw the SocketException but to avoid a redundant log entry: throw new ExpectedSocketException($"{nameof(StartServer)}: The desktop is no longer active."); diff --git a/src/modules/MouseWithoutBorders/App/Core/Clipboard.cs b/src/modules/MouseWithoutBorders/App/Core/Clipboard.cs index 5840325941..e557ff4a37 100644 --- a/src/modules/MouseWithoutBorders/App/Core/Clipboard.cs +++ b/src/modules/MouseWithoutBorders/App/Core/Clipboard.cs @@ -270,15 +270,15 @@ internal static class Clipboard int index = 0; int len; DATA package = new(); - byte[] buf = new byte[Common.PACKAGE_SIZE_EX]; - int dataStart = Common.PACKAGE_SIZE_EX - DATA_SIZE; + byte[] buf = new byte[Package.PACKAGE_SIZE_EX]; + int dataStart = Package.PACKAGE_SIZE_EX - DATA_SIZE; while (true) { if ((index + DATA_SIZE) > l) { len = l - index; - Array.Clear(buf, 0, Common.PACKAGE_SIZE_EX); + Array.Clear(buf, 0, Package.PACKAGE_SIZE_EX); } else { @@ -315,7 +315,7 @@ internal static class Clipboard } MemoryStream m = new(); - int dataStart = Common.PACKAGE_SIZE_EX - DATA_SIZE; + int dataStart = Package.PACKAGE_SIZE_EX - DATA_SIZE; m.Write(data.Bytes, dataStart, DATA_SIZE); int unexpectedCount = 0; @@ -809,27 +809,27 @@ internal static class Clipboard MachineName = Common.MachineName, }; - byte[] buf = new byte[Common.PACKAGE_SIZE_EX]; + byte[] buf = new byte[Package.PACKAGE_SIZE_EX]; NetworkStream ns = new(s); - enStream = Common.GetEncryptedStream(ns); + enStream = Encryption.GetEncryptedStream(ns); Common.SendOrReceiveARandomDataBlockPerInitialIV(enStream); Logger.LogDebug($"{nameof(ShakeHand)}: Writing header package."); - enStream.Write(package.Bytes, 0, Common.PACKAGE_SIZE_EX); + enStream.Write(package.Bytes, 0, Package.PACKAGE_SIZE_EX); Logger.LogDebug($"{nameof(ShakeHand)}: Sent: clientPush={clientPushData}, postAction={postAction}."); - deStream = Common.GetDecryptedStream(ns); + deStream = Encryption.GetDecryptedStream(ns); Common.SendOrReceiveARandomDataBlockPerInitialIV(deStream, false); Logger.LogDebug($"{nameof(ShakeHand)}: Reading header package."); - int bytesReceived = deStream.ReadEx(buf, 0, Common.PACKAGE_SIZE_EX); + int bytesReceived = deStream.ReadEx(buf, 0, Package.PACKAGE_SIZE_EX); package.Bytes = buf; string name = "Unknown"; - if (bytesReceived == Common.PACKAGE_SIZE_EX) + if (bytesReceived == Package.PACKAGE_SIZE_EX) { if (package.Type is PackageType.Clipboard or PackageType.ClipboardPush) { diff --git a/src/modules/MouseWithoutBorders/App/Core/ClipboardPostAction.cs b/src/modules/MouseWithoutBorders/App/Core/ClipboardPostAction.cs new file mode 100644 index 0000000000..c07a8bb91a --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/ClipboardPostAction.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +// +// Package format/conversion. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +internal enum ClipboardPostAction : uint +{ + Other = 0, + Desktop = 1, + Mspaint = 2, +} diff --git a/src/modules/MouseWithoutBorders/App/Core/DATA.cs b/src/modules/MouseWithoutBorders/App/Core/DATA.cs new file mode 100644 index 0000000000..4085483bd9 --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/DATA.cs @@ -0,0 +1,150 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +// In X64, we are WOW +[module: SuppressMessage("Microsoft.Portability", "CA1900:ValueTypeFieldsShouldBePortable", Scope = "type", Target = "MouseWithoutBorders.Core.DATA", Justification = "Dotnet port with style preservation")] + +// +// Package format/conversion. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +// The beauty of "union" in C# +[StructLayout(LayoutKind.Explicit)] +internal sealed class DATA +{ + [FieldOffset(0)] + internal PackageType Type; // 4 (first byte = package type, 1 = checksum, 2+3 = magic no.) + + [FieldOffset(sizeof(PackageType))] + internal int Id; // 4 + + [FieldOffset(sizeof(PackageType) + sizeof(uint))] + internal ID Src; // 4 + + [FieldOffset(sizeof(PackageType) + (2 * sizeof(uint)))] + internal ID Des; // 4 + + [FieldOffset(sizeof(PackageType) + (3 * sizeof(uint)))] + internal long DateTime; + + [FieldOffset(sizeof(PackageType) + (3 * sizeof(uint)) + sizeof(long))] + internal KEYBDDATA Kd; + + [FieldOffset(sizeof(PackageType) + (3 * sizeof(uint)))] + internal MOUSEDATA Md; + + [FieldOffset(sizeof(PackageType) + (3 * sizeof(uint)))] + internal ID Machine1; + + [FieldOffset(sizeof(PackageType) + (4 * sizeof(uint)))] + internal ID Machine2; + + [FieldOffset(sizeof(PackageType) + (5 * sizeof(uint)))] + internal ID Machine3; + + [FieldOffset(sizeof(PackageType) + (6 * sizeof(uint)))] + internal ID Machine4; + + [FieldOffset(sizeof(PackageType) + (3 * sizeof(uint)))] + internal ClipboardPostAction PostAction; + + [FieldOffset(sizeof(PackageType) + (7 * sizeof(uint)))] + private long machineNameP1; + + [FieldOffset(sizeof(PackageType) + (7 * sizeof(uint)) + sizeof(long))] + private long machineNameP2; + + [FieldOffset(sizeof(PackageType) + (7 * sizeof(uint)) + (2 * sizeof(long)))] + private long machineNameP3; + + [FieldOffset(sizeof(PackageType) + (7 * sizeof(uint)) + (3 * sizeof(long)))] + private long machineNameP4; + + internal string MachineName + { + get + { + string name = Common.GetString(BitConverter.GetBytes(machineNameP1)) + + Common.GetString(BitConverter.GetBytes(machineNameP2)) + + Common.GetString(BitConverter.GetBytes(machineNameP3)) + + Common.GetString(BitConverter.GetBytes(machineNameP4)); + return name.Trim(); + } + + set + { + byte[] machineName = Common.GetBytes(value.PadRight(32, ' ')); + machineNameP1 = BitConverter.ToInt64(machineName, 0); + machineNameP2 = BitConverter.ToInt64(machineName, 8); + machineNameP3 = BitConverter.ToInt64(machineName, 16); + machineNameP4 = BitConverter.ToInt64(machineName, 24); + } + } + + public DATA() + { + } + + public DATA(byte[] initialData) + { + Bytes = initialData; + } + + internal byte[] Bytes + { + get + { + byte[] buf = new byte[IsBigPackage ? Package.PACKAGE_SIZE_EX : Package.PACKAGE_SIZE]; + Array.Copy(StructToBytes(this), buf, IsBigPackage ? Package.PACKAGE_SIZE_EX : Package.PACKAGE_SIZE); + + return buf; + } + + set + { + Debug.Assert(value.Length <= Package.PACKAGE_SIZE_EX, "Length > package size"); + byte[] buf = new byte[Package.PACKAGE_SIZE_EX]; + Array.Copy(value, buf, value.Length); + BytesToStruct(buf, this); + } + } + + internal bool IsBigPackage + { + get => Type == 0 + ? throw new InvalidOperationException("Package type not set.") + : Type switch + { + PackageType.Hello or PackageType.Awake or PackageType.Heartbeat or PackageType.Heartbeat_ex or PackageType.Handshake or PackageType.HandshakeAck or PackageType.ClipboardPush or PackageType.Clipboard or PackageType.ClipboardAsk or PackageType.ClipboardImage or PackageType.ClipboardText or PackageType.ClipboardDataEnd => true, + _ => (Type & PackageType.Matrix) == PackageType.Matrix, + }; + } + + private byte[] StructToBytes(object structObject) + { + byte[] bytes = new byte[Package.PACKAGE_SIZE_EX]; + GCHandle bHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned); + Marshal.StructureToPtr(structObject, Marshal.UnsafeAddrOfPinnedArrayElement(bytes, 0), false); + bHandle.Free(); + return bytes; + } + + private void BytesToStruct(byte[] value, object structObject) + { + GCHandle bHandle = GCHandle.Alloc(value, GCHandleType.Pinned); + Marshal.PtrToStructure(Marshal.UnsafeAddrOfPinnedArrayElement(value, 0), structObject); + bHandle.Free(); + } +} diff --git a/src/modules/MouseWithoutBorders/App/Core/DragDrop.cs b/src/modules/MouseWithoutBorders/App/Core/DragDrop.cs index 2decb83261..d262e48f24 100644 --- a/src/modules/MouseWithoutBorders/App/Core/DragDrop.cs +++ b/src/modules/MouseWithoutBorders/App/Core/DragDrop.cs @@ -67,20 +67,20 @@ internal static class DragDrop return; } - if (wParam == Common.WM_LBUTTONDOWN) + if (wParam == WM.WM_LBUTTONDOWN) { MouseDown = true; DragMachine = MachineStuff.desMachineID; MachineStuff.dropMachineID = ID.NONE; Logger.LogDebug("DragDropStep01: MouseDown"); } - else if (wParam == Common.WM_LBUTTONUP) + else if (wParam == WM.WM_LBUTTONUP) { MouseDown = false; Logger.LogDebug("DragDropStep01: MouseUp"); } - if (wParam == Common.WM_RBUTTONUP && IsDropping) + if (wParam == WM.WM_RBUTTONUP && IsDropping) { IsDropping = false; Clipboard.LastIDWithClipboardData = ID.NONE; @@ -252,7 +252,7 @@ internal static class DragDrop internal static void DragDropStep09(int wParam) { - if (wParam == Common.WM_MOUSEMOVE && IsDropping) + if (wParam == WM.WM_MOUSEMOVE && IsDropping) { // Show/Move form Common.DoSomethingInUIThread(() => @@ -260,7 +260,7 @@ internal static class DragDrop _ = NativeMethods.PostMessage(Common.MainForm.Handle, NativeMethods.WM_SHOW_DRAG_DROP, (IntPtr)0, (IntPtr)0); }); } - else if (wParam == Common.WM_LBUTTONUP && (IsDropping || IsDragging)) + else if (wParam == WM.WM_LBUTTONUP && (IsDropping || IsDragging)) { if (IsDropping) { diff --git a/src/modules/MouseWithoutBorders/App/Core/Encryption.cs b/src/modules/MouseWithoutBorders/App/Core/Encryption.cs new file mode 100644 index 0000000000..9d00b6bb40 --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/Encryption.cs @@ -0,0 +1,245 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Concurrent; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Threading.Tasks; + +// +// Encrypt/decrypt implementation. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +internal static class Encryption +{ +#pragma warning disable SYSLIB0021 + private static AesCryptoServiceProvider symAl; +#pragma warning restore SYSLIB0021 +#pragma warning disable SA1307 // Accessible fields should begin with upper-case letter + internal static string myKey; +#pragma warning restore SA1307 + private static uint magicNumber; + private static Random ran = new(); // Used for non encryption related functionality. + internal const int SymAlBlockSize = 16; + + /// + /// This is used for the first encryption block, the following blocks will be combined with the cipher text of the previous block. + /// Thus identical blocks in the socket stream would be encrypted to different cipher text blocks. + /// The first block is a handshake one containing random data. + /// Related Unit Test: TestEncryptDecrypt + /// + private static readonly string InitialIV = ulong.MaxValue.ToString(CultureInfo.InvariantCulture); + + internal static Random Ran + { + get => Encryption.ran ??= new Random(); + set => Encryption.ran = value; + } + + internal static uint MagicNumber + { + get => Encryption.magicNumber; + set => Encryption.magicNumber = value; + } + + internal static string MyKey + { + get => Encryption.myKey; + + set + { + if (Encryption.myKey != value) + { + Encryption.myKey = value; + _ = Task.Factory.StartNew( + () => Encryption.GenLegalKey(), + System.Threading.CancellationToken.None, + TaskCreationOptions.None, + TaskScheduler.Default); // Cache the key to improve UX. + } + } + } + + private static string KeyDisplayedText(string key) + { + string displayedValue = string.Empty; + int i = 0; + + do + { + int length = Math.Min(4, key.Length - i); + displayedValue += string.Concat(key.AsSpan(i, length), " "); + i += 4; + } + while (i < key.Length - 1); + + return displayedValue.Trim(); + } + + internal static bool GeneratedKey { get; set; } + + internal static bool KeyCorrupted { get; set; } + + internal static void InitEncryption() + { + try + { + if (symAl == null) + { +#pragma warning disable SYSLIB0021 // No proper replacement for now + symAl = new AesCryptoServiceProvider(); +#pragma warning restore SYSLIB0021 + symAl.KeySize = 256; + symAl.BlockSize = SymAlBlockSize * 8; + symAl.Padding = PaddingMode.Zeros; + symAl.Mode = CipherMode.CBC; + symAl.GenerateIV(); + } + } + catch (Exception e) + { + Logger.Log(e); + } + } + + private static readonly ConcurrentDictionary LegalKeyDictionary = new(StringComparer.OrdinalIgnoreCase); + + private static byte[] GenLegalKey() + { + byte[] rv; + string myKey = Encryption.MyKey; + + if (!LegalKeyDictionary.TryGetValue(myKey, out byte[] value)) + { + Rfc2898DeriveBytes key = new( + myKey, + Common.GetBytesU(InitialIV), + 50000, + HashAlgorithmName.SHA512); + rv = key.GetBytes(32); + _ = LegalKeyDictionary.AddOrUpdate(myKey, rv, (k, v) => rv); + } + else + { + rv = value; + } + + return rv; + } + + private static byte[] GenLegalIV() + { + string st = InitialIV; + int ivLength = symAl.IV.Length; + if (st.Length > ivLength) + { + st = st[..ivLength]; + } + else if (st.Length < ivLength) + { + st = st.PadRight(ivLength, ' '); + } + + return Common.GetBytes(st); + } + + internal static Stream GetEncryptedStream(Stream encryptedStream) + { + ICryptoTransform encryptor; + encryptor = symAl.CreateEncryptor(GenLegalKey(), GenLegalIV()); + return new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write); + } + + internal static Stream GetDecryptedStream(Stream encryptedStream) + { + ICryptoTransform decryptor; + decryptor = symAl.CreateDecryptor(GenLegalKey(), GenLegalIV()); + return new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read); + } + + internal static uint Get24BitHash(string st) + { + if (string.IsNullOrEmpty(st)) + { + return 0; + } + + byte[] bytes = new byte[Package.PACKAGE_SIZE]; + for (int i = 0; i < Package.PACKAGE_SIZE; i++) + { + if (i < st.Length) + { + bytes[i] = (byte)st[i]; + } + } + + var hash = SHA512.Create(); + byte[] hashValue = hash.ComputeHash(bytes); + + for (int i = 0; i < 50000; i++) + { + hashValue = hash.ComputeHash(hashValue); + } + + Logger.LogDebug(string.Format(CultureInfo.CurrentCulture, "magic: {0},{1},{2}", hashValue[0], hashValue[1], hashValue[^1])); + hash.Clear(); + return (uint)((hashValue[0] << 23) + (hashValue[1] << 16) + (hashValue[^1] << 8) + hashValue[2]); + } + + internal static string GetDebugInfo(string st) + { + return string.IsNullOrEmpty(st) ? st : ((byte)(Common.GetBytesU(st).Sum(value => value) % 256)).ToString(CultureInfo.InvariantCulture); + } + + internal static string CreateDefaultKey() + { + return CreateRandomKey(); + } + + private const int PW_LENGTH = 16; + + internal static string CreateRandomKey() + { + // Not including characters like "'`O0& since they are confusing to users. + string[] chars = new[] { "abcdefghjkmnpqrstuvxyz", "ABCDEFGHJKMNPQRSTUVXYZ", "123456789", "~!@#$%^*()_-+=:;<,>.?/\\|[]" }; + char[][] charactersUsedForKey = chars.Select(charset => Enumerable.Range(0, charset.Length - 1).Select(i => charset[i]).ToArray()).ToArray(); + byte[] randomData = new byte[1]; + string key = string.Empty; + + do + { + foreach (string set in chars) + { + randomData = RandomNumberGenerator.GetBytes(1); + key += set[randomData[0] % set.Length]; + + if (key.Length >= PW_LENGTH) + { + break; + } + } + } + while (key.Length < PW_LENGTH); + + return key; + } + + internal static bool IsKeyValid(string key, out string error) + { + error = string.IsNullOrEmpty(key) || key.Length < 16 + ? "Key must have at least 16 characters in length (spaces are discarded). Key must be auto generated in one of the machines." + : null; + + return error == null; + } +} diff --git a/src/modules/MouseWithoutBorders/App/Core/Event.cs b/src/modules/MouseWithoutBorders/App/Core/Event.cs index 1e6ee3e371..659a15526e 100644 --- a/src/modules/MouseWithoutBorders/App/Core/Event.cs +++ b/src/modules/MouseWithoutBorders/App/Core/Event.cs @@ -70,7 +70,7 @@ internal static class Event // Check if easy mouse setting is enabled. bool isEasyMouseEnabled = IsSwitchingByMouseEnabled(); - if (isEasyMouseEnabled && Common.Sk != null && (Common.DesMachineID == Common.MachineID || !Setting.Values.MoveMouseRelatively) && e.dwFlags == Common.WM_MOUSEMOVE) + if (isEasyMouseEnabled && Common.Sk != null && (Common.DesMachineID == Common.MachineID || !Setting.Values.MoveMouseRelatively) && e.dwFlags == WM.WM_MOUSEMOVE) { Point p = MachineStuff.MoveToMyNeighbourIfNeeded(e.X, e.Y, MachineStuff.desMachineID); @@ -115,7 +115,7 @@ internal static class Event Common.SkSend(MousePackage, null, false); - if (MousePackage.Md.dwFlags is Common.WM_LBUTTONUP or Common.WM_RBUTTONUP) + if (MousePackage.Md.dwFlags is WM.WM_LBUTTONUP or WM.WM_RBUTTONUP) { Thread.Sleep(10); } @@ -265,7 +265,7 @@ internal static class Event KeybdPackage.Kd = e; KeybdPackage.DateTime = Common.GetTick(); Common.SkSend(KeybdPackage, null, false); - if (KeybdPackage.Kd.dwFlags is Common.WM_KEYUP or Common.WM_SYSKEYUP) + if (KeybdPackage.Kd.dwFlags is WM.WM_KEYUP or WM.WM_SYSKEYUP) { Thread.Sleep(10); } diff --git a/src/modules/MouseWithoutBorders/App/Core/Helper.cs b/src/modules/MouseWithoutBorders/App/Core/Helper.cs index bd66c9a83f..8c291fb417 100644 --- a/src/modules/MouseWithoutBorders/App/Core/Helper.cs +++ b/src/modules/MouseWithoutBorders/App/Core/Helper.cs @@ -290,7 +290,7 @@ internal static class Helper return; } - if (!Common.IsMyDesktopActive()) + if (!WinAPI.IsMyDesktopActive()) { return; } @@ -314,7 +314,7 @@ internal static class Helper _ = Launch.CreateProcessInInputDesktopSession( $"\"{Path.GetDirectoryName(Application.ExecutablePath)}\\{HelperProcessName}.exe\"", string.Empty, - Common.GetInputDesktop(), + WinAPI.GetInputDesktop(), 0); Clipboard.HasSwitchedMachineSinceLastCopy = true; @@ -379,7 +379,7 @@ internal static class Helper log += "=============================================================================================================================\r\n"; log += $"{Application.ProductName} version {Application.ProductVersion}\r\n"; - log += $"{Setting.Values.Username}/{Common.GetDebugInfo(Common.MyKey)}\r\n"; + log += $"{Setting.Values.Username}/{Encryption.GetDebugInfo(Encryption.MyKey)}\r\n"; log += $"{Common.MachineName}/{Common.MachineID}/{Common.DesMachineID}\r\n"; log += $"Id: {Setting.Values.DeviceId}\r\n"; log += $"Matrix: {string.Join(",", MachineStuff.MachineMatrix)}\r\n"; diff --git a/src/modules/MouseWithoutBorders/App/Core/ID.cs b/src/modules/MouseWithoutBorders/App/Core/ID.cs new file mode 100644 index 0000000000..11dfcc22c8 --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/ID.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// +// Package format/conversion. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +internal enum ID : uint +{ + NONE = 0, + ALL = 255, +} diff --git a/src/modules/MouseWithoutBorders/App/Core/InitAndCleanup.cs b/src/modules/MouseWithoutBorders/App/Core/InitAndCleanup.cs index 963775cbca..510671ee95 100644 --- a/src/modules/MouseWithoutBorders/App/Core/InitAndCleanup.cs +++ b/src/modules/MouseWithoutBorders/App/Core/InitAndCleanup.cs @@ -89,23 +89,23 @@ internal static class InitAndCleanup internal static void Init() { _ = Helper.GetUserName(); - Common.GeneratedKey = true; + Encryption.GeneratedKey = true; try { - Common.MyKey = Setting.Values.MyKey; + Encryption.MyKey = Setting.Values.MyKey; int tmp = Setting.Values.MyKeyDaysToExpire; } catch (FormatException e) { - Common.KeyCorrupted = true; - Setting.Values.MyKey = Common.MyKey = Common.CreateRandomKey(); + Encryption.KeyCorrupted = true; + Setting.Values.MyKey = Encryption.MyKey = Encryption.CreateRandomKey(); Logger.Log(e.Message); } catch (CryptographicException e) { - Common.KeyCorrupted = true; - Setting.Values.MyKey = Common.MyKey = Common.CreateRandomKey(); + Encryption.KeyCorrupted = true; + Setting.Values.MyKey = Encryption.MyKey = Encryption.CreateRandomKey(); Logger.Log(e.Message); } @@ -127,14 +127,14 @@ internal static class InitAndCleanup bool dummy = Setting.Values.DrawMouseEx; Common.Is64bitOS = IntPtr.Size == 8; Common.tcpPort = Setting.Values.TcpPort; - Common.GetScreenConfig(); - Common.PackageSent = new PackageMonitor(0); - Common.PackageReceived = new PackageMonitor(0); + WinAPI.GetScreenConfig(); + Package.PackageSent = new PackageMonitor(0); + Package.PackageReceived = new PackageMonitor(0); SetupMachineNameAndID(); - Common.InitEncryption(); + Encryption.InitEncryption(); CreateHelperThreads(); - SystemEvents.DisplaySettingsChanged += new EventHandler(Common.SystemEvents_DisplaySettingsChanged); + SystemEvents.DisplaySettingsChanged += new EventHandler(WinAPI.SystemEvents_DisplaySettingsChanged); NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged); SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged); PleaseReopenSocket = 9; @@ -220,7 +220,7 @@ internal static class InitAndCleanup lastReleaseAllKeysCall = Common.GetTick(); KEYBDDATA kd; - kd.dwFlags = (int)Common.LLKHF.UP; + kd.dwFlags = (int)WM.LLKHF.UP; VK[] keys = new VK[] { @@ -266,7 +266,7 @@ internal static class InitAndCleanup true); } - if (!Common.IsMyDesktopActive()) + if (!WinAPI.IsMyDesktopActive()) { PleaseReopenSocket = 0; } diff --git a/src/modules/MouseWithoutBorders/App/Core/KEYBDDATA.cs b/src/modules/MouseWithoutBorders/App/Core/KEYBDDATA.cs new file mode 100644 index 0000000000..244c069c98 --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/KEYBDDATA.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +// +// Package format/conversion. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +[StructLayout(LayoutKind.Sequential)] +internal struct KEYBDDATA +{ + [SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Same name as in winAPI")] + internal int wVk; + [SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Same name as in winAPI")] + internal int dwFlags; +} diff --git a/src/modules/MouseWithoutBorders/App/Core/Logger.cs b/src/modules/MouseWithoutBorders/App/Core/Logger.cs index 86ce7605b5..4d39983c35 100644 --- a/src/modules/MouseWithoutBorders/App/Core/Logger.cs +++ b/src/modules/MouseWithoutBorders/App/Core/Logger.cs @@ -121,52 +121,52 @@ internal static class Logger { string log; - if (!lastPackageSent.Equals(Common.PackageSent)) + if (!lastPackageSent.Equals(Package.PackageSent)) { log = string.Format( CultureInfo.CurrentCulture, "SENT:" + HeaderSENT, - Common.PackageSent.Heartbeat, - Common.PackageSent.Keyboard, - Common.PackageSent.Mouse, - Common.PackageSent.Hello, - Common.PackageSent.Matrix, - Common.PackageSent.ClipboardText, - Common.PackageSent.ClipboardImage, - Common.PackageSent.ByeBye, - Common.PackageSent.Clipboard, - Common.PackageSent.ClipboardDragDrop, - Common.PackageSent.ClipboardDragDropEnd, - Common.PackageSent.ExplorerDragDrop, + Package.PackageSent.Heartbeat, + Package.PackageSent.Keyboard, + Package.PackageSent.Mouse, + Package.PackageSent.Hello, + Package.PackageSent.Matrix, + Package.PackageSent.ClipboardText, + Package.PackageSent.ClipboardImage, + Package.PackageSent.ByeBye, + Package.PackageSent.Clipboard, + Package.PackageSent.ClipboardDragDrop, + Package.PackageSent.ClipboardDragDropEnd, + Package.PackageSent.ExplorerDragDrop, Event.inputEventCount, - Common.PackageSent.Nil); + Package.PackageSent.Nil); Log(log); - lastPackageSent = Common.PackageSent; // Copy data + lastPackageSent = Package.PackageSent; // Copy data } - if (!lastPackageReceived.Equals(Common.PackageReceived)) + if (!lastPackageReceived.Equals(Package.PackageReceived)) { log = string.Format( CultureInfo.CurrentCulture, "RECEIVED:" + HeaderRECEIVED, - Common.PackageReceived.Heartbeat, - Common.PackageReceived.Keyboard, - Common.PackageReceived.Mouse, - Common.PackageReceived.Hello, - Common.PackageReceived.Matrix, - Common.PackageReceived.ClipboardText, - Common.PackageReceived.ClipboardImage, - Common.PackageReceived.ByeBye, - Common.PackageReceived.Clipboard, - Common.PackageReceived.ClipboardDragDrop, - Common.PackageReceived.ClipboardDragDropEnd, - Common.PackageReceived.ExplorerDragDrop, + Package.PackageReceived.Heartbeat, + Package.PackageReceived.Keyboard, + Package.PackageReceived.Mouse, + Package.PackageReceived.Hello, + Package.PackageReceived.Matrix, + Package.PackageReceived.ClipboardText, + Package.PackageReceived.ClipboardImage, + Package.PackageReceived.ByeBye, + Package.PackageReceived.Clipboard, + Package.PackageReceived.ClipboardDragDrop, + Package.PackageReceived.ClipboardDragDropEnd, + Package.PackageReceived.ExplorerDragDrop, Event.invalidPackageCount, - Common.PackageReceived.Nil, + Package.PackageReceived.Nil, Receiver.processedPackageCount, Receiver.skippedPackageCount); Log(log); - lastPackageReceived = Common.PackageReceived; + lastPackageReceived = Package.PackageReceived; } } @@ -209,9 +209,9 @@ internal static class Logger "Private Mem: " + (Process.GetCurrentProcess().PrivateMemorySize64 / 1024).ToString(CultureInfo.CurrentCulture) + "KB", sb.ToString()); - if (!string.IsNullOrEmpty(Common.myKey)) + if (!string.IsNullOrEmpty(Encryption.myKey)) { - log = log.Replace(Common.MyKey, Common.GetDebugInfo(Common.MyKey)); + log = log.Replace(Encryption.MyKey, Encryption.GetDebugInfo(Encryption.MyKey)); } log += Thread.DumpThreadsStack(); @@ -251,14 +251,18 @@ internal static class Logger { typeof(Clipboard), typeof(DragDrop), + typeof(Encryption), typeof(Event), typeof(InitAndCleanup), typeof(Helper), typeof(Launch), typeof(Logger), typeof(MachineStuff), + typeof(Package), typeof(Receiver), typeof(Service), + typeof(WinAPI), + typeof(WM), }; foreach (var staticType in staticTypes) { @@ -294,7 +298,7 @@ internal static class Logger // strArr[3] = t.FullName; strArr[4] = " = "; strArr[5] = objName.Equals("myKey", StringComparison.OrdinalIgnoreCase) - ? Common.GetDebugInfo(objString) + ? Encryption.GetDebugInfo(objString) : objName.Equals("lastClipboardObject", StringComparison.OrdinalIgnoreCase) ? string.Empty : objString diff --git a/src/modules/MouseWithoutBorders/App/Core/MOUSEDATA.cs b/src/modules/MouseWithoutBorders/App/Core/MOUSEDATA.cs new file mode 100644 index 0000000000..8f8e0f4267 --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/MOUSEDATA.cs @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +// +// Package format/conversion. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +[StructLayout(LayoutKind.Sequential)] +internal struct MOUSEDATA +{ + internal int X; + internal int Y; + internal int WheelDelta; + [SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Same name as in winAPI")] + internal int dwFlags; +} diff --git a/src/modules/MouseWithoutBorders/App/Core/MachineStuff.cs b/src/modules/MouseWithoutBorders/App/Core/MachineStuff.cs index e5263aa788..add9a03b04 100644 --- a/src/modules/MouseWithoutBorders/App/Core/MachineStuff.cs +++ b/src/modules/MouseWithoutBorders/App/Core/MachineStuff.cs @@ -221,9 +221,9 @@ internal static class MachineStuff if (Setting.Values.BlockMouseAtCorners) { - lock (Common.SensitivePoints) + lock (WinAPI.SensitivePoints) { - foreach (Point p in Common.SensitivePoints) + foreach (Point p in WinAPI.SensitivePoints) { if (Math.Abs(p.X - x) < 100 && Math.Abs(p.Y - y) < 100) { @@ -793,8 +793,8 @@ internal static class MachineStuff internal static void ShowSetupForm(bool reopenSockets = false) { Logger.LogDebug("========== BEGIN THE SETUP EXPERIENCE ==========", true); - Setting.Values.MyKey = Common.MyKey = Common.CreateRandomKey(); - Common.GeneratedKey = true; + Setting.Values.MyKey = Encryption.MyKey = Encryption.CreateRandomKey(); + Encryption.GeneratedKey = true; if (Process.GetCurrentProcess().SessionId != NativeMethods.WTSGetActiveConsoleSessionId()) { @@ -1067,7 +1067,7 @@ internal static class MachineStuff internal static void AssertOneInstancePerDesktopSession() { - string eventName = $"Global\\{Application.ProductName}-{FrmAbout.AssemblyVersion}-{Common.GetMyDesktop()}-{Common.CurrentProcess.SessionId}"; + string eventName = $"Global\\{Application.ProductName}-{FrmAbout.AssemblyVersion}-{WinAPI.GetMyDesktop()}-{Common.CurrentProcess.SessionId}"; oneInstanceCheck = new EventWaitHandle(false, EventResetMode.ManualReset, eventName, out bool created); if (!created) diff --git a/src/modules/MouseWithoutBorders/App/Core/Package.cs b/src/modules/MouseWithoutBorders/App/Core/Package.cs new file mode 100644 index 0000000000..54b5e3e467 --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/Package.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// +// Package format/conversion. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +internal static class Package +{ + internal const byte PACKAGE_SIZE = 32; + internal const byte PACKAGE_SIZE_EX = 64; + private const byte WP_PACKAGE_SIZE = 6; + internal static PackageMonitor PackageSent; + internal static PackageMonitor PackageReceived; + internal static int PackageID; +} diff --git a/src/modules/MouseWithoutBorders/App/Core/PackageMonitor.cs b/src/modules/MouseWithoutBorders/App/Core/PackageMonitor.cs new file mode 100644 index 0000000000..e0ccf9ef75 --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/PackageMonitor.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// +// Package format/conversion. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +internal struct PackageMonitor +{ + internal ulong Keyboard; + internal ulong Mouse; + internal ulong Heartbeat; + internal ulong ByeBye; + internal ulong Hello; + internal ulong Matrix; + internal ulong ClipboardText; + internal ulong ClipboardImage; + internal ulong Clipboard; + internal ulong ClipboardDragDrop; + internal ulong ClipboardDragDropEnd; + internal ulong ClipboardAsk; + internal ulong ExplorerDragDrop; + internal ulong Nil; + + internal PackageMonitor(ulong value) + { + ClipboardDragDrop = ClipboardDragDropEnd = ExplorerDragDrop = + Keyboard = Mouse = Heartbeat = ByeBye = Hello = Clipboard = + Matrix = ClipboardImage = ClipboardText = Nil = ClipboardAsk = value; + } +} diff --git a/src/modules/MouseWithoutBorders/App/Core/PackageType.cs b/src/modules/MouseWithoutBorders/App/Core/PackageType.cs new file mode 100644 index 0000000000..9b7b48fc12 --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/PackageType.cs @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// +// Package format/conversion. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +internal enum PackageType // : int +{ + // Search for PACKAGE_TYPE_RELATED before changing these! + Invalid = 0xFF, + + Error = 0xFE, + + Hi = 2, + Hello = 3, + ByeBye = 4, + + Heartbeat = 20, + Awake = 21, + HideMouse = 50, + Heartbeat_ex = 51, + Heartbeat_ex_l2 = 52, + Heartbeat_ex_l3 = 53, + + Clipboard = 69, + ClipboardDragDrop = 70, + ClipboardDragDropEnd = 71, + ExplorerDragDrop = 72, + ClipboardCapture = 73, + CaptureScreenCommand = 74, + ClipboardDragDropOperation = 75, + ClipboardDataEnd = 76, + MachineSwitched = 77, + ClipboardAsk = 78, + ClipboardPush = 79, + + NextMachine = 121, + Keyboard = 122, + Mouse = 123, + ClipboardText = 124, + ClipboardImage = 125, + + Handshake = 126, + HandshakeAck = 127, + + Matrix = 128, + MatrixSwapFlag = 2, + MatrixTwoRowFlag = 4, +} diff --git a/src/modules/MouseWithoutBorders/App/Core/Receiver.cs b/src/modules/MouseWithoutBorders/App/Core/Receiver.cs index 1b1e0730b0..0a6aaad2ee 100644 --- a/src/modules/MouseWithoutBorders/App/Core/Receiver.cs +++ b/src/modules/MouseWithoutBorders/App/Core/Receiver.cs @@ -93,7 +93,7 @@ internal static class Receiver switch (package.Type) { case PackageType.Keyboard: - Common.PackageReceived.Keyboard++; + Package.PackageReceived.Keyboard++; if (package.Des == Common.MachineID || package.Des == ID.ALL) { JustGotAKey = Common.GetTick(); @@ -102,7 +102,7 @@ internal static class Receiver bool nonElevated = Common.RunWithNoAdminRight && false; if (nonElevated && Setting.Values.OneWayControlMode) { - if ((package.Kd.dwFlags & (int)Common.LLKHF.UP) == (int)Common.LLKHF.UP) + if ((package.Kd.dwFlags & (int)WM.LLKHF.UP) == (int)WM.LLKHF.UP) { Helper.ShowOneWayModeMessage(); } @@ -116,7 +116,7 @@ internal static class Receiver break; case PackageType.Mouse: - Common.PackageReceived.Mouse++; + Package.PackageReceived.Mouse++; if (package.Des == Common.MachineID || package.Des == ID.ALL) { @@ -127,16 +127,16 @@ internal static class Receiver // NOTE(@yuyoyuppe): disabled to drop elevation requirement bool nonElevated = Common.RunWithNoAdminRight && false; - if (nonElevated && Setting.Values.OneWayControlMode && package.Md.dwFlags != Common.WM_MOUSEMOVE) + if (nonElevated && Setting.Values.OneWayControlMode && package.Md.dwFlags != WM.WM_MOUSEMOVE) { if (!DragDrop.IsDropping) { - if (package.Md.dwFlags is Common.WM_LBUTTONDOWN or Common.WM_RBUTTONDOWN) + if (package.Md.dwFlags is WM.WM_LBUTTONDOWN or WM.WM_RBUTTONDOWN) { Helper.ShowOneWayModeMessage(); } } - else if (package.Md.dwFlags is Common.WM_LBUTTONUP or Common.WM_RBUTTONUP) + else if (package.Md.dwFlags is WM.WM_LBUTTONUP or WM.WM_RBUTTONUP) { DragDrop.IsDropping = false; } @@ -146,7 +146,7 @@ internal static class Receiver if (Math.Abs(package.Md.X) >= Event.MOVE_MOUSE_RELATIVE && Math.Abs(package.Md.Y) >= Event.MOVE_MOUSE_RELATIVE) { - if (package.Md.dwFlags == Common.WM_MOUSEMOVE) + if (package.Md.dwFlags == WM.WM_MOUSEMOVE) { InputSimulation.MoveMouseRelative( package.Md.X < 0 ? package.Md.X + Event.MOVE_MOUSE_RELATIVE : package.Md.X - Event.MOVE_MOUSE_RELATIVE, @@ -203,19 +203,19 @@ internal static class Receiver break; case PackageType.ExplorerDragDrop: - Common.PackageReceived.ExplorerDragDrop++; + Package.PackageReceived.ExplorerDragDrop++; DragDrop.DragDropStep03(package); break; case PackageType.Heartbeat: case PackageType.Heartbeat_ex: - Common.PackageReceived.Heartbeat++; + Package.PackageReceived.Heartbeat++; - Common.GeneratedKey = Common.GeneratedKey || package.Type == PackageType.Heartbeat_ex; + Encryption.GeneratedKey = Encryption.GeneratedKey || package.Type == PackageType.Heartbeat_ex; - if (Common.GeneratedKey) + if (Encryption.GeneratedKey) { - Setting.Values.MyKey = Common.MyKey; + Setting.Values.MyKey = Encryption.MyKey; Common.SendPackage(ID.ALL, PackageType.Heartbeat_ex_l2); } @@ -230,26 +230,26 @@ internal static class Receiver break; case PackageType.Heartbeat_ex_l2: - Common.GeneratedKey = true; - Setting.Values.MyKey = Common.MyKey; + Encryption.GeneratedKey = true; + Setting.Values.MyKey = Encryption.MyKey; Common.SendPackage(ID.ALL, PackageType.Heartbeat_ex_l3); break; case PackageType.Heartbeat_ex_l3: - Common.GeneratedKey = true; - Setting.Values.MyKey = Common.MyKey; + Encryption.GeneratedKey = true; + Setting.Values.MyKey = Encryption.MyKey; break; case PackageType.Awake: - Common.PackageReceived.Heartbeat++; + Package.PackageReceived.Heartbeat++; _ = MachineStuff.AddToMachinePool(package); Common.HumanBeingDetected(); break; case PackageType.Hello: - Common.PackageReceived.Hello++; + Package.PackageReceived.Hello++; Common.SendHeartBeat(); string newMachine = MachineStuff.AddToMachinePool(package); if (Setting.Values.MachineMatrixString == null) @@ -262,16 +262,16 @@ internal static class Receiver break; case PackageType.Hi: - Common.PackageReceived.Hello++; + Package.PackageReceived.Hello++; break; case PackageType.ByeBye: - Common.PackageReceived.ByeBye++; + Package.PackageReceived.ByeBye++; Common.ProcessByeByeMessage(package); break; case PackageType.Clipboard: - Common.PackageReceived.Clipboard++; + Package.PackageReceived.Clipboard++; if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop) { Clipboard.clipboardCopiedTime = Common.GetTick(); @@ -291,7 +291,7 @@ internal static class Receiver break; case PackageType.ClipboardCapture: - Common.PackageReceived.Clipboard++; + Package.PackageReceived.Clipboard++; if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop) { if (package.Des == Common.MachineID || package.Des == ID.ALL) @@ -304,7 +304,7 @@ internal static class Receiver break; case PackageType.CaptureScreenCommand: - Common.PackageReceived.Clipboard++; + Package.PackageReceived.Clipboard++; if (package.Des == Common.MachineID || package.Des == ID.ALL) { Common.SendImage(package.Src, Common.CaptureScreen()); @@ -313,7 +313,7 @@ internal static class Receiver break; case PackageType.ClipboardAsk: - Common.PackageReceived.ClipboardAsk++; + Package.PackageReceived.ClipboardAsk++; if (package.Des == Common.MachineID) { @@ -344,17 +344,17 @@ internal static class Receiver break; case PackageType.ClipboardDragDrop: - Common.PackageReceived.ClipboardDragDrop++; + Package.PackageReceived.ClipboardDragDrop++; DragDrop.DragDropStep08(package); break; case PackageType.ClipboardDragDropOperation: - Common.PackageReceived.ClipboardDragDrop++; + Package.PackageReceived.ClipboardDragDrop++; DragDrop.DragDropStep08_2(package); break; case PackageType.ClipboardDragDropEnd: - Common.PackageReceived.ClipboardDragDropEnd++; + Package.PackageReceived.ClipboardDragDropEnd++; DragDrop.DragDropStep12(); break; @@ -363,11 +363,11 @@ internal static class Receiver Clipboard.clipboardCopiedTime = 0; if (package.Type == PackageType.ClipboardImage) { - Common.PackageReceived.ClipboardImage++; + Package.PackageReceived.ClipboardImage++; } else { - Common.PackageReceived.ClipboardText++; + Package.PackageReceived.ClipboardText++; } if (tcp != null) @@ -390,7 +390,7 @@ internal static class Receiver default: if ((package.Type & PackageType.Matrix) == PackageType.Matrix) { - Common.PackageReceived.Matrix++; + Package.PackageReceived.Matrix++; MachineStuff.UpdateMachineMatrix(package); break; } diff --git a/src/modules/MouseWithoutBorders/App/Core/ShutdownWithPowerToys.cs b/src/modules/MouseWithoutBorders/App/Core/ShutdownWithPowerToys.cs new file mode 100644 index 0000000000..a221aa1733 --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/ShutdownWithPowerToys.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; + +using ManagedCommon; +using Microsoft.PowerToys.Telemetry; + +namespace MouseWithoutBorders.Core; + +internal static class ShutdownWithPowerToys +{ + internal static void WaitForPowerToysRunner(ETWTrace etwTrace) + { + try + { + RunnerHelper.WaitForPowerToysRunnerExitFallback(() => + { + etwTrace?.Dispose(); + Common.MainForm.Quit(true, false); + }); + } + catch (Exception e) + { + Logger.Log(e); + } + } +} diff --git a/src/modules/MouseWithoutBorders/App/Core/VK.cs b/src/modules/MouseWithoutBorders/App/Core/VK.cs new file mode 100644 index 0000000000..239692abed --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/VK.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// +// Virtual key constants. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +internal enum VK : ushort +{ + CAPITAL = 0x14, + NUMLOCK = 0x90, + SHIFT = 0x10, + CONTROL = 0x11, + MENU = 0x12, + ESCAPE = 0x1B, + BACK = 0x08, + TAB = 0x09, + RETURN = 0x0D, + PRIOR = 0x21, + NEXT = 0x22, + END = 0x23, + HOME = 0x24, + LEFT = 0x25, + UP = 0x26, + RIGHT = 0x27, + DOWN = 0x28, + SELECT = 0x29, + PRINT = 0x2A, + EXECUTE = 0x2B, + SNAPSHOT = 0x2C, + INSERT = 0x2D, + DELETE = 0x2E, + HELP = 0x2F, + NUMPAD0 = 0x60, + NUMPAD1 = 0x61, + NUMPAD2 = 0x62, + NUMPAD3 = 0x63, + NUMPAD4 = 0x64, + NUMPAD5 = 0x65, + NUMPAD6 = 0x66, + NUMPAD7 = 0x67, + NUMPAD8 = 0x68, + NUMPAD9 = 0x69, + MULTIPLY = 0x6A, + ADD = 0x6B, + SEPARATOR = 0x6C, + SUBTRACT = 0x6D, + DECIMAL = 0x6E, + DIVIDE = 0x6F, + F1 = 0x70, + F2 = 0x71, + F3 = 0x72, + F4 = 0x73, + F5 = 0x74, + F6 = 0x75, + F7 = 0x76, + F8 = 0x77, + F9 = 0x78, + F10 = 0x79, + F11 = 0x7A, + F12 = 0x7B, + OEM_1 = 0xBA, + OEM_PLUS = 0xBB, + OEM_COMMA = 0xBC, + OEM_MINUS = 0xBD, + OEM_PERIOD = 0xBE, + OEM_2 = 0xBF, + OEM_3 = 0xC0, + MEDIA_NEXT_TRACK = 0xB0, + MEDIA_PREV_TRACK = 0xB1, + MEDIA_STOP = 0xB2, + MEDIA_PLAY_PAUSE = 0xB3, + LWIN = 0x5B, + RWIN = 0x5C, + LSHIFT = 0xA0, + RSHIFT = 0xA1, + LCONTROL = 0xA2, + RCONTROL = 0xA3, + LMENU = 0xA4, + RMENU = 0xA5, +} diff --git a/src/modules/MouseWithoutBorders/App/Core/WM.cs b/src/modules/MouseWithoutBorders/App/Core/WM.cs new file mode 100644 index 0000000000..e93897e93b --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/WM.cs @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; + +// +// Virtual key constants. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +internal partial class WM +{ + internal const ushort KEYEVENTF_KEYDOWN = 0x0001; + internal const ushort KEYEVENTF_KEYUP = 0x0002; + + internal const int WH_MOUSE = 7; + internal const int WH_KEYBOARD = 2; + internal const int WH_MOUSE_LL = 14; + internal const int WH_KEYBOARD_LL = 13; + + internal const int WM_MOUSEMOVE = 0x200; + internal const int WM_LBUTTONDOWN = 0x201; + internal const int WM_RBUTTONDOWN = 0x204; + internal const int WM_MBUTTONDOWN = 0x207; + internal const int WM_XBUTTONDOWN = 0x20B; + internal const int WM_LBUTTONUP = 0x202; + internal const int WM_RBUTTONUP = 0x205; + internal const int WM_MBUTTONUP = 0x208; + internal const int WM_XBUTTONUP = 0x20C; + internal const int WM_LBUTTONDBLCLK = 0x203; + internal const int WM_RBUTTONDBLCLK = 0x206; + internal const int WM_MBUTTONDBLCLK = 0x209; + internal const int WM_MOUSEWHEEL = 0x020A; + internal const int WM_MOUSEHWHEEL = 0x020E; + + internal const int WM_KEYDOWN = 0x100; + internal const int WM_KEYUP = 0x101; + internal const int WM_SYSKEYDOWN = 0x104; + internal const int WM_SYSKEYUP = 0x105; + + [Flags] + internal enum LLKHF + { + EXTENDED = 0x01, + INJECTED = 0x10, + ALTDOWN = 0x20, + UP = 0x80, + } +} diff --git a/src/modules/MouseWithoutBorders/App/Core/WinAPI.cs b/src/modules/MouseWithoutBorders/App/Core/WinAPI.cs new file mode 100644 index 0000000000..4d14dcb973 --- /dev/null +++ b/src/modules/MouseWithoutBorders/App/Core/WinAPI.cs @@ -0,0 +1,359 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading; +using System.Windows.Forms; + +using MouseWithoutBorders.Class; + +// +// Screen/Desktop helper functions. +// +// +// 2008 created by Truong Do (ductdo). +// 2009-... modified by Truong Do (TruongDo). +// 2023- Included in PowerToys. +// +namespace MouseWithoutBorders.Core; + +// Desktops, and GetScreenConfig routines +internal static class WinAPI +{ + private static MyRectangle newDesktopBounds; + private static MyRectangle newPrimaryScreenBounds; + private static string activeDesktop; + + private static string ActiveDesktop => WinAPI.activeDesktop; + + internal static void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e) + { + GetScreenConfig(); + } + + internal static readonly List SensitivePoints = new(); + + private static bool MonitorEnumProc(IntPtr hMonitor, IntPtr hdcMonitor, ref NativeMethods.RECT lprcMonitor, IntPtr dwData) + { + // lprcMonitor is wrong!!! => using GetMonitorInfo(...) + // Log(String.Format( CultureInfo.CurrentCulture,"MONITOR: l{0}, t{1}, r{2}, b{3}", lprcMonitor.Left, lprcMonitor.Top, lprcMonitor.Right, lprcMonitor.Bottom)); + NativeMethods.MonitorInfoEx mi = default; + mi.cbSize = Marshal.SizeOf(mi); + _ = NativeMethods.GetMonitorInfo(hMonitor, ref mi); + + try + { + // For logging only + _ = NativeMethods.GetDpiForMonitor(hMonitor, 0, out uint dpiX, out uint dpiY); + Logger.Log(string.Format(CultureInfo.CurrentCulture, "MONITOR: ({0}, {1}, {2}, {3}). DPI: ({4}, {5})", mi.rcMonitor.Left, mi.rcMonitor.Top, mi.rcMonitor.Right, mi.rcMonitor.Bottom, dpiX, dpiY)); + } + catch (DllNotFoundException) + { + Logger.Log("GetDpiForMonitor is unsupported in Windows 7 and lower."); + } + catch (EntryPointNotFoundException) + { + Logger.Log("GetDpiForMonitor is unsupported in Windows 7 and lower."); + } + catch (Exception e) + { + Logger.Log(e); + } + + if (mi.rcMonitor.Left == 0 && mi.rcMonitor.Top == 0 && mi.rcMonitor.Right != 0 && mi.rcMonitor.Bottom != 0) + { + // Primary screen + _ = Interlocked.Exchange(ref Common.screenWidth, mi.rcMonitor.Right - mi.rcMonitor.Left); + _ = Interlocked.Exchange(ref Common.screenHeight, mi.rcMonitor.Bottom - mi.rcMonitor.Top); + + newPrimaryScreenBounds.Left = mi.rcMonitor.Left; + newPrimaryScreenBounds.Top = mi.rcMonitor.Top; + newPrimaryScreenBounds.Right = mi.rcMonitor.Right; + newPrimaryScreenBounds.Bottom = mi.rcMonitor.Bottom; + } + else + { + if (mi.rcMonitor.Left < newDesktopBounds.Left) + { + newDesktopBounds.Left = mi.rcMonitor.Left; + } + + if (mi.rcMonitor.Top < newDesktopBounds.Top) + { + newDesktopBounds.Top = mi.rcMonitor.Top; + } + + if (mi.rcMonitor.Right > newDesktopBounds.Right) + { + newDesktopBounds.Right = mi.rcMonitor.Right; + } + + if (mi.rcMonitor.Bottom > newDesktopBounds.Bottom) + { + newDesktopBounds.Bottom = mi.rcMonitor.Bottom; + } + } + + lock (SensitivePoints) + { + SensitivePoints.Add(new Point(mi.rcMonitor.Left, mi.rcMonitor.Top)); + SensitivePoints.Add(new Point(mi.rcMonitor.Right, mi.rcMonitor.Top)); + SensitivePoints.Add(new Point(mi.rcMonitor.Right, mi.rcMonitor.Bottom)); + SensitivePoints.Add(new Point(mi.rcMonitor.Left, mi.rcMonitor.Bottom)); + } + + return true; + } + + internal static void GetScreenConfig() + { + try + { + Logger.LogDebug("==================== GetScreenConfig started"); + newDesktopBounds = new MyRectangle(); + newPrimaryScreenBounds = new MyRectangle(); + newDesktopBounds.Left = newPrimaryScreenBounds.Left = Screen.PrimaryScreen.Bounds.Left; + newDesktopBounds.Top = newPrimaryScreenBounds.Top = Screen.PrimaryScreen.Bounds.Top; + newDesktopBounds.Right = newPrimaryScreenBounds.Right = Screen.PrimaryScreen.Bounds.Right; + newDesktopBounds.Bottom = newPrimaryScreenBounds.Bottom = Screen.PrimaryScreen.Bounds.Bottom; + + Logger.Log(string.Format( + CultureInfo.CurrentCulture, + "logon = {0} PrimaryScreenBounds = {1},{2},{3},{4} desktopBounds = {5},{6},{7},{8}", + Common.RunOnLogonDesktop, + WinAPI.newPrimaryScreenBounds.Left, + WinAPI.newPrimaryScreenBounds.Top, + WinAPI.newPrimaryScreenBounds.Right, + WinAPI.newPrimaryScreenBounds.Bottom, + WinAPI.newDesktopBounds.Left, + WinAPI.newDesktopBounds.Top, + WinAPI.newDesktopBounds.Right, + WinAPI.newDesktopBounds.Bottom)); + +#if USE_MANAGED_ROUTINES + // Managed routines do not work well when running on secure desktop:( + screenWidth = Screen.PrimaryScreen.Bounds.Width; + screenHeight = Screen.PrimaryScreen.Bounds.Height; + screenCount = Screen.AllScreens.Length; + for (int i = 0; i < Screen.AllScreens.Length; i++) + { + if (Screen.AllScreens[i].Bounds.Left < desktopBounds.Left) desktopBounds.Left = Screen.AllScreens[i].Bounds.Left; + if (Screen.AllScreens[i].Bounds.Top < desktopBounds.Top) desktopBounds.Top = Screen.AllScreens[i].Bounds.Top; + if (Screen.AllScreens[i].Bounds.Right > desktopBounds.Right) desktopBounds.Right = Screen.AllScreens[i].Bounds.Right; + if (Screen.AllScreens[i].Bounds.Bottom > desktopBounds.Bottom) desktopBounds.Bottom = Screen.AllScreens[i].Bounds.Bottom; + } +#else + lock (SensitivePoints) + { + SensitivePoints.Clear(); + } + + NativeMethods.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, MonitorEnumProc, IntPtr.Zero); + + // 1000 calls to EnumDisplayMonitors cost a dozen of milliseconds +#endif + Interlocked.Exchange(ref MachineStuff.desktopBounds, newDesktopBounds); + Interlocked.Exchange(ref MachineStuff.primaryScreenBounds, newPrimaryScreenBounds); + + Logger.Log(string.Format( + CultureInfo.CurrentCulture, + "logon = {0} PrimaryScreenBounds = {1},{2},{3},{4} desktopBounds = {5},{6},{7},{8}", + Common.RunOnLogonDesktop, + MachineStuff.PrimaryScreenBounds.Left, + MachineStuff.PrimaryScreenBounds.Top, + MachineStuff.PrimaryScreenBounds.Right, + MachineStuff.PrimaryScreenBounds.Bottom, + MachineStuff.DesktopBounds.Left, + MachineStuff.DesktopBounds.Top, + MachineStuff.DesktopBounds.Right, + MachineStuff.DesktopBounds.Bottom)); + + Logger.Log("==================== GetScreenConfig ended"); + } + catch (Exception e) + { + Logger.Log(e); + } + } + +#if USING_SCREEN_SAVER_ROUTINES + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern int PostMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern IntPtr OpenDesktop(string hDesktop, int Flags, bool Inherit, UInt32 DesiredAccess); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern bool CloseDesktop(IntPtr hDesktop); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern bool EnumDesktopWindows( IntPtr hDesktop, EnumDesktopWindowsProc callback, IntPtr lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern bool IsWindowVisible(IntPtr hWnd); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern bool SystemParametersInfo(int uAction, int uParam, ref int pvParam, int flags); + + private delegate bool EnumDesktopWindowsProc(IntPtr hDesktop, IntPtr lParam); + private const int WM_CLOSE = 16; + private const int SPI_GETSCREENSAVERRUNNING = 114; + + internal static bool IsScreenSaverRunning() + { + int isRunning = 0; + SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0,ref isRunning, 0); + return (isRunning != 0); + } + + internal static void CloseScreenSaver() + { + IntPtr hDesktop = OpenDesktop("Screen-saver", 0, false, DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS); + if (hDesktop != IntPtr.Zero) + { + LogDebug("Closing screen saver..."); + EnumDesktopWindows(hDesktop, new EnumDesktopWindowsProc(CloseScreenSaverFunc), IntPtr.Zero); + CloseDesktop(hDesktop); + } + } + + private static bool CloseScreenSaverFunc(IntPtr hWnd, IntPtr lParam) + { + if (IsWindowVisible(hWnd)) + { + LogDebug("Posting WM_CLOSE to " + hWnd.ToString(CultureInfo.InvariantCulture)); + PostMessage(hWnd, WM_CLOSE, 0, 0); + } + return true; + } +#endif + + internal static string GetMyDesktop() + { + byte[] arThreadDesktop = new byte[256]; + IntPtr hD = NativeMethods.GetThreadDesktop(NativeMethods.GetCurrentThreadId()); + if (hD != IntPtr.Zero) + { + _ = NativeMethods.GetUserObjectInformation(hD, NativeMethods.UOI_NAME, arThreadDesktop, arThreadDesktop.Length, out _); + return Common.GetString(arThreadDesktop).Replace("\0", string.Empty); + } + + return string.Empty; + } + + internal static string GetInputDesktop() + { + byte[] arInputDesktop = new byte[256]; + IntPtr hD = NativeMethods.OpenInputDesktop(0, false, NativeMethods.DESKTOP_READOBJECTS); + if (hD != IntPtr.Zero) + { + _ = NativeMethods.GetUserObjectInformation(hD, NativeMethods.UOI_NAME, arInputDesktop, arInputDesktop.Length, out _); + return Common.GetString(arInputDesktop).Replace("\0", string.Empty); + } + + return string.Empty; + } + + private static void StartMMService(string desktopToRunMouseWithoutBordersOn) + { + if (!Common.RunWithNoAdminRight) + { + Logger.LogDebug("*** Starting on active Desktop: " + desktopToRunMouseWithoutBordersOn); + Service.StartMouseWithoutBordersService(desktopToRunMouseWithoutBordersOn); + } + } + + internal static void CheckForDesktopSwitchEvent(bool cleanupIfExit) + { + try + { + if (!IsMyDesktopActive() || Common.CurrentProcess.SessionId != NativeMethods.WTSGetActiveConsoleSessionId()) + { + Helper.RunDDHelper(true); + int waitCount = 20; + + while (NativeMethods.WTSGetActiveConsoleSessionId() == 0xFFFFFFFF && waitCount > 0) + { + waitCount--; + Logger.LogDebug("The session is detached/attached."); + Thread.Sleep(500); + } + + string myDesktop = GetMyDesktop(); + activeDesktop = GetInputDesktop(); + + Logger.LogDebug("*** Active Desktop = " + activeDesktop); + Logger.LogDebug("*** My Desktop = " + myDesktop); + + if (myDesktop.Equals(activeDesktop, StringComparison.OrdinalIgnoreCase)) + { + Logger.LogDebug("*** Active Desktop == My Desktop (TS session)"); + } + + if (!activeDesktop.Equals("winlogon", StringComparison.OrdinalIgnoreCase) && + !activeDesktop.Equals("default", StringComparison.OrdinalIgnoreCase) && + !activeDesktop.Equals("disconnect", StringComparison.OrdinalIgnoreCase)) + { + try + { + StartMMService(activeDesktop); + } + catch (Exception e) + { + Logger.Log($"{nameof(CheckForDesktopSwitchEvent)}: {e}"); + } + } + else + { + if (!myDesktop.Equals(activeDesktop, StringComparison.OrdinalIgnoreCase)) + { + Logger.Log("*** Active Desktop <> My Desktop"); + } + + uint sid = NativeMethods.WTSGetActiveConsoleSessionId(); + + if (Process.GetProcessesByName(Common.BinaryName).Any(p => (uint)p.SessionId == sid)) + { + Logger.Log("Found MouseWithoutBorders on the active session!"); + } + else + { + Logger.Log("MouseWithoutBorders not found on the active session!"); + StartMMService(null); + } + } + + if (!myDesktop.Equals("winlogon", StringComparison.OrdinalIgnoreCase) && + !myDesktop.Equals("default", StringComparison.OrdinalIgnoreCase)) + { + Logger.LogDebug("*** Desktop inactive, exiting: " + myDesktop); + Setting.Values.LastX = Common.JUST_GOT_BACK_FROM_SCREEN_SAVER; + if (cleanupIfExit) + { + InitAndCleanup.Cleanup(); + } + + Process.GetCurrentProcess().KillProcess(); + } + } + } + catch (Exception e) + { + Logger.Log(e); + } + } + + private static Point p; + + internal static bool IsMyDesktopActive() + { + return NativeMethods.GetCursorPos(ref p); + } +} diff --git a/src/modules/MouseWithoutBorders/App/Form/Settings/SettingsFormPage.cs b/src/modules/MouseWithoutBorders/App/Form/Settings/SettingsFormPage.cs index 39574ac8fe..81c04982a9 100644 --- a/src/modules/MouseWithoutBorders/App/Form/Settings/SettingsFormPage.cs +++ b/src/modules/MouseWithoutBorders/App/Form/Settings/SettingsFormPage.cs @@ -42,7 +42,7 @@ namespace MouseWithoutBorders protected string GetSecureKey() { - return Common.MyKey; + return Encryption.MyKey; } private void BackButton_Click(object sender, EventArgs e) diff --git a/src/modules/MouseWithoutBorders/App/Form/Settings/SetupPage2a.cs b/src/modules/MouseWithoutBorders/App/Form/Settings/SetupPage2a.cs index c86df58143..5fcee5dc54 100644 --- a/src/modules/MouseWithoutBorders/App/Form/Settings/SetupPage2a.cs +++ b/src/modules/MouseWithoutBorders/App/Form/Settings/SetupPage2a.cs @@ -89,8 +89,8 @@ namespace MouseWithoutBorders { if (GetSecureKey() != SecurityCodeField.Text) { - Common.MyKey = Regex.Replace(SecurityCodeField.Text, @"\s+", string.Empty); - SecurityCode = Common.MyKey; + Encryption.MyKey = Regex.Replace(SecurityCodeField.Text, @"\s+", string.Empty); + SecurityCode = Encryption.MyKey; } MachineStuff.MachineMatrix = new string[MachineStuff.MAX_MACHINE] { ComputerNameField.Text.Trim().ToUpper(CultureInfo.CurrentCulture), Common.MachineName.Trim(), string.Empty, string.Empty }; diff --git a/src/modules/MouseWithoutBorders/App/Form/frmMatrix.cs b/src/modules/MouseWithoutBorders/App/Form/frmMatrix.cs index 66301c52cb..703ad8ef91 100644 --- a/src/modules/MouseWithoutBorders/App/Form/frmMatrix.cs +++ b/src/modules/MouseWithoutBorders/App/Form/frmMatrix.cs @@ -135,7 +135,7 @@ namespace MouseWithoutBorders internal void UpdateKeyTextBox() { _ = Helper.GetUserName(); - textBoxEnc.Text = Common.MyKey; + textBoxEnc.Text = Encryption.MyKey; } private void InitAll() @@ -505,19 +505,19 @@ namespace MouseWithoutBorders private bool UpdateKey(string newKey) { - if (!Common.IsKeyValid(newKey, out string rv)) + if (!Encryption.IsKeyValid(newKey, out string rv)) { ShowKeyErrorMsg(rv); return false; } - if (!newKey.Equals(Common.MyKey, StringComparison.OrdinalIgnoreCase)) + if (!newKey.Equals(Encryption.MyKey, StringComparison.OrdinalIgnoreCase)) { - Common.MyKey = newKey; - Common.GeneratedKey = false; + Encryption.MyKey = newKey; + Encryption.GeneratedKey = false; } - Common.MagicNumber = Common.Get24BitHash(Common.MyKey); + Encryption.MagicNumber = Encryption.Get24BitHash(Encryption.MyKey); return true; } @@ -1116,10 +1116,10 @@ namespace MouseWithoutBorders if (MessageBox.Show(message, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { - Setting.Values.MyKey = Common.MyKey = Common.CreateRandomKey(); - textBoxEnc.Text = Common.MyKey; + Setting.Values.MyKey = Encryption.MyKey = Encryption.CreateRandomKey(); + textBoxEnc.Text = Encryption.MyKey; checkBoxShowKey.Checked = true; - Common.GeneratedKey = true; + Encryption.GeneratedKey = true; ButtonOK_Click(null, null); Common.ShowToolTip("New security key was generated, update other machines to the same key.", 10000, ToolTipIcon.Info, false); } diff --git a/src/modules/MouseWithoutBorders/App/Form/frmScreen.cs b/src/modules/MouseWithoutBorders/App/Form/frmScreen.cs index 1ab0ce8cc7..ca123ec850 100644 --- a/src/modules/MouseWithoutBorders/App/Form/frmScreen.cs +++ b/src/modules/MouseWithoutBorders/App/Form/frmScreen.cs @@ -318,7 +318,7 @@ namespace MouseWithoutBorders try { - if (!Common.IsMyDesktopActive() || Common.CurrentProcess.SessionId != NativeMethods.WTSGetActiveConsoleSessionId()) + if (!WinAPI.IsMyDesktopActive() || Common.CurrentProcess.SessionId != NativeMethods.WTSGetActiveConsoleSessionId()) { myDesktopNotActive = true; @@ -348,7 +348,7 @@ namespace MouseWithoutBorders Common.Hook?.ResetLastSwitchKeys(); }); - Common.CheckForDesktopSwitchEvent(true); + WinAPI.CheckForDesktopSwitchEvent(true); } } else @@ -369,21 +369,21 @@ namespace MouseWithoutBorders if (myDesktopNotActive) { myDesktopNotActive = false; - Common.MyKey = Setting.Values.MyKey; + Encryption.MyKey = Setting.Values.MyKey; } MachineStuff.UpdateMachinePoolStringSetting(); - if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop && (Setting.Values.FirstRun || Common.KeyCorrupted)) + if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop && (Setting.Values.FirstRun || Encryption.KeyCorrupted)) { if (!shownSetupFormOneTime) { shownSetupFormOneTime = true; MachineStuff.ShowMachineMatrix(); - if (Common.KeyCorrupted && !Setting.Values.FirstRun) + if (Encryption.KeyCorrupted && !Setting.Values.FirstRun) { - Common.KeyCorrupted = false; + Encryption.KeyCorrupted = false; string msg = "The security key is corrupted for some reason, please re-setup."; MessageBox.Show(msg, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning); } @@ -490,9 +490,9 @@ namespace MouseWithoutBorders if (count == 600) { - if (!Common.GeneratedKey) + if (!Encryption.GeneratedKey) { - Common.MyKey = Setting.Values.MyKey; + Encryption.MyKey = Setting.Values.MyKey; if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop) { @@ -505,7 +505,7 @@ namespace MouseWithoutBorders Common.ShowToolTip("The security key must be auto generated in one of the machines.", 10000); } } - else if (!Common.KeyCorrupted && !Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop && !Setting.Values.FirstRun && Common.AtLeastOneSocketConnected()) + else if (!Encryption.KeyCorrupted && !Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop && !Setting.Values.FirstRun && Common.AtLeastOneSocketConnected()) { int myKeyDaysToExpire = Setting.Values.MyKeyDaysToExpire; @@ -531,7 +531,7 @@ namespace MouseWithoutBorders #if SHOW_ON_WINLOGON // if (Common.RunOnLogonDesktop) ShowMouseWithoutBordersUiOnWinLogonDesktop(false); #endif - Common.CheckForDesktopSwitchEvent(true); + WinAPI.CheckForDesktopSwitchEvent(true); MachineStuff.UpdateClientSockets("helperTimer_Tick"); // Sockets may be closed by the remote host when both machines switch desktop at the same time. } @@ -582,7 +582,7 @@ namespace MouseWithoutBorders int rv = 0; - if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop && Common.IsMyDesktopActive() && (rv = Helper.SendMessageToHelper(0x400, IntPtr.Zero, IntPtr.Zero)) <= 0) + if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop && WinAPI.IsMyDesktopActive() && (rv = Helper.SendMessageToHelper(0x400, IntPtr.Zero, IntPtr.Zero)) <= 0) { Logger.TelemetryLogTrace($"{Helper.HELPER_FORM_TEXT} not found: {rv}", SeverityLevel.Warning); } diff --git a/src/modules/MouseWithoutBorders/MouseWithoutBorders.UnitTests/Core/Logger.PrivateDump.expected.txt b/src/modules/MouseWithoutBorders/MouseWithoutBorders.UnitTests/Core/Logger.PrivateDump.expected.txt index 1bbd8ba49c..34a83830cd 100644 --- a/src/modules/MouseWithoutBorders/MouseWithoutBorders.UnitTests/Core/Logger.PrivateDump.expected.txt +++ b/src/modules/MouseWithoutBorders/MouseWithoutBorders.UnitTests/Core/Logger.PrivateDump.expected.txt @@ -46,79 +46,6 @@ avgSendTime = 0 maxSendTime = 0 totalSendCount = 0 totalSendTime = 0 -magicNumber = 0 -ran = System.Random ---_impl = System.Random+XoshiroImpl -----_s0 = ???????????? -----_s1 = ???????????? -----_s2 = ???????????? -----_s3 = ???????????? ---k__BackingField = System.Random+ThreadSafeRandom -InitialIV = ???????????? -k__BackingField = False -k__BackingField = False -LegalKeyDictionary = Concurrent.ConcurrentDictionary`2[System.String,System.Byte[]] ---_tables = Concurrent.ConcurrentDictionary`2+Tables[System.String,System.Byte[]] -----_comparer = Generic.NonRandomizedStringEqualityComparer+OrdinalIgnoreCaseComparer -----_buckets = Concurrent.ConcurrentDictionary`2+VolatileNode[System.String,System.Byte[]][] -------System.Collections.Concurrent.ConcurrentDictionary`2+VolatileNode[System.String,System.Byte[]][] = Concurrent.ConcurrentDictionary`2+VolatileNode[System.String,System.Byte[]][]: N/A -----_fastModBucketsMultiplier = 498560650640798693 -----_locks = O[] -------System.Object[] = O[]: N/A -----_countPerLock = 32[] -------[0] = 0 -------[1] = 0 -------[2] = 0 -------[3] = 0 -------[4] = 0 -------[5] = 0 -------[6] = 0 -------[7] = 0 ---_budget = ???????????? ---_growLockArray = True ---_comparerIsDefaultForClasses = False -PackageSent = MouseWithoutBorders.PackageMonitor ---Keyboard = 0 ---Mouse = 0 ---Heartbeat = 0 ---ByeBye = 0 ---Hello = 0 ---Matrix = 0 ---ClipboardText = 0 ---ClipboardImage = 0 ---Clipboard = 0 ---ClipboardDragDrop = 0 ---ClipboardDragDropEnd = 0 ---ClipboardAsk = 0 ---ExplorerDragDrop = 0 ---Nil = 0 -PackageReceived = MouseWithoutBorders.PackageMonitor ---Keyboard = 0 ---Mouse = 0 ---Heartbeat = 0 ---ByeBye = 0 ---Hello = 0 ---Matrix = 0 ---ClipboardText = 0 ---ClipboardImage = 0 ---Clipboard = 0 ---ClipboardDragDrop = 0 ---ClipboardDragDropEnd = 0 ---ClipboardAsk = 0 ---ExplorerDragDrop = 0 ---Nil = 0 -PackageID = 0 -SensitivePoints = Generic.List`1[Point] ---_items = Point[] -----System.Drawing.Point[] = Point[]: N/A ---_size = 0 ---_version = 0 ---s_emptyArray = Point[] -----System.Drawing.Point[] = Point[]: N/A -p = {X=0,Y=0} ---x = 0 ---y = 0 ---Empty = {X=0,Y=0} k__BackingField = False TOGGLE_ICONS_SIZE = 4 ICON_ONE = 0 @@ -128,34 +55,6 @@ ICON_BIG_CLIPBOARD = 3 ICON_ERROR = 4 JUST_GOT_BACK_FROM_SCREEN_SAVER = 9999 NETWORK_STREAM_BUF_SIZE = 1048576 -SymAlBlockSize = 16 -PW_LENGTH = 16 -PACKAGE_SIZE = 32 -PACKAGE_SIZE_EX = 64 -WP_PACKAGE_SIZE = 6 -KEYEVENTF_KEYDOWN = 1 -KEYEVENTF_KEYUP = 2 -WH_MOUSE = 7 -WH_KEYBOARD = 2 -WH_MOUSE_LL = 14 -WH_KEYBOARD_LL = 13 -WM_MOUSEMOVE = 512 -WM_LBUTTONDOWN = 513 -WM_RBUTTONDOWN = 516 -WM_MBUTTONDOWN = 519 -WM_XBUTTONDOWN = 523 -WM_LBUTTONUP = 514 -WM_RBUTTONUP = 517 -WM_MBUTTONUP = 520 -WM_XBUTTONUP = 524 -WM_LBUTTONDBLCLK = 515 -WM_RBUTTONDBLCLK = 518 -WM_MBUTTONDBLCLK = 521 -WM_MOUSEWHEEL = 522 -WM_KEYDOWN = 256 -WM_KEYUP = 257 -WM_SYSKEYDOWN = 260 -WM_SYSKEYUP = 261 [Clipboard] =============== Comma = System.Char[] @@ -193,16 +92,51 @@ dragDropStep05ExCalledByIpc = 0 isDropping = False dragMachine = NONE k__BackingField = False +[Encryption] +=============== +magicNumber = 0 +ran = System.Random +--_impl = System.Random+XoshiroImpl +----_s0 = ???????????? +----_s1 = ???????????? +----_s2 = ???????????? +----_s3 = ???????????? +--k__BackingField = System.Random+ThreadSafeRandom +InitialIV = ???????????? +k__BackingField = False +k__BackingField = False +LegalKeyDictionary = Concurrent.ConcurrentDictionary`2[System.String,System.Byte[]] +--_tables = Concurrent.ConcurrentDictionary`2+Tables[System.String,System.Byte[]] +----_comparer = Generic.NonRandomizedStringEqualityComparer+OrdinalIgnoreCaseComparer +----_buckets = Concurrent.ConcurrentDictionary`2+VolatileNode[System.String,System.Byte[]][] +------System.Collections.Concurrent.ConcurrentDictionary`2+VolatileNode[System.String,System.Byte[]][] = Concurrent.ConcurrentDictionary`2+VolatileNode[System.String,System.Byte[]][]: N/A +----_fastModBucketsMultiplier = 498560650640798693 +----_locks = O[] +------System.Object[] = O[]: N/A +----_countPerLock = 32[] +------[0] = 0 +------[1] = 0 +------[2] = 0 +------[3] = 0 +------[4] = 0 +------[5] = 0 +------[6] = 0 +------[7] = 0 +--_budget = ???????????? +--_growLockArray = True +--_comparerIsDefaultForClasses = False +SymAlBlockSize = 16 +PW_LENGTH = 16 [Event] =============== -KeybdPackage = MouseWithoutBorders.DATA +KeybdPackage = MouseWithoutBorders.Core.DATA --Type = 0 --Id = 0 --Src = NONE --Des = NONE --DateTime = 0 ---Kd = MouseWithoutBorders.KEYBDDATA ---Md = MouseWithoutBorders.MOUSEDATA +--Kd = MouseWithoutBorders.Core.KEYBDDATA +--Md = MouseWithoutBorders.Core.MOUSEDATA --Machine1 = NONE --Machine2 = NONE --Machine3 = NONE @@ -212,14 +146,14 @@ KeybdPackage = MouseWithoutBorders.DATA --machineNameP2 = 0 --machineNameP3 = 0 --machineNameP4 = 0 -MousePackage = MouseWithoutBorders.DATA +MousePackage = MouseWithoutBorders.Core.DATA --Type = 0 --Id = 0 --Src = NONE --Des = NONE --DateTime = 0 ---Kd = MouseWithoutBorders.KEYBDDATA ---Md = MouseWithoutBorders.MOUSEDATA +--Kd = MouseWithoutBorders.Core.KEYBDDATA +--Md = MouseWithoutBorders.Core.MOUSEDATA --Machine1 = NONE --Machine2 = NONE --Machine3 = NONE @@ -296,7 +230,7 @@ LogCounter = Concurrent.ConcurrentDictionary`2[System.String,32] allLogsIndex = 0 lastHour = 0 exceptionCount = 0 -lastPackageSent = MouseWithoutBorders.PackageMonitor +lastPackageSent = MouseWithoutBorders.Core.PackageMonitor --Keyboard = 0 --Mouse = 0 --Heartbeat = 0 @@ -311,7 +245,7 @@ lastPackageSent = MouseWithoutBorders.PackageMonitor --ClipboardAsk = 0 --ExplorerDragDrop = 0 --Nil = 0 -lastPackageReceived = MouseWithoutBorders.PackageMonitor +lastPackageReceived = MouseWithoutBorders.Core.PackageMonitor --Keyboard = 0 --Mouse = 0 --Heartbeat = 0 @@ -366,6 +300,42 @@ MAX_SOCKET = 8 HEARTBEAT_TIMEOUT = 1500000 SKIP_PIXELS = 1 JUMP_PIXELS = 2 +[Package] +=============== +PackageSent = MouseWithoutBorders.Core.PackageMonitor +--Keyboard = 0 +--Mouse = 0 +--Heartbeat = 0 +--ByeBye = 0 +--Hello = 0 +--Matrix = 0 +--ClipboardText = 0 +--ClipboardImage = 0 +--Clipboard = 0 +--ClipboardDragDrop = 0 +--ClipboardDragDropEnd = 0 +--ClipboardAsk = 0 +--ExplorerDragDrop = 0 +--Nil = 0 +PackageReceived = MouseWithoutBorders.Core.PackageMonitor +--Keyboard = 0 +--Mouse = 0 +--Heartbeat = 0 +--ByeBye = 0 +--Hello = 0 +--Matrix = 0 +--ClipboardText = 0 +--ClipboardImage = 0 +--Clipboard = 0 +--ClipboardDragDrop = 0 +--ClipboardDragDropEnd = 0 +--ClipboardAsk = 0 +--ExplorerDragDrop = 0 +--Nil = 0 +PackageID = 0 +PACKAGE_SIZE = 32 +PACKAGE_SIZE_EX = 64 +WP_PACKAGE_SIZE = 6 [Receiver] =============== QUEUE_SIZE = 50 @@ -436,3 +406,41 @@ lastStartServiceTime = ???????????? --MinValue = 01/01/0001 00:00:00 --MaxValue = 31/12/9999 23:59:59 --UnixEpoch = 01/01/1970 00:00:00 +[WinAPI] +=============== +SensitivePoints = Generic.List`1[Point] +--_items = Point[] +----System.Drawing.Point[] = Point[]: N/A +--_size = 0 +--_version = 0 +--s_emptyArray = Point[] +----System.Drawing.Point[] = Point[]: N/A +p = {X=0,Y=0} +--x = 0 +--y = 0 +--Empty = {X=0,Y=0} +[WM] +=============== +KEYEVENTF_KEYDOWN = 1 +KEYEVENTF_KEYUP = 2 +WH_MOUSE = 7 +WH_KEYBOARD = 2 +WH_MOUSE_LL = 14 +WH_KEYBOARD_LL = 13 +WM_MOUSEMOVE = 512 +WM_LBUTTONDOWN = 513 +WM_RBUTTONDOWN = 516 +WM_MBUTTONDOWN = 519 +WM_XBUTTONDOWN = 523 +WM_LBUTTONUP = 514 +WM_RBUTTONUP = 517 +WM_MBUTTONUP = 520 +WM_XBUTTONUP = 524 +WM_LBUTTONDBLCLK = 515 +WM_RBUTTONDBLCLK = 518 +WM_MBUTTONDBLCLK = 521 +WM_MOUSEWHEEL = 522 +WM_KEYDOWN = 256 +WM_KEYUP = 257 +WM_SYSKEYDOWN = 260 +WM_SYSKEYUP = 261