5

クリップボードに変更を保存したい。そのため、アプリケーションを登録して、クリップボードに発生するすべての変更を取得しました。

使用する

    [DllImport("User32.dll")]
    protected static extern bool AddClipboardFormatListener(int hwnd);

その後

protected override void WndProc(ref Message m)
    {
switch (m.Msg)
        {
            case WM_CLIPBOARDUPDATE:
                OnClipboardChanged();
                break;
             ...
        }
     }

private void OnClipboardChanged()
{
    if (Clipboard.ContainsText())
        {
         MessageBox.Show(Clipboard.GetText().ToString());
        }
}

問題は: Visual Studio や firefox などのアプリケーションからテキストをコピーするときに、OnClipboardChanged() 関数が 2 回または 3 回呼び出されることがあります。

これらのアプリケーションは、データをさまざまな形式でクリップボードに書き込むと思います。これが、関数が複数回呼び出される理由です。しかし、 OnClipboardChanged() が複数回呼び出されているため、同じデータを保存しないようにするにはどうすればよいですか?

4

2 に答える 2

8

クリップボードを複数回開いたり閉じたりしているためです。私は前にそのような狂気を見たことがあります。Excel では、グラフをコピーするときに 24 の個別の操作を実行していました。
これ(疑似コード)の代わりに:

openClipboard
for each format {
  place data on clipboard(format)
}
closeClipboard

彼らはおそらくこれをやっています:

for each format {
  openClipboard
  place data on clipboard(format)
  closeClipboard
}

更新: 通常の緩和戦略は、すべての更新に対応することを避け、妥当な「安定時間」が経過した後に最後の更新に対応し、それ以上クリップボード通知がないことです。通常は 500ms で十分です。

于 2012-04-29T21:40:26.173 に答える