[MWB] - refactoring "Common" classes - Common.Log.cs, Common.Receiver.cs (#35726)
This commit is contained in:
Родитель
44f170d4ed
Коммит
1aaf764c14
|
@ -32,12 +32,17 @@ using MouseWithoutBorders.Core;
|
|||
using MouseWithoutBorders.Exceptions;
|
||||
|
||||
using SystemClipboard = System.Windows.Forms.Clipboard;
|
||||
using Thread = MouseWithoutBorders.Core.Thread;
|
||||
|
||||
namespace MouseWithoutBorders
|
||||
{
|
||||
internal partial class Common
|
||||
{
|
||||
private const uint BIG_CLIPBOARD_DATA_TIMEOUT = 30000;
|
||||
internal static readonly char[] Comma = new char[] { ',' };
|
||||
internal static readonly char[] Star = new char[] { '*' };
|
||||
internal static readonly char[] NullSeparator = new char[] { '\0' };
|
||||
|
||||
internal const uint BIG_CLIPBOARD_DATA_TIMEOUT = 30000;
|
||||
private const uint MAX_CLIPBOARD_DATA_SIZE_CAN_BE_SENT_INSTANTLY_TCP = 1024 * 1024; // 1MB
|
||||
private const uint MAX_CLIPBOARD_FILE_SIZE_CAN_BE_SENT = 100 * 1024 * 1024; // 100MB
|
||||
private const int TEXT_HEADER_SIZE = 12;
|
||||
|
@ -46,11 +51,9 @@ namespace MouseWithoutBorders
|
|||
private static long lastClipboardEventTime;
|
||||
private static string lastMachineWithClipboardData;
|
||||
private static string lastDragDropFile;
|
||||
private static long clipboardCopiedTime;
|
||||
|
||||
internal static readonly char[] Comma = new char[] { ',' };
|
||||
internal static readonly char[] Star = new char[] { '*' };
|
||||
internal static readonly char[] NullSeparator = new char[] { '\0' };
|
||||
#pragma warning disable SA1307 // Accessible fields should begin with upper-case letter
|
||||
internal static long clipboardCopiedTime;
|
||||
#pragma warning restore SA1307
|
||||
|
||||
internal static ID LastIDWithClipboardData { get; set; }
|
||||
|
||||
|
@ -332,7 +335,7 @@ namespace MouseWithoutBorders
|
|||
break;
|
||||
|
||||
default:
|
||||
ProcessPackage(data, tcp);
|
||||
Receiver.ProcessPackage(data, tcp);
|
||||
if (++unexpectedCount > 100)
|
||||
{
|
||||
Logger.Log("ReceiveClipboardDataUsingTCP: unexpectedCount > 100!");
|
||||
|
|
|
@ -22,6 +22,8 @@ using Microsoft.PowerToys.Telemetry;
|
|||
using MouseWithoutBorders.Class;
|
||||
using MouseWithoutBorders.Core;
|
||||
|
||||
using Thread = MouseWithoutBorders.Core.Thread;
|
||||
|
||||
namespace MouseWithoutBorders
|
||||
{
|
||||
/* Common.DragDrop.cs
|
||||
|
@ -238,7 +240,7 @@ namespace MouseWithoutBorders
|
|||
|
||||
internal static void DragDropStep08(DATA package)
|
||||
{
|
||||
GetNameOfMachineWithClipboardData(package);
|
||||
Receiver.GetNameOfMachineWithClipboardData(package);
|
||||
Logger.LogDebug("DragDropStep08: ClipboardDragDrop Received. machine with drag file was set");
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,8 @@ using MouseWithoutBorders.Class;
|
|||
using MouseWithoutBorders.Core;
|
||||
using MouseWithoutBorders.Form;
|
||||
|
||||
using Thread = MouseWithoutBorders.Core.Thread;
|
||||
|
||||
namespace MouseWithoutBorders
|
||||
{
|
||||
internal partial class Common
|
||||
|
@ -145,7 +147,7 @@ namespace MouseWithoutBorders
|
|||
}
|
||||
}
|
||||
|
||||
private static bool IsSwitchingByMouseEnabled()
|
||||
internal static bool IsSwitchingByMouseEnabled()
|
||||
{
|
||||
return (EasyMouseOption)Setting.Values.EasyMouse == EasyMouseOption.Enable || InputHook.EasyMouseKeyDown;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@ using MouseWithoutBorders.Core;
|
|||
using MouseWithoutBorders.Form;
|
||||
using Windows.UI.Input.Preview.Injection;
|
||||
|
||||
using Thread = MouseWithoutBorders.Core.Thread;
|
||||
|
||||
namespace MouseWithoutBorders
|
||||
{
|
||||
internal partial class Common
|
||||
|
|
|
@ -1,119 +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.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
// <summary>
|
||||
// Logging.
|
||||
// </summary>
|
||||
// <history>
|
||||
// 2008 created by Truong Do (ductdo).
|
||||
// 2009-... modified by Truong Do (TruongDo).
|
||||
// 2023- Included in PowerToys.
|
||||
// </history>
|
||||
using MouseWithoutBorders.Class;
|
||||
using MouseWithoutBorders.Core;
|
||||
using MouseWithoutBorders.Exceptions;
|
||||
|
||||
namespace MouseWithoutBorders
|
||||
{
|
||||
public class Thread
|
||||
{
|
||||
private static readonly Lock ThreadsLock = new();
|
||||
private static List<System.Threading.Thread> threads;
|
||||
|
||||
private readonly System.Threading.Thread thread;
|
||||
|
||||
internal Thread(ThreadStart callback, string name)
|
||||
{
|
||||
UpdateThreads(thread = new System.Threading.Thread(callback) { Name = name });
|
||||
}
|
||||
|
||||
internal Thread(ParameterizedThreadStart callback, string name)
|
||||
{
|
||||
UpdateThreads(thread = new System.Threading.Thread(callback) { Name = name });
|
||||
}
|
||||
|
||||
internal static void UpdateThreads(System.Threading.Thread thread)
|
||||
{
|
||||
lock (ThreadsLock)
|
||||
{
|
||||
bool found = false;
|
||||
List<System.Threading.Thread> toBeRemovedThreads = new();
|
||||
threads ??= new List<System.Threading.Thread>();
|
||||
|
||||
foreach (System.Threading.Thread t in threads)
|
||||
{
|
||||
if (!t.IsAlive)
|
||||
{
|
||||
toBeRemovedThreads.Add(t);
|
||||
}
|
||||
else if (t.ManagedThreadId == thread.ManagedThreadId)
|
||||
{
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (System.Threading.Thread t in toBeRemovedThreads)
|
||||
{
|
||||
_ = threads.Remove(t);
|
||||
}
|
||||
|
||||
if (!found)
|
||||
{
|
||||
threads.Add(thread);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static string DumpThreadsStack()
|
||||
{
|
||||
string stack = "\r\nMANAGED THREADS: " + threads.Count.ToString(CultureInfo.InvariantCulture) + "\r\n";
|
||||
stack += Logger.GetStackTrace(new StackTrace());
|
||||
return stack;
|
||||
}
|
||||
|
||||
internal void SetApartmentState(ApartmentState apartmentState)
|
||||
{
|
||||
thread.SetApartmentState(apartmentState);
|
||||
}
|
||||
|
||||
internal void Start()
|
||||
{
|
||||
thread.Start();
|
||||
}
|
||||
|
||||
internal void Start(object parameter)
|
||||
{
|
||||
thread.Start(parameter);
|
||||
}
|
||||
|
||||
internal static void Sleep(int millisecondsTimeout)
|
||||
{
|
||||
System.Threading.Thread.Sleep(millisecondsTimeout);
|
||||
}
|
||||
|
||||
internal static System.Threading.Thread CurrentThread => System.Threading.Thread.CurrentThread;
|
||||
|
||||
internal ThreadPriority Priority
|
||||
{
|
||||
get => thread.Priority;
|
||||
set => thread.Priority = value;
|
||||
}
|
||||
|
||||
internal System.Threading.ThreadState ThreadState => thread.ThreadState;
|
||||
}
|
||||
}
|
|
@ -51,10 +51,14 @@ namespace MouseWithoutBorders
|
|||
private const int SKIP_PIXELS = 1;
|
||||
private const int JUMP_PIXELS = 2;
|
||||
|
||||
private static ID desMachineID;
|
||||
#pragma warning disable SA1307 // Accessible fields should begin with upper-case letter
|
||||
internal static ID desMachineID;
|
||||
#pragma warning restore SA1307
|
||||
internal static string DesMachineName = string.Empty;
|
||||
private static ID newDesMachineID;
|
||||
private static ID newDesMachineIdEx;
|
||||
#pragma warning disable SA1307 // Accessible fields should begin with upper-case letter
|
||||
internal static ID newDesMachineIdEx;
|
||||
#pragma warning restore SA1307
|
||||
private static ID dropMachineID;
|
||||
|
||||
private static long lastJump = Common.GetTick();
|
||||
|
@ -720,7 +724,7 @@ namespace MouseWithoutBorders
|
|||
}
|
||||
}
|
||||
|
||||
private static string AddToMachinePool(DATA package)
|
||||
internal static string AddToMachinePool(DATA package)
|
||||
{
|
||||
// Log("********** AddToMachinePool called: " + package.src.ToString(CultureInfo.InvariantCulture));
|
||||
|
||||
|
|
|
@ -1,431 +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.CodeAnalysis;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
// <summary>
|
||||
// Back-end thread for the socket.
|
||||
// </summary>
|
||||
// <history>
|
||||
// 2008 created by Truong Do (ductdo).
|
||||
// 2009-... modified by Truong Do (TruongDo).
|
||||
// 2023- Included in PowerToys.
|
||||
// </history>
|
||||
using MouseWithoutBorders.Class;
|
||||
using MouseWithoutBorders.Core;
|
||||
|
||||
[module: SuppressMessage("Microsoft.Reliability", "CA2002:DoNotLockOnObjectsWithWeakIdentity", Scope = "member", Target = "MouseWithoutBorders.Common.#PreProcess(MouseWithoutBorders.DATA)", Justification = "Dotnet port with style preservation")]
|
||||
|
||||
namespace MouseWithoutBorders
|
||||
{
|
||||
internal partial class Common
|
||||
{
|
||||
private static readonly uint QUEUE_SIZE = 50;
|
||||
private static readonly int[] RecentProcessedPackageIDs = new int[QUEUE_SIZE];
|
||||
private static int recentProcessedPackageIndex;
|
||||
#pragma warning disable SA1307 // Accessible fields should begin with upper-case letter
|
||||
internal static long processedPackageCount;
|
||||
internal static long skippedPackageCount;
|
||||
#pragma warning restore SA1307
|
||||
|
||||
internal static long JustGotAKey { get; set; }
|
||||
|
||||
private static bool PreProcess(DATA package)
|
||||
{
|
||||
if (package.Type == PackageType.Invalid)
|
||||
{
|
||||
if ((Common.InvalidPackageCount % 100) == 0)
|
||||
{
|
||||
ShowToolTip("Invalid packages received!", 1000, ToolTipIcon.Warning, false);
|
||||
}
|
||||
|
||||
Common.InvalidPackageCount++;
|
||||
Logger.Log("Invalid packages received!");
|
||||
return false;
|
||||
}
|
||||
else if (package.Type == 0)
|
||||
{
|
||||
Logger.Log("Got an unknown package!");
|
||||
return false;
|
||||
}
|
||||
else if (package.Type is not PackageType.ClipboardText and not PackageType.ClipboardImage
|
||||
|
||||
// BEGIN: These package types are sent by TcpSend which is single direction.
|
||||
and not PackageType.Handshake and not PackageType.HandshakeAck)
|
||||
{
|
||||
// END
|
||||
lock (RecentProcessedPackageIDs)
|
||||
{
|
||||
for (int i = 0; i < QUEUE_SIZE; i++)
|
||||
{
|
||||
if (RecentProcessedPackageIDs[i] == package.Id)
|
||||
{
|
||||
skippedPackageCount++;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
processedPackageCount++;
|
||||
recentProcessedPackageIndex = (int)((recentProcessedPackageIndex + 1) % QUEUE_SIZE);
|
||||
RecentProcessedPackageIDs[recentProcessedPackageIndex] = package.Id;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static System.Drawing.Point lastXY;
|
||||
|
||||
internal static void ProcessPackage(DATA package, TcpSk tcp)
|
||||
{
|
||||
if (!PreProcess(package))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (package.Type)
|
||||
{
|
||||
case PackageType.Keyboard:
|
||||
PackageReceived.Keyboard++;
|
||||
if (package.Des == MachineID || package.Des == ID.ALL)
|
||||
{
|
||||
JustGotAKey = GetTick();
|
||||
|
||||
// NOTE(@yuyoyuppe): disabled to drop elevation requirement
|
||||
bool nonElevated = Common.RunWithNoAdminRight && false;
|
||||
if (nonElevated && Setting.Values.OneWayControlMode)
|
||||
{
|
||||
if ((package.Kd.dwFlags & (int)Common.LLKHF.UP) == (int)Common.LLKHF.UP)
|
||||
{
|
||||
Common.ShowOneWayModeMessage();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
InputSimulation.SendKey(package.Kd);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.Mouse:
|
||||
PackageReceived.Mouse++;
|
||||
|
||||
if (package.Des == MachineID || package.Des == ID.ALL)
|
||||
{
|
||||
if (desMachineID != MachineID)
|
||||
{
|
||||
NewDesMachineID = DesMachineID = MachineID;
|
||||
}
|
||||
|
||||
// NOTE(@yuyoyuppe): disabled to drop elevation requirement
|
||||
bool nonElevated = Common.RunWithNoAdminRight && false;
|
||||
if (nonElevated && Setting.Values.OneWayControlMode && package.Md.dwFlags != Common.WM_MOUSEMOVE)
|
||||
{
|
||||
if (!IsDropping)
|
||||
{
|
||||
if (package.Md.dwFlags is WM_LBUTTONDOWN or WM_RBUTTONDOWN)
|
||||
{
|
||||
Common.ShowOneWayModeMessage();
|
||||
}
|
||||
}
|
||||
else if (package.Md.dwFlags is WM_LBUTTONUP or WM_RBUTTONUP)
|
||||
{
|
||||
IsDropping = false;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (Math.Abs(package.Md.X) >= MOVE_MOUSE_RELATIVE && Math.Abs(package.Md.Y) >= MOVE_MOUSE_RELATIVE)
|
||||
{
|
||||
if (package.Md.dwFlags == Common.WM_MOUSEMOVE)
|
||||
{
|
||||
InputSimulation.MoveMouseRelative(
|
||||
package.Md.X < 0 ? package.Md.X + MOVE_MOUSE_RELATIVE : package.Md.X - MOVE_MOUSE_RELATIVE,
|
||||
package.Md.Y < 0 ? package.Md.Y + MOVE_MOUSE_RELATIVE : package.Md.Y - MOVE_MOUSE_RELATIVE);
|
||||
_ = NativeMethods.GetCursorPos(ref lastXY);
|
||||
|
||||
Point p = MoveToMyNeighbourIfNeeded(lastXY.X, lastXY.Y, MachineID);
|
||||
|
||||
if (!p.IsEmpty)
|
||||
{
|
||||
HasSwitchedMachineSinceLastCopy = true;
|
||||
|
||||
Logger.LogDebug(string.Format(
|
||||
CultureInfo.CurrentCulture,
|
||||
"***** Controlled Machine: newDesMachineIdEx set = [{0}]. Mouse is now at ({1},{2})",
|
||||
newDesMachineIdEx,
|
||||
lastXY.X,
|
||||
lastXY.Y));
|
||||
|
||||
SendNextMachine(package.Src, newDesMachineIdEx, p);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_ = NativeMethods.GetCursorPos(ref lastXY);
|
||||
package.Md.X = lastXY.X * 65535 / screenWidth;
|
||||
package.Md.Y = lastXY.Y * 65535 / screenHeight;
|
||||
_ = InputSimulation.SendMouse(package.Md);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_ = InputSimulation.SendMouse(package.Md);
|
||||
_ = NativeMethods.GetCursorPos(ref lastXY);
|
||||
}
|
||||
|
||||
LastX = lastXY.X;
|
||||
LastY = lastXY.Y;
|
||||
CustomCursor.ShowFakeMouseCursor(LastX, LastY);
|
||||
}
|
||||
|
||||
DragDropStep01(package.Md.dwFlags);
|
||||
DragDropStep09(package.Md.dwFlags);
|
||||
break;
|
||||
|
||||
case PackageType.NextMachine:
|
||||
Logger.LogDebug("PackageType.NextMachine received!");
|
||||
|
||||
if (IsSwitchingByMouseEnabled())
|
||||
{
|
||||
PrepareToSwitchToMachine((ID)package.Md.WheelDelta, new Point(package.Md.X, package.Md.Y));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.ExplorerDragDrop:
|
||||
PackageReceived.ExplorerDragDrop++;
|
||||
DragDropStep03(package);
|
||||
break;
|
||||
|
||||
case PackageType.Heartbeat:
|
||||
case PackageType.Heartbeat_ex:
|
||||
PackageReceived.Heartbeat++;
|
||||
|
||||
Common.GeneratedKey = Common.GeneratedKey || package.Type == PackageType.Heartbeat_ex;
|
||||
|
||||
if (Common.GeneratedKey)
|
||||
{
|
||||
Setting.Values.MyKey = Common.MyKey;
|
||||
SendPackage(ID.ALL, PackageType.Heartbeat_ex_l2);
|
||||
}
|
||||
|
||||
string desMachine = Common.AddToMachinePool(package);
|
||||
|
||||
if (Setting.Values.FirstRun && !string.IsNullOrEmpty(desMachine))
|
||||
{
|
||||
Common.UpdateSetupMachineMatrix(desMachine);
|
||||
Common.UpdateClientSockets("UpdateSetupMachineMatrix");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.Heartbeat_ex_l2:
|
||||
Common.GeneratedKey = true;
|
||||
Setting.Values.MyKey = Common.MyKey;
|
||||
SendPackage(ID.ALL, PackageType.Heartbeat_ex_l3);
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.Heartbeat_ex_l3:
|
||||
Common.GeneratedKey = true;
|
||||
Setting.Values.MyKey = Common.MyKey;
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.Awake:
|
||||
PackageReceived.Heartbeat++;
|
||||
_ = Common.AddToMachinePool(package);
|
||||
Common.HumanBeingDetected();
|
||||
break;
|
||||
|
||||
case PackageType.Hello:
|
||||
PackageReceived.Hello++;
|
||||
SendHeartBeat();
|
||||
string newMachine = Common.AddToMachinePool(package);
|
||||
if (Setting.Values.MachineMatrixString == null)
|
||||
{
|
||||
string tip = newMachine + " saying Hello!";
|
||||
tip += "\r\n Right Click to setup your machine Matrix";
|
||||
ShowToolTip(tip);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.Hi:
|
||||
PackageReceived.Hello++;
|
||||
break;
|
||||
|
||||
case PackageType.ByeBye:
|
||||
PackageReceived.ByeBye++;
|
||||
ProcessByeByeMessage(package);
|
||||
break;
|
||||
|
||||
case PackageType.Clipboard:
|
||||
PackageReceived.Clipboard++;
|
||||
if (!RunOnLogonDesktop && !RunOnScrSaverDesktop)
|
||||
{
|
||||
clipboardCopiedTime = GetTick();
|
||||
GetNameOfMachineWithClipboardData(package);
|
||||
SignalBigClipboardData();
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.MachineSwitched:
|
||||
if (GetTick() - clipboardCopiedTime < BIG_CLIPBOARD_DATA_TIMEOUT && (package.Des == MachineID))
|
||||
{
|
||||
clipboardCopiedTime = 0;
|
||||
Common.GetRemoteClipboard("PackageType.MachineSwitched");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardCapture:
|
||||
PackageReceived.Clipboard++;
|
||||
if (!RunOnLogonDesktop && !RunOnScrSaverDesktop)
|
||||
{
|
||||
if (package.Des == MachineID || package.Des == ID.ALL)
|
||||
{
|
||||
GetNameOfMachineWithClipboardData(package);
|
||||
GetRemoteClipboard("mspaint," + LastMachineWithClipboardData);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.CaptureScreenCommand:
|
||||
PackageReceived.Clipboard++;
|
||||
if (package.Des == MachineID || package.Des == ID.ALL)
|
||||
{
|
||||
Common.SendImage(package.Src, Common.CaptureScreen());
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardAsk:
|
||||
PackageReceived.ClipboardAsk++;
|
||||
|
||||
if (package.Des == MachineID)
|
||||
{
|
||||
_ = Task.Run(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
System.Threading.Thread thread = Thread.CurrentThread;
|
||||
thread.Name = $"{nameof(PackageType.ClipboardAsk)}.{thread.ManagedThreadId}";
|
||||
Thread.UpdateThreads(thread);
|
||||
|
||||
string remoteMachine = package.MachineName;
|
||||
System.Net.Sockets.TcpClient client = ConnectToRemoteClipboardSocket(remoteMachine);
|
||||
bool clientPushData = true;
|
||||
|
||||
if (ShakeHand(ref remoteMachine, client.Client, out Stream enStream, out Stream deStream, ref clientPushData, ref package.PostAction))
|
||||
{
|
||||
SocketStuff.SendClipboardData(client.Client, enStream);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logger.Log(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardDragDrop:
|
||||
PackageReceived.ClipboardDragDrop++;
|
||||
DragDropStep08(package);
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardDragDropOperation:
|
||||
PackageReceived.ClipboardDragDrop++;
|
||||
DragDropStep08_2(package);
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardDragDropEnd:
|
||||
PackageReceived.ClipboardDragDropEnd++;
|
||||
DragDropStep12();
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardText:
|
||||
case PackageType.ClipboardImage:
|
||||
clipboardCopiedTime = 0;
|
||||
if (package.Type == PackageType.ClipboardImage)
|
||||
{
|
||||
PackageReceived.ClipboardImage++;
|
||||
}
|
||||
else
|
||||
{
|
||||
PackageReceived.ClipboardText++;
|
||||
}
|
||||
|
||||
if (tcp != null)
|
||||
{
|
||||
Common.ReceiveClipboardDataUsingTCP(
|
||||
package,
|
||||
package.Type == PackageType.ClipboardImage,
|
||||
tcp);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.HideMouse:
|
||||
HasSwitchedMachineSinceLastCopy = true;
|
||||
HideMouseCursor(true);
|
||||
MainFormDotEx(false);
|
||||
ReleaseAllKeys();
|
||||
break;
|
||||
|
||||
default:
|
||||
if ((package.Type & PackageType.Matrix) == PackageType.Matrix)
|
||||
{
|
||||
PackageReceived.Matrix++;
|
||||
UpdateMachineMatrix(package);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We should never get to this point!
|
||||
Logger.Log("Invalid package received!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void GetNameOfMachineWithClipboardData(DATA package)
|
||||
{
|
||||
LastIDWithClipboardData = package.Src;
|
||||
List<MachineInf> matchingMachines = Common.MachinePool.TryFindMachineByID(LastIDWithClipboardData);
|
||||
if (matchingMachines.Count >= 1)
|
||||
{
|
||||
LastMachineWithClipboardData = matchingMachines[0].Name.Trim();
|
||||
}
|
||||
|
||||
/*
|
||||
lastMachineWithClipboardData =
|
||||
Common.GetString(BitConverter.GetBytes(package.machineNameHead));
|
||||
lastMachineWithClipboardData +=
|
||||
Common.GetString(BitConverter.GetBytes(package.machineNameTail));
|
||||
lastMachineWithClipboardData = lastMachineWithClipboardData.Trim();
|
||||
* */
|
||||
}
|
||||
|
||||
private static void SignalBigClipboardData()
|
||||
{
|
||||
Logger.LogDebug("SignalBigClipboardData");
|
||||
SetToggleIcon(new int[TOGGLE_ICONS_SIZE] { ICON_BIG_CLIPBOARD, -1, ICON_BIG_CLIPBOARD, -1 });
|
||||
}
|
||||
}
|
||||
}
|
|
@ -23,6 +23,8 @@ using System.Windows.Forms;
|
|||
using MouseWithoutBorders.Class;
|
||||
using MouseWithoutBorders.Core;
|
||||
|
||||
using Thread = MouseWithoutBorders.Core.Thread;
|
||||
|
||||
namespace MouseWithoutBorders
|
||||
{
|
||||
// Desktops, and GetScreenConfig routines
|
||||
|
|
|
@ -32,6 +32,8 @@ using MouseWithoutBorders.Class;
|
|||
using MouseWithoutBorders.Core;
|
||||
using MouseWithoutBorders.Exceptions;
|
||||
|
||||
using Thread = MouseWithoutBorders.Core.Thread;
|
||||
|
||||
// Log is enough
|
||||
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.Common.#CheckClipboard()", Justification = "Dotnet port with style preservation")]
|
||||
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.Common.#CheckForDesktopSwitchEvent(System.Boolean)", Justification = "Dotnet port with style preservation")]
|
||||
|
@ -88,8 +90,10 @@ namespace MouseWithoutBorders
|
|||
private static FrmInputCallback inputCallbackForm;
|
||||
private static FrmAbout aboutForm;
|
||||
private static Thread helper;
|
||||
private static int screenWidth;
|
||||
private static int screenHeight;
|
||||
#pragma warning disable SA1307 // Accessible fields should begin with upper-case letter
|
||||
internal static int screenWidth;
|
||||
internal static int screenHeight;
|
||||
#pragma warning restore SA1307
|
||||
private static int lastX;
|
||||
private static int lastY;
|
||||
|
||||
|
@ -552,7 +556,7 @@ namespace MouseWithoutBorders
|
|||
lastRealInputEventCount = Common.RealInputEventCount;
|
||||
}
|
||||
|
||||
private static void HumanBeingDetected()
|
||||
internal static void HumanBeingDetected()
|
||||
{
|
||||
if (lastInputEventCount == Common.InputEventCount)
|
||||
{
|
||||
|
@ -613,7 +617,7 @@ namespace MouseWithoutBorders
|
|||
SendPackage(ID.ALL, PackageType.Clipboard);
|
||||
}
|
||||
|
||||
private static void ProcessByeByeMessage(DATA package)
|
||||
internal static void ProcessByeByeMessage(DATA package)
|
||||
{
|
||||
if (package.Src == desMachineID)
|
||||
{
|
||||
|
|
|
@ -27,6 +27,9 @@ using MouseWithoutBorders.Core;
|
|||
#endif
|
||||
|
||||
using SystemClipboard = System.Windows.Forms.Clipboard;
|
||||
#if !MM_HELPER
|
||||
using Thread = MouseWithoutBorders.Core.Thread;
|
||||
#endif
|
||||
|
||||
namespace MouseWithoutBorders
|
||||
{
|
||||
|
|
|
@ -35,6 +35,7 @@ using Newtonsoft.Json;
|
|||
using StreamJsonRpc;
|
||||
|
||||
using Logger = MouseWithoutBorders.Core.Logger;
|
||||
using Thread = MouseWithoutBorders.Core.Thread;
|
||||
|
||||
[module: SuppressMessage("Microsoft.MSInternal", "CA904:DeclareTypesInMicrosoftOrSystemNamespace", Scope = "namespace", Target = "MouseWithoutBorders", Justification = "Dotnet port with style preservation")]
|
||||
[module: SuppressMessage("Microsoft.Design", "CA1014:MarkAssembliesWithClsCompliant", Justification = "Dotnet port with style preservation")]
|
||||
|
|
|
@ -13,7 +13,6 @@ using System.IO.Abstractions;
|
|||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
|
@ -33,6 +32,8 @@ using Microsoft.Win32;
|
|||
using MouseWithoutBorders.Core;
|
||||
using Settings.UI.Library.Attributes;
|
||||
|
||||
using Lock = System.Threading.Lock;
|
||||
|
||||
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.Properties.Setting.Values.#LoadIntSetting(System.String,System.Int32)", Justification = "Dotnet port with style preservation")]
|
||||
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.Properties.Setting.Values.#SaveSetting(System.String,System.Object)", Justification = "Dotnet port with style preservation")]
|
||||
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.Properties.Setting.Values.#LoadStringSetting(System.String,System.String)", Justification = "Dotnet port with style preservation")]
|
||||
|
|
|
@ -29,6 +29,8 @@ using MouseWithoutBorders.Core;
|
|||
// </history>
|
||||
using MouseWithoutBorders.Exceptions;
|
||||
|
||||
using Thread = MouseWithoutBorders.Core.Thread;
|
||||
|
||||
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.SocketStuff.#SendData(System.Byte[])", Justification = "Dotnet port with style preservation")]
|
||||
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.SocketStuff.#Close()", Justification = "Dotnet port with style preservation")]
|
||||
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.SocketStuff.#CreateSocket(System.Boolean)", Justification = "Dotnet port with style preservation")]
|
||||
|
@ -1524,7 +1526,7 @@ namespace MouseWithoutBorders.Class
|
|||
}
|
||||
else
|
||||
{
|
||||
Common.ProcessPackage(package, currentTcp);
|
||||
Receiver.ProcessPackage(package, currentTcp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@ using MouseWithoutBorders.Core;
|
|||
// </history>
|
||||
using MouseWithoutBorders.Exceptions;
|
||||
|
||||
using Thread = MouseWithoutBorders.Core.Thread;
|
||||
|
||||
[module: SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "MouseWithoutBorders.TcpServer.#Close()", Justification = "Dotnet port with style preservation")]
|
||||
|
||||
namespace MouseWithoutBorders.Class
|
||||
|
|
|
@ -15,6 +15,9 @@ using System.Text;
|
|||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using MouseWithoutBorders.Class;
|
||||
using MouseWithoutBorders.Exceptions;
|
||||
|
||||
// <summary>
|
||||
// Logging.
|
||||
// </summary>
|
||||
|
@ -23,9 +26,6 @@ using System.Windows.Forms;
|
|||
// 2009-... modified by Truong Do (TruongDo).
|
||||
// 2023- Included in PowerToys.
|
||||
// </history>
|
||||
using MouseWithoutBorders.Class;
|
||||
using MouseWithoutBorders.Exceptions;
|
||||
|
||||
namespace MouseWithoutBorders.Core;
|
||||
|
||||
internal static class Logger
|
||||
|
@ -163,8 +163,8 @@ internal static class Logger
|
|||
Common.PackageReceived.ExplorerDragDrop,
|
||||
Common.invalidPackageCount,
|
||||
Common.PackageReceived.Nil,
|
||||
Common.processedPackageCount,
|
||||
Common.skippedPackageCount);
|
||||
Receiver.processedPackageCount,
|
||||
Receiver.skippedPackageCount);
|
||||
Log(log);
|
||||
lastPackageReceived = Common.PackageReceived;
|
||||
}
|
||||
|
@ -201,6 +201,8 @@ internal static class Logger
|
|||
_ = Logger.PrivateDump(sb, new Common(), "[Other Logs]\r\n===============\r\n", 0, level, false);
|
||||
sb.AppendLine("[Logger]\r\n===============");
|
||||
Logger.DumpType(sb, typeof(Logger), 0, level);
|
||||
sb.AppendLine("[Receiver]\r\n===============");
|
||||
Logger.DumpType(sb, typeof(Receiver), 0, level);
|
||||
|
||||
log = string.Format(
|
||||
CultureInfo.CurrentCulture,
|
||||
|
|
|
@ -0,0 +1,429 @@
|
|||
// 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.CodeAnalysis;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using MouseWithoutBorders.Class;
|
||||
|
||||
[module: SuppressMessage("Microsoft.Reliability", "CA2002:DoNotLockOnObjectsWithWeakIdentity", Scope = "member", Target = "MouseWithoutBorders.Common.#PreProcess(MouseWithoutBorders.DATA)", Justification = "Dotnet port with style preservation")]
|
||||
|
||||
// <summary>
|
||||
// Back-end thread for the socket.
|
||||
// </summary>
|
||||
// <history>
|
||||
// 2008 created by Truong Do (ductdo).
|
||||
// 2009-... modified by Truong Do (TruongDo).
|
||||
// 2023- Included in PowerToys.
|
||||
// </history>
|
||||
namespace MouseWithoutBorders.Core;
|
||||
|
||||
internal static class Receiver
|
||||
{
|
||||
private static readonly uint QUEUE_SIZE = 50;
|
||||
private static readonly int[] RecentProcessedPackageIDs = new int[QUEUE_SIZE];
|
||||
private static int recentProcessedPackageIndex;
|
||||
#pragma warning disable SA1307 // Accessible fields should begin with upper-case letter
|
||||
internal static long processedPackageCount;
|
||||
internal static long skippedPackageCount;
|
||||
#pragma warning restore SA1307
|
||||
|
||||
private static long JustGotAKey { get; set; }
|
||||
|
||||
private static bool PreProcess(DATA package)
|
||||
{
|
||||
if (package.Type == PackageType.Invalid)
|
||||
{
|
||||
if ((Common.InvalidPackageCount % 100) == 0)
|
||||
{
|
||||
Common.ShowToolTip("Invalid packages received!", 1000, ToolTipIcon.Warning, false);
|
||||
}
|
||||
|
||||
Common.InvalidPackageCount++;
|
||||
Logger.Log("Invalid packages received!");
|
||||
return false;
|
||||
}
|
||||
else if (package.Type == 0)
|
||||
{
|
||||
Logger.Log("Got an unknown package!");
|
||||
return false;
|
||||
}
|
||||
else if (package.Type is not PackageType.ClipboardText and not PackageType.ClipboardImage
|
||||
|
||||
// BEGIN: These package types are sent by TcpSend which is single direction.
|
||||
and not PackageType.Handshake and not PackageType.HandshakeAck)
|
||||
{
|
||||
// END
|
||||
lock (RecentProcessedPackageIDs)
|
||||
{
|
||||
for (int i = 0; i < QUEUE_SIZE; i++)
|
||||
{
|
||||
if (RecentProcessedPackageIDs[i] == package.Id)
|
||||
{
|
||||
skippedPackageCount++;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
processedPackageCount++;
|
||||
recentProcessedPackageIndex = (int)((recentProcessedPackageIndex + 1) % QUEUE_SIZE);
|
||||
RecentProcessedPackageIDs[recentProcessedPackageIndex] = package.Id;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static System.Drawing.Point lastXY;
|
||||
|
||||
internal static void ProcessPackage(DATA package, TcpSk tcp)
|
||||
{
|
||||
if (!PreProcess(package))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (package.Type)
|
||||
{
|
||||
case PackageType.Keyboard:
|
||||
Common.PackageReceived.Keyboard++;
|
||||
if (package.Des == Common.MachineID || package.Des == ID.ALL)
|
||||
{
|
||||
JustGotAKey = Common.GetTick();
|
||||
|
||||
// NOTE(@yuyoyuppe): disabled to drop elevation requirement
|
||||
bool nonElevated = Common.RunWithNoAdminRight && false;
|
||||
if (nonElevated && Setting.Values.OneWayControlMode)
|
||||
{
|
||||
if ((package.Kd.dwFlags & (int)Common.LLKHF.UP) == (int)Common.LLKHF.UP)
|
||||
{
|
||||
Common.ShowOneWayModeMessage();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
InputSimulation.SendKey(package.Kd);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.Mouse:
|
||||
Common.PackageReceived.Mouse++;
|
||||
|
||||
if (package.Des == Common.MachineID || package.Des == ID.ALL)
|
||||
{
|
||||
if (Common.desMachineID != Common.MachineID)
|
||||
{
|
||||
Common.NewDesMachineID = Common.DesMachineID = Common.MachineID;
|
||||
}
|
||||
|
||||
// NOTE(@yuyoyuppe): disabled to drop elevation requirement
|
||||
bool nonElevated = Common.RunWithNoAdminRight && false;
|
||||
if (nonElevated && Setting.Values.OneWayControlMode && package.Md.dwFlags != Common.WM_MOUSEMOVE)
|
||||
{
|
||||
if (!Common.IsDropping)
|
||||
{
|
||||
if (package.Md.dwFlags is Common.WM_LBUTTONDOWN or Common.WM_RBUTTONDOWN)
|
||||
{
|
||||
Common.ShowOneWayModeMessage();
|
||||
}
|
||||
}
|
||||
else if (package.Md.dwFlags is Common.WM_LBUTTONUP or Common.WM_RBUTTONUP)
|
||||
{
|
||||
Common.IsDropping = false;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (Math.Abs(package.Md.X) >= Common.MOVE_MOUSE_RELATIVE && Math.Abs(package.Md.Y) >= Common.MOVE_MOUSE_RELATIVE)
|
||||
{
|
||||
if (package.Md.dwFlags == Common.WM_MOUSEMOVE)
|
||||
{
|
||||
InputSimulation.MoveMouseRelative(
|
||||
package.Md.X < 0 ? package.Md.X + Common.MOVE_MOUSE_RELATIVE : package.Md.X - Common.MOVE_MOUSE_RELATIVE,
|
||||
package.Md.Y < 0 ? package.Md.Y + Common.MOVE_MOUSE_RELATIVE : package.Md.Y - Common.MOVE_MOUSE_RELATIVE);
|
||||
_ = NativeMethods.GetCursorPos(ref lastXY);
|
||||
|
||||
Point p = Common.MoveToMyNeighbourIfNeeded(lastXY.X, lastXY.Y, Common.MachineID);
|
||||
|
||||
if (!p.IsEmpty)
|
||||
{
|
||||
Common.HasSwitchedMachineSinceLastCopy = true;
|
||||
|
||||
Logger.LogDebug(string.Format(
|
||||
CultureInfo.CurrentCulture,
|
||||
"***** Controlled Machine: newDesMachineIdEx set = [{0}]. Mouse is now at ({1},{2})",
|
||||
Common.newDesMachineIdEx,
|
||||
lastXY.X,
|
||||
lastXY.Y));
|
||||
|
||||
Common.SendNextMachine(package.Src, Common.newDesMachineIdEx, p);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_ = NativeMethods.GetCursorPos(ref lastXY);
|
||||
package.Md.X = lastXY.X * 65535 / Common.screenWidth;
|
||||
package.Md.Y = lastXY.Y * 65535 / Common.screenHeight;
|
||||
_ = InputSimulation.SendMouse(package.Md);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_ = InputSimulation.SendMouse(package.Md);
|
||||
_ = NativeMethods.GetCursorPos(ref lastXY);
|
||||
}
|
||||
|
||||
Common.LastX = lastXY.X;
|
||||
Common.LastY = lastXY.Y;
|
||||
CustomCursor.ShowFakeMouseCursor(Common.LastX, Common.LastY);
|
||||
}
|
||||
|
||||
Common.DragDropStep01(package.Md.dwFlags);
|
||||
Common.DragDropStep09(package.Md.dwFlags);
|
||||
break;
|
||||
|
||||
case PackageType.NextMachine:
|
||||
Logger.LogDebug("PackageType.NextMachine received!");
|
||||
|
||||
if (Common.IsSwitchingByMouseEnabled())
|
||||
{
|
||||
Common.PrepareToSwitchToMachine((ID)package.Md.WheelDelta, new Point(package.Md.X, package.Md.Y));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.ExplorerDragDrop:
|
||||
Common.PackageReceived.ExplorerDragDrop++;
|
||||
Common.DragDropStep03(package);
|
||||
break;
|
||||
|
||||
case PackageType.Heartbeat:
|
||||
case PackageType.Heartbeat_ex:
|
||||
Common.PackageReceived.Heartbeat++;
|
||||
|
||||
Common.GeneratedKey = Common.GeneratedKey || package.Type == PackageType.Heartbeat_ex;
|
||||
|
||||
if (Common.GeneratedKey)
|
||||
{
|
||||
Setting.Values.MyKey = Common.MyKey;
|
||||
Common.SendPackage(ID.ALL, PackageType.Heartbeat_ex_l2);
|
||||
}
|
||||
|
||||
string desMachine = Common.AddToMachinePool(package);
|
||||
|
||||
if (Setting.Values.FirstRun && !string.IsNullOrEmpty(desMachine))
|
||||
{
|
||||
Common.UpdateSetupMachineMatrix(desMachine);
|
||||
Common.UpdateClientSockets("UpdateSetupMachineMatrix");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.Heartbeat_ex_l2:
|
||||
Common.GeneratedKey = true;
|
||||
Setting.Values.MyKey = Common.MyKey;
|
||||
Common.SendPackage(ID.ALL, PackageType.Heartbeat_ex_l3);
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.Heartbeat_ex_l3:
|
||||
Common.GeneratedKey = true;
|
||||
Setting.Values.MyKey = Common.MyKey;
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.Awake:
|
||||
Common.PackageReceived.Heartbeat++;
|
||||
_ = Common.AddToMachinePool(package);
|
||||
Common.HumanBeingDetected();
|
||||
break;
|
||||
|
||||
case PackageType.Hello:
|
||||
Common.PackageReceived.Hello++;
|
||||
Common.SendHeartBeat();
|
||||
string newMachine = Common.AddToMachinePool(package);
|
||||
if (Setting.Values.MachineMatrixString == null)
|
||||
{
|
||||
string tip = newMachine + " saying Hello!";
|
||||
tip += "\r\n Right Click to setup your machine Matrix";
|
||||
Common.ShowToolTip(tip);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.Hi:
|
||||
Common.PackageReceived.Hello++;
|
||||
break;
|
||||
|
||||
case PackageType.ByeBye:
|
||||
Common.PackageReceived.ByeBye++;
|
||||
Common.ProcessByeByeMessage(package);
|
||||
break;
|
||||
|
||||
case PackageType.Clipboard:
|
||||
Common.PackageReceived.Clipboard++;
|
||||
if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop)
|
||||
{
|
||||
Common.clipboardCopiedTime = Common.GetTick();
|
||||
GetNameOfMachineWithClipboardData(package);
|
||||
SignalBigClipboardData();
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.MachineSwitched:
|
||||
if (Common.GetTick() - Common.clipboardCopiedTime < Common.BIG_CLIPBOARD_DATA_TIMEOUT && (package.Des == Common.MachineID))
|
||||
{
|
||||
Common.clipboardCopiedTime = 0;
|
||||
Common.GetRemoteClipboard("PackageType.MachineSwitched");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardCapture:
|
||||
Common.PackageReceived.Clipboard++;
|
||||
if (!Common.RunOnLogonDesktop && !Common.RunOnScrSaverDesktop)
|
||||
{
|
||||
if (package.Des == Common.MachineID || package.Des == ID.ALL)
|
||||
{
|
||||
GetNameOfMachineWithClipboardData(package);
|
||||
Common.GetRemoteClipboard("mspaint," + Common.LastMachineWithClipboardData);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.CaptureScreenCommand:
|
||||
Common.PackageReceived.Clipboard++;
|
||||
if (package.Des == Common.MachineID || package.Des == ID.ALL)
|
||||
{
|
||||
Common.SendImage(package.Src, Common.CaptureScreen());
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardAsk:
|
||||
Common.PackageReceived.ClipboardAsk++;
|
||||
|
||||
if (package.Des == Common.MachineID)
|
||||
{
|
||||
_ = Task.Run(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
System.Threading.Thread thread = Thread.CurrentThread;
|
||||
thread.Name = $"{nameof(PackageType.ClipboardAsk)}.{thread.ManagedThreadId}";
|
||||
Thread.UpdateThreads(thread);
|
||||
|
||||
string remoteMachine = package.MachineName;
|
||||
System.Net.Sockets.TcpClient client = Common.ConnectToRemoteClipboardSocket(remoteMachine);
|
||||
bool clientPushData = true;
|
||||
|
||||
if (Common.ShakeHand(ref remoteMachine, client.Client, out Stream enStream, out Stream deStream, ref clientPushData, ref package.PostAction))
|
||||
{
|
||||
SocketStuff.SendClipboardData(client.Client, enStream);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logger.Log(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardDragDrop:
|
||||
Common.PackageReceived.ClipboardDragDrop++;
|
||||
Common.DragDropStep08(package);
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardDragDropOperation:
|
||||
Common.PackageReceived.ClipboardDragDrop++;
|
||||
Common.DragDropStep08_2(package);
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardDragDropEnd:
|
||||
Common.PackageReceived.ClipboardDragDropEnd++;
|
||||
Common.DragDropStep12();
|
||||
break;
|
||||
|
||||
case PackageType.ClipboardText:
|
||||
case PackageType.ClipboardImage:
|
||||
Common.clipboardCopiedTime = 0;
|
||||
if (package.Type == PackageType.ClipboardImage)
|
||||
{
|
||||
Common.PackageReceived.ClipboardImage++;
|
||||
}
|
||||
else
|
||||
{
|
||||
Common.PackageReceived.ClipboardText++;
|
||||
}
|
||||
|
||||
if (tcp != null)
|
||||
{
|
||||
Common.ReceiveClipboardDataUsingTCP(
|
||||
package,
|
||||
package.Type == PackageType.ClipboardImage,
|
||||
tcp);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PackageType.HideMouse:
|
||||
Common.HasSwitchedMachineSinceLastCopy = true;
|
||||
Common.HideMouseCursor(true);
|
||||
Common.MainFormDotEx(false);
|
||||
Common.ReleaseAllKeys();
|
||||
break;
|
||||
|
||||
default:
|
||||
if ((package.Type & PackageType.Matrix) == PackageType.Matrix)
|
||||
{
|
||||
Common.PackageReceived.Matrix++;
|
||||
Common.UpdateMachineMatrix(package);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We should never get to this point!
|
||||
Logger.Log("Invalid package received!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static void GetNameOfMachineWithClipboardData(DATA package)
|
||||
{
|
||||
Common.LastIDWithClipboardData = package.Src;
|
||||
List<MachineInf> matchingMachines = Common.MachinePool.TryFindMachineByID(Common.LastIDWithClipboardData);
|
||||
if (matchingMachines.Count >= 1)
|
||||
{
|
||||
Common.LastMachineWithClipboardData = matchingMachines[0].Name.Trim();
|
||||
}
|
||||
|
||||
/*
|
||||
lastMachineWithClipboardData =
|
||||
Common.GetString(BitConverter.GetBytes(package.machineNameHead));
|
||||
lastMachineWithClipboardData +=
|
||||
Common.GetString(BitConverter.GetBytes(package.machineNameTail));
|
||||
lastMachineWithClipboardData = lastMachineWithClipboardData.Trim();
|
||||
* */
|
||||
}
|
||||
|
||||
private static void SignalBigClipboardData()
|
||||
{
|
||||
Logger.LogDebug("SignalBigClipboardData");
|
||||
Common.SetToggleIcon(new int[Common.TOGGLE_ICONS_SIZE] { Common.ICON_BIG_CLIPBOARD, -1, Common.ICON_BIG_CLIPBOARD, -1 });
|
||||
}
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
// 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.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Threading;
|
||||
|
||||
// <summary>
|
||||
// Logging.
|
||||
// </summary>
|
||||
// <history>
|
||||
// 2008 created by Truong Do (ductdo).
|
||||
// 2009-... modified by Truong Do (TruongDo).
|
||||
// 2023- Included in PowerToys.
|
||||
// </history>
|
||||
namespace MouseWithoutBorders.Core;
|
||||
|
||||
internal sealed class Thread
|
||||
{
|
||||
private static readonly Lock ThreadsLock = new();
|
||||
private static List<System.Threading.Thread> threads;
|
||||
|
||||
private readonly System.Threading.Thread thread;
|
||||
|
||||
internal Thread(ThreadStart callback, string name)
|
||||
{
|
||||
UpdateThreads(thread = new System.Threading.Thread(callback) { Name = name });
|
||||
}
|
||||
|
||||
internal Thread(ParameterizedThreadStart callback, string name)
|
||||
{
|
||||
UpdateThreads(thread = new System.Threading.Thread(callback) { Name = name });
|
||||
}
|
||||
|
||||
internal static void UpdateThreads(System.Threading.Thread thread)
|
||||
{
|
||||
lock (ThreadsLock)
|
||||
{
|
||||
bool found = false;
|
||||
List<System.Threading.Thread> toBeRemovedThreads = new();
|
||||
threads ??= new List<System.Threading.Thread>();
|
||||
|
||||
foreach (System.Threading.Thread t in threads)
|
||||
{
|
||||
if (!t.IsAlive)
|
||||
{
|
||||
toBeRemovedThreads.Add(t);
|
||||
}
|
||||
else if (t.ManagedThreadId == thread.ManagedThreadId)
|
||||
{
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (System.Threading.Thread t in toBeRemovedThreads)
|
||||
{
|
||||
_ = threads.Remove(t);
|
||||
}
|
||||
|
||||
if (!found)
|
||||
{
|
||||
threads.Add(thread);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static string DumpThreadsStack()
|
||||
{
|
||||
string stack = "\r\nMANAGED THREADS: " + threads.Count.ToString(CultureInfo.InvariantCulture) + "\r\n";
|
||||
stack += Logger.GetStackTrace(new StackTrace());
|
||||
return stack;
|
||||
}
|
||||
|
||||
internal void SetApartmentState(ApartmentState apartmentState)
|
||||
{
|
||||
thread.SetApartmentState(apartmentState);
|
||||
}
|
||||
|
||||
internal void Start()
|
||||
{
|
||||
thread.Start();
|
||||
}
|
||||
|
||||
internal void Start(object parameter)
|
||||
{
|
||||
thread.Start(parameter);
|
||||
}
|
||||
|
||||
internal static void Sleep(int millisecondsTimeout)
|
||||
{
|
||||
System.Threading.Thread.Sleep(millisecondsTimeout);
|
||||
}
|
||||
|
||||
internal static System.Threading.Thread CurrentThread => System.Threading.Thread.CurrentThread;
|
||||
|
||||
internal ThreadPriority Priority
|
||||
{
|
||||
get => thread.Priority;
|
||||
set => thread.Priority = value;
|
||||
}
|
||||
|
||||
internal System.Threading.ThreadState ThreadState => thread.ThreadState;
|
||||
}
|
|
@ -4,20 +4,28 @@
|
|||
[Other Logs]
|
||||
===============
|
||||
= MouseWithoutBorders.Common
|
||||
lastClipboardEventTime = 0
|
||||
clipboardCopiedTime = 0
|
||||
Comma = System.Char[]
|
||||
--System.Char[] = System.Char[]: N/A
|
||||
Star = System.Char[]
|
||||
--System.Char[] = System.Char[]: N/A
|
||||
NullSeparator = System.Char[]
|
||||
--System.Char[] = System.Char[]: N/A
|
||||
lastClipboardEventTime = 0
|
||||
clipboardCopiedTime = 0
|
||||
<LastIDWithClipboardData>k__BackingField = NONE
|
||||
<NextClipboardViewer>k__BackingField = 0
|
||||
<IsClipboardDataImage>k__BackingField = False
|
||||
lastClipboardObject =
|
||||
<HasSwitchedMachineSinceLastCopy>k__BackingField = False
|
||||
ClipboardThreadOldLock = O
|
||||
ClipboardThreadOldLock = Lock
|
||||
--_owningThreadId = 0
|
||||
--_state = 0
|
||||
--_recursionCount = 0
|
||||
--_spinCount = 22
|
||||
--_waiterStartTimeMs = 0
|
||||
--s_contentionCount = 0
|
||||
--s_maxSpinCount = 22
|
||||
--s_minSpinCountForAdaptiveSpin = -100
|
||||
screenWidth = 0
|
||||
screenHeight = 0
|
||||
lastX = 0
|
||||
|
@ -43,7 +51,15 @@ socketMutexBalance = 0
|
|||
<BlockingUI>k__BackingField = False
|
||||
<UIThreadID>k__BackingField = 0
|
||||
<InputCallbackThreadID>k__BackingField = 0
|
||||
InputSimulationLock = O
|
||||
InputSimulationLock = Lock
|
||||
--_owningThreadId = 0
|
||||
--_state = 0
|
||||
--_recursionCount = 0
|
||||
--_spinCount = 22
|
||||
--_waiterStartTimeMs = 0
|
||||
--s_contentionCount = 0
|
||||
--s_maxSpinCount = 22
|
||||
--s_minSpinCountForAdaptiveSpin = -100
|
||||
lastSendNextMachine = 0
|
||||
lastInputEventCount = 0
|
||||
lastRealInputEventCount = 0
|
||||
|
@ -85,15 +101,7 @@ LegalKeyDictionary = Concurrent.ConcurrentDictionary`2[System.String,System.Byte
|
|||
------[5] = 0
|
||||
------[6] = 0
|
||||
------[7] = 0
|
||||
------[8] = 0
|
||||
------[9] = 0
|
||||
------[10] = 0
|
||||
------[11] = 0
|
||||
------[12] = 0
|
||||
------[13] = 0
|
||||
------[14] = 0
|
||||
------[15] = 0
|
||||
--_budget = 2
|
||||
--_budget = ????????????
|
||||
--_growLockArray = True
|
||||
--_comparerIsDefaultForClasses = False
|
||||
KeybdPackage = MouseWithoutBorders.DATA
|
||||
|
@ -155,7 +163,15 @@ ReopenSocketDueToReadError = False
|
|||
--MaxValue = 31/12/9999 23:59:59
|
||||
--UnixEpoch = 01/01/1970 00:00:00
|
||||
lastReleaseAllKeysCall = 0
|
||||
McMatrixLock = O
|
||||
McMatrixLock = Lock
|
||||
--_owningThreadId = 0
|
||||
--_state = 0
|
||||
--_recursionCount = 0
|
||||
--_spinCount = 22
|
||||
--_waiterStartTimeMs = 0
|
||||
--s_contentionCount = 0
|
||||
--s_maxSpinCount = 22
|
||||
--s_minSpinCountForAdaptiveSpin = -100
|
||||
desMachineID = NONE
|
||||
DesMachineName =
|
||||
newDesMachineID = NONE
|
||||
|
@ -207,66 +223,6 @@ PackageReceived = MouseWithoutBorders.PackageMonitor
|
|||
--ExplorerDragDrop = 0
|
||||
--Nil = 0
|
||||
PackageID = 0
|
||||
QUEUE_SIZE = 50
|
||||
RecentProcessedPackageIDs = 32[]
|
||||
--[0] = 0
|
||||
--[1] = 0
|
||||
--[2] = 0
|
||||
--[3] = 0
|
||||
--[4] = 0
|
||||
--[5] = 0
|
||||
--[6] = 0
|
||||
--[7] = 0
|
||||
--[8] = 0
|
||||
--[9] = 0
|
||||
--[10] = 0
|
||||
--[11] = 0
|
||||
--[12] = 0
|
||||
--[13] = 0
|
||||
--[14] = 0
|
||||
--[15] = 0
|
||||
--[16] = 0
|
||||
--[17] = 0
|
||||
--[18] = 0
|
||||
--[19] = 0
|
||||
--[20] = 0
|
||||
--[21] = 0
|
||||
--[22] = 0
|
||||
--[23] = 0
|
||||
--[24] = 0
|
||||
--[25] = 0
|
||||
--[26] = 0
|
||||
--[27] = 0
|
||||
--[28] = 0
|
||||
--[29] = 0
|
||||
--[30] = 0
|
||||
--[31] = 0
|
||||
--[32] = 0
|
||||
--[33] = 0
|
||||
--[34] = 0
|
||||
--[35] = 0
|
||||
--[36] = 0
|
||||
--[37] = 0
|
||||
--[38] = 0
|
||||
--[39] = 0
|
||||
--[40] = 0
|
||||
--[41] = 0
|
||||
--[42] = 0
|
||||
--[43] = 0
|
||||
--[44] = 0
|
||||
--[45] = 0
|
||||
--[46] = 0
|
||||
--[47] = 0
|
||||
--[48] = 0
|
||||
--[49] = 0
|
||||
recentProcessedPackageIndex = 0
|
||||
processedPackageCount = 0
|
||||
skippedPackageCount = 0
|
||||
<JustGotAKey>k__BackingField = 0
|
||||
lastXY = {X=0,Y=0}
|
||||
--x = 0
|
||||
--y = 0
|
||||
--Empty = {X=0,Y=0}
|
||||
shownErrMessage = False
|
||||
lastStartServiceTime = ????????????
|
||||
--_dateData = ????????????
|
||||
|
@ -334,9 +290,17 @@ WM_KEYDOWN = 256
|
|||
WM_KEYUP = 257
|
||||
WM_SYSKEYDOWN = 260
|
||||
WM_SYSKEYUP = 261
|
||||
[Logger Logs]
|
||||
[Logger]
|
||||
===============
|
||||
AllLogsLock = O
|
||||
AllLogsLock = Lock
|
||||
--_owningThreadId = 0
|
||||
--_state = 0
|
||||
--_recursionCount = 0
|
||||
--_spinCount = 22
|
||||
--_waiterStartTimeMs = 0
|
||||
--s_contentionCount = 0
|
||||
--s_maxSpinCount = 22
|
||||
--s_minSpinCountForAdaptiveSpin = -100
|
||||
LogCounter = Concurrent.ConcurrentDictionary`2[System.String,32]
|
||||
--_tables = Concurrent.ConcurrentDictionary`2+Tables[System.String,32]
|
||||
----_comparer = Generic.NonRandomizedStringEqualityComparer+OrdinalComparer
|
||||
|
@ -354,15 +318,7 @@ LogCounter = Concurrent.ConcurrentDictionary`2[System.String,32]
|
|||
------[5] = 0
|
||||
------[6] = 0
|
||||
------[7] = 0
|
||||
------[8] = 0
|
||||
------[9] = 0
|
||||
------[10] = 0
|
||||
------[11] = 0
|
||||
------[12] = 0
|
||||
------[13] = 0
|
||||
------[14] = 0
|
||||
------[15] = 0
|
||||
--_budget = 2
|
||||
--_budget = ????????????
|
||||
--_growLockArray = True
|
||||
--_comparerIsDefaultForClasses = False
|
||||
allLogsIndex = 0
|
||||
|
@ -402,3 +358,65 @@ MAX_LOG = 10000
|
|||
MaxLogExceptionPerHour = 1000
|
||||
HeaderSENT = Be{0},Ke{1},Mo{2},He{3},Mx{4},Tx{5},Im{6},By{7},Cl{8},Dr{9},De{10},Ed{11},Ie{12},Ni{13}
|
||||
HeaderRECEIVED = Be{0},Ke{1},Mo{2},He{3},Mx{4},Tx{5},Im{6},By{7},Cl{8},Dr{9},De{10},Ed{11},In{12},Ni{13},Pc{14}/{15}
|
||||
[Receiver]
|
||||
===============
|
||||
QUEUE_SIZE = 50
|
||||
RecentProcessedPackageIDs = 32[]
|
||||
--[0] = 0
|
||||
--[1] = 0
|
||||
--[2] = 0
|
||||
--[3] = 0
|
||||
--[4] = 0
|
||||
--[5] = 0
|
||||
--[6] = 0
|
||||
--[7] = 0
|
||||
--[8] = 0
|
||||
--[9] = 0
|
||||
--[10] = 0
|
||||
--[11] = 0
|
||||
--[12] = 0
|
||||
--[13] = 0
|
||||
--[14] = 0
|
||||
--[15] = 0
|
||||
--[16] = 0
|
||||
--[17] = 0
|
||||
--[18] = 0
|
||||
--[19] = 0
|
||||
--[20] = 0
|
||||
--[21] = 0
|
||||
--[22] = 0
|
||||
--[23] = 0
|
||||
--[24] = 0
|
||||
--[25] = 0
|
||||
--[26] = 0
|
||||
--[27] = 0
|
||||
--[28] = 0
|
||||
--[29] = 0
|
||||
--[30] = 0
|
||||
--[31] = 0
|
||||
--[32] = 0
|
||||
--[33] = 0
|
||||
--[34] = 0
|
||||
--[35] = 0
|
||||
--[36] = 0
|
||||
--[37] = 0
|
||||
--[38] = 0
|
||||
--[39] = 0
|
||||
--[40] = 0
|
||||
--[41] = 0
|
||||
--[42] = 0
|
||||
--[43] = 0
|
||||
--[44] = 0
|
||||
--[45] = 0
|
||||
--[46] = 0
|
||||
--[47] = 0
|
||||
--[48] = 0
|
||||
--[49] = 0
|
||||
recentProcessedPackageIndex = 0
|
||||
processedPackageCount = 0
|
||||
skippedPackageCount = 0
|
||||
<JustGotAKey>k__BackingField = 0
|
||||
lastXY = {X=0,Y=0}
|
||||
--x = 0
|
||||
--y = 0
|
||||
--Empty = {X=0,Y=0}
|
||||
|
|
|
@ -62,6 +62,7 @@ public static class LoggerTests
|
|||
"lastJump = ",
|
||||
"lastStartServiceTime = ",
|
||||
"InitialIV = ",
|
||||
"--_budget = ",
|
||||
};
|
||||
for (var i = 0; i < lines.Length; i++)
|
||||
{
|
||||
|
@ -89,6 +90,10 @@ public static class LoggerTests
|
|||
"------[13] = 0",
|
||||
"------[14] = 0",
|
||||
"------[15] = 0",
|
||||
"------[16] = 0",
|
||||
"------[17] = 0",
|
||||
"------[18] = 0",
|
||||
"------[19] = 0",
|
||||
};
|
||||
lines = lines.Where(line => !removeLines.Contains(line)).ToArray();
|
||||
|
||||
|
@ -113,8 +118,10 @@ public static class LoggerTests
|
|||
var sb = new StringBuilder(1000000);
|
||||
_ = Logger.PrivateDump(sb, Logger.AllLogs, "[Program logs]\r\n===============\r\n", 0, settingsDumpObjectsLevel, false);
|
||||
_ = Logger.PrivateDump(sb, new Common(), "[Other Logs]\r\n===============\r\n", 0, settingsDumpObjectsLevel, false);
|
||||
sb.AppendLine("[Logger Logs]\r\n===============");
|
||||
sb.AppendLine("[Logger]\r\n===============");
|
||||
Logger.DumpType(sb, typeof(Logger), 0, settingsDumpObjectsLevel);
|
||||
sb.AppendLine("[Receiver]\r\n===============");
|
||||
Logger.DumpType(sb, typeof(Receiver), 0, settingsDumpObjectsLevel);
|
||||
var actual = sb.ToString();
|
||||
|
||||
expected = NormalizeLog(expected);
|
||||
|
@ -146,8 +153,6 @@ public static class LoggerTests
|
|||
message.AppendLine(CultureInfo.InvariantCulture, $"[{j}]: {expectedLines[j]}:");
|
||||
}
|
||||
|
||||
var x = new ConcurrentDictionary<string, string>(-1, 16);
|
||||
|
||||
Assert.Fail(message.ToString());
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче