3

クリップボードに問題があり、Excel ファイルからコピー/貼り付け操作を行うたびにこのエラー メッセージが表示されます。

コードはで中断しClipboard.GetDataObject()、メッセージ エラーは次のとおりです。

OpenClipboard Failed (Exception from HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN))

Excel を開いてテキストを書き込んでからコピー/貼り付けを試みると、WPF アプリケーションは既に実行されています。

私が使用しているコードは次のとおりです。

private void SetClipboardData()
{
    IDataObject data = Clipboard.GetDataObject();
    IList result = GetDataForFileDropFormat( data );

    if ( ( result != null ) && ( result.Count > 0 ) )
    {
        this._elementsClipboard = result;
        this._sourceDrag = null;
        this._sourceClipboard = null;
    }
}

上記の関数は、このハンドラ メソッドで呼び出されます。

public void Handle_WM_DRAWCLIPBOARD( IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled )
{
    SendMessage( this._nextClipboardViewer, msg, wParam, lParam );

    // get data from clipboard
    SetClipboardData();

    handled = true;
}

MSDN および .NET フォーラムを検索してきましたが、この問題の回避策が見つかりませんでした。

誰かがそれを手伝ってくれたり、何を試すべきか教えてくれませんか?

ありがとう!

4

2 に答える 2

3

ここにいくつかの問題があります。まず、WM_DrawClipboardをチェーン内の次のアプリに送信する必要がありますが、最初に送信する必要はありません。あなたはあなた自身のものを実行した後にそれをすることができます、そしてそれからメッセージを伝えます。

次に、Excelが1回の操作ですべてのクリップボード更新を実行することを期待しないでください。複雑なオブジェクトをコピーするときに、Excelが24回もの更新を連続して実行するのを見てきました。(特にグラフ-個々のフォーマットを追加した後、クリップボードを開いたり閉じたりします)。

また、Excelは、プレーンテキスト以外のほとんどすべてに遅延レンダリングを利用します。そのため、アプリがデータを要求している間、Excelがデータをレンダリングします。それには時間がかかる場合があります。

「成功しない間または3ストライクループ」で遅延を実装する必要がある場合があります。ただし、処理の前または後にWM_DrawClipboardをチェーンに送信するかどうかに細心の注意を払う必要があります。これは、Excelデータにも関心のある他のクリップボードビューアとの別の衝突を設定する可能性があり、そのようなものに頼らなければならないためです。自分自身をだまします。

そして、あなたはこれが簡単だろうと思った.....

于 2012-02-03T19:56:37.480 に答える
0

オブジェクトに正しい種類のデータが含まれているかどうかを確認しClipboard、そのタイプのオブジェクトを要求する必要はありませんか? さまざまなタイプの複数のオブジェクトを保持でき、予期しないタイプのアイテムを取得している可能性があります。私は次のようなものを使用しますが、あなたの場合は明らかに、Addressからカスタム オブジェクトを要求することはありませんClipboard

if (System.Windows.Clipboard.ContainsData("Address"))
{
    try
    {
        return (SerializableAddress)System.Windows.Clipboard.GetData("Address");
    }
    catch (COMException)
    {
        return null; 
    }
}
return null;
于 2012-02-04T22:27:16.577 に答える