4

私はこの断続的で一貫性のない問題を抱えており、長い間私を夢中にさせてきました: 私のプログラムでは、GetClipboardData(CF_TEXT)は 90% (またはその程度) の確率で成功しますが、時々 NULL を返します。

これは、GetClipboardData(CF_TEXT) を呼び出す前に OpenClipboard() が常に成功する (そして戻り値がチェックされる) にもかかわらずです。

90% の成功率は、まったく同じページに対するものであることに注意してください。(つまり、そこに CF_TEXT コンテンツがあることを知っています)

注: 失敗すると、すぐに GetLastError() を呼び出しますが、返されるのは "操作が正常に完了しました"だけです。

問題のコードは次のように単純です。

if (::OpenClipboard(hwndW))
{
  HANDLE handleClip = ::GetClipboardData(CF_TEXT);
  if (handleClip == NULL)
    dw = GetLastError()
}

これに間違った GetLastError() コードを挿入する可能性があるのは何ですか?

このような一貫性のない動作を引き起こす可能性のあるものは何ですか?

他のプロセスがクリップボードをロックしている可能性はありますか? もしそうなら、どのように私はそれを取り戻すのですか?

このような問題をトラブルシューティングまたはデバッグするにはどうすればよいですか?

4

2 に答える 2

3

WebRoot セキュアエニウェアを使用していますか? そのアイデンティティ シールド機能は、許可されていないアプリケーション (基本的に事前承認されていないもの) が、保護されたアプリケーションによってクリップボードに配置されたテキストをクリップボードから取得しようとすると、クリップボードを自動的に空にします (多くのブラウザーと電子メール クライアントを含む)。デフォルト)。これが発生GetClipboardData(CF_TEXT)すると、前の への呼び出しが true を返したとしても、 は NULL をIsClipboardFormatAvailable(CF_TEXT)返します。

于 2013-10-30T07:16:58.260 に答える
2

Google 検索を行ったところ、再入可能性が原因であることが判明した同様の問題を抱えている他の人を見つけました (特定の応答を見つけるために下にスクロールします)。どこでも EmptyClipboard() を呼び出して、変更に反応しますか? 再入可能性に問題がある可能性があります。

コードスニペットが提供された後に更新し
てください投稿したコードでは、呼び出す前に条件が間違っていGetLastErrorます。結果を取得したときではなく、NULL 以外の結果を取得したときにのみ呼び出していますNULL。それを修正すれば、 からより良い回答が得られるはずですGetLastErrorこの MSDN の記事は、結果のGetLastError実際の意味を解読するのに役立ちます。

修正後のコード スニペットの更新
私の推測では、クリップボードにアクセスする他のアプリケーションとの競合状態に直面していると思われます。これを行う可能性のある他のツールが実行されているかどうかを確認することをお勧めします。

于 2011-01-19T22:43:46.783 に答える