クラスによってクリップボードの動作が異なる話

アプリケーションによってクリップボードの動作が微妙に異なるなと思ったことありません?

ブリュンヒルデのクリップボード共有機能のバグ ( リモートデスクトップを開発してるエンジニアのブログ。 )

すんませーん!

原因は、長さゼロのテキストデータがクリップボードに入った場合に、想定外の動作になってしまう事でした。長さゼロのテキストデータをどーやってクリップボードが入れるのか未だに謎なんですが、いやいつの間にか入っていたんですけど。もし御存知の方がいらっしゃいましたら御連絡御待ちしておりやす。

実は、クリップボードの処理、コピーペーストされるオブジェクトのクラスによって動作が変わるんです。

#include "stdafx.h"
#include <windows.h>

int main(int argc, char* argv[])
{
    while(1){
        if (IsClipboardFormatAvailable(CF_TEXT)) {
            ::OpenClipboard(NULL);
            HANDLE hData = GetClipboardData(CF_TEXT);
            char *pszData = (char *)GlobalLock(hData);
            GlobalUnlock(hData);
            printf("%d:%s\n",lstrlenA(pszData),pszData);
            EmptyClipboard();
            ::CloseClipboard();
            Sleep(100);
        }
    }
    return 0;
}

試しに、こんなコード書いてみます

3パターンのクラスを確認したので表にしてみます

クラス名 マルチバイトコピー 0バイトコピー
TEXT 単純にコピー 何もしない
VC6のAFX 単純にコピー 選択行すべてをコピー
RICHEDIT 一旦 0バイトをクリップボードに入れてからコピー 何もしない

ええ、すごく変です・ω・

まぁ、参考になれば幸いですね

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です