RichTextBox 複製內容後粘貼到 Word 文檔,_wordRange.Paste() 偶發失敗,彈出 MessageBox 手動確認後卻能成功,疑為剪貼板數據未就緒。
剪貼板操作是異步的,ClipboardCopy() 返回時數據可能尚未寫入系統剪貼板,緊接著 Paste() 讀取到空數據。
rtxbContent.SelectAll();
rtxbContent.Copy();
Thread.Sleep(500); // 500ms 通常足夠
_wordRange.Paste();
rtxbContent.Copy();
int retry = 10;
while (retry-- > 0 && !Clipboard.ContainsText(TextDataFormat.Rtf)) {
Thread.Sleep(100);
}
if (Clipboard.ContainsText(TextDataFormat.Rtf)) {
_wordRange.Paste();
}
string rtf = rtxbContent.Rtf; // 獲取 RTF 字符串
_wordRange.InsertAfter("\0"); // 佔位
_wordRange.Delete(); // 清空
_wordRange.PasteSpecial(DataType:=WdPasteDataType.wdPasteRTF); // 需構造 RTF 流
更穩健:用 OpenXml SDK 或 DocX 庫直接寫入 .docx,完全不依賴 Word 進程。
Marshal.ReleaseComObject 釋放每個 RCW,防止 Word 殘留進程。_wardApp.DisplayAlerts = WdAlertLevel.wdAlertsNone 抑制彈窗。