Skip to content

Commit 6d07d34

Browse files
committed
添加剪贴板同步功能和设备聊天页面
1 parent 29496be commit 6d07d34

File tree

8 files changed

+505
-104
lines changed

8 files changed

+505
-104
lines changed

Core/Services/DeviceCommunication/DeviceCommunicationService.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ public event EventHandler<DeviceMessageReceivedEventArgs>? MessageReceived
125125
}
126126
}
127127
}
128+
public event EventHandler<DeviceClipboardReceivedEventArgs>? ClipboardTextReceived;
128129
public event EventHandler<FileTransferRequestEventArgs>? FileTransferRequested;
129130
public event EventHandler<TransferInterruptionEventArgs>? TransferInterrupted;
130131

@@ -284,6 +285,38 @@ private void PublishMessageReceived(DeviceModel sender, string message)
284285
}
285286
}
286287

288+
private void PublishClipboardReceived(DeviceModel sender, string text)
289+
{
290+
if (string.IsNullOrWhiteSpace(text))
291+
{
292+
return;
293+
}
294+
295+
var handlers = ClipboardTextReceived;
296+
if (handlers is null)
297+
{
298+
return;
299+
}
300+
301+
var args = new DeviceClipboardReceivedEventArgs(sender, text);
302+
foreach (var handler in handlers.GetInvocationList())
303+
{
304+
if (handler is not EventHandler<DeviceClipboardReceivedEventArgs> typedHandler)
305+
{
306+
continue;
307+
}
308+
309+
try
310+
{
311+
typedHandler(this, args);
312+
}
313+
catch (Exception ex)
314+
{
315+
System.Diagnostics.Debug.WriteLine($"[Clipboard] Handler error: {ex}");
316+
}
317+
}
318+
}
319+
287320
private void ShowIncomingMessageToast(DeviceMessageReceivedEventArgs args)
288321
{
289322
var senderName = GetDeviceDisplayName(args.Sender);
@@ -613,6 +646,26 @@ await SaveChatRecordAsync(
613646
}
614647
}
615648

649+
public async Task SendClipboardTextAsync(DeviceModel target, string text)
650+
{
651+
if (string.IsNullOrWhiteSpace(text))
652+
{
653+
return;
654+
}
655+
656+
var meta = new PacketMetadata
657+
{
658+
Type = "ClipboardText",
659+
Content = text,
660+
SenderPort = GetAdvertisedPort(),
661+
SenderId = _myId.ToString(),
662+
SenderName = GetLocalDisplayName()
663+
};
664+
665+
var json = JsonSerializer.Serialize(meta);
666+
await SendStreamAsync(target, Stream.Null, json);
667+
}
668+
616669
public async Task RequestFileTransferAsync(DeviceModel target)
617670
{
618671
var filePath = await PickFileToSendAsync();
@@ -1075,6 +1128,11 @@ await SaveChatRecordAsync(
10751128
PublishMessageReceived(sender, packet.Content);
10761129
break;
10771130

1131+
case "ClipboardText":
1132+
await DrainRemainingDataAsync(dataStream);
1133+
PublishClipboardReceived(sender, packet.Content);
1134+
break;
1135+
10781136
case "FileReq":
10791137
await DrainRemainingDataAsync(dataStream);
10801138
await HandleIncomingFileRequestAsync(packet, sender);

Core/ViewModel/Main/MainWindowViewModel.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,17 @@ public MainWindowViewModel()
7373
},
7474
new MenuItemViewModel
7575
{
76-
MenuHeader = "设备通信",
76+
MenuHeader = "设备互联",
7777
Key = "DeviceDiscovery",
7878
MenuIconGlyph = "\ue975", // Placeholder icon
7979
MenuIconFilledGlyph = "\ue975"
80+
},
81+
new MenuItemViewModel
82+
{
83+
MenuHeader = "设备聊天",
84+
Key = "DeviceChat",
85+
MenuIconGlyph = "\ue975",
86+
MenuIconFilledGlyph = "\ue975"
8087
}
8188
};
8289

0 commit comments

Comments
 (0)