@@ -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 ) ;
0 commit comments