首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# Word 自動化:剪貼板粘貼失敗的延時與同步解決方案

     編輯:程式設計綜合問答

問題現象

RichTextBox 複製內容後粘貼到 Word 文檔,_wordRange.Paste() 偶發失敗,彈出 MessageBox 手動確認後卻能成功,疑為剪貼板數據未就緒。

根因

剪貼板操作是異步的,ClipboardCopy() 返回時數據可能尚未寫入系統剪貼板,緊接著 Paste() 讀取到空數據。

解決方案

方案一:Thread.Sleep(簡單但阻塞 UI)

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();
}

方案三:直接用 Range.InsertFile / 輸入 RTF 字符串(推薦,繞過剪貼板)

string rtf = rtxbContent.Rtf;  // 獲取 RTF 字符串
_wordRange.InsertAfter("\0");  // 佔位
_wordRange.Delete();           // 清空
_wordRange.PasteSpecial(DataType:=WdPasteDataType.wdPasteRTF);  // 需構造 RTF 流

更穩健:用 OpenXml SDK 或 DocX 庫直接寫入 .docx,完全不依賴 Word 進程。

最佳實踐清單

  • ✅ 優先使用 OpenXml/DocumentFormat.OpenXml 純 .NET 操作 docx,無需安裝 Office。
  • ✅ 必須用 COM 互操作時,Marshal.ReleaseComObject 釋放每個 RCW,防止 Word 殘留進程。
  • ✅ 關閉 _wardApp.DisplayAlerts = WdAlertLevel.wdAlertsNone 抑制彈窗。
  • ✅ 生產環境部署 Office 互操作組件 (PIA),版本與目標 Office 一致。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved