読者です 読者をやめる 読者になる 読者になる

Windowsプログラミング GetClipboardDataがNULLを返す時

 クリップボードを頻繁に使用するプログラムを書きました。その中で、クリップボードのデータをGetClipboardDataで得ようとした時、返り値がNULLになるという問題に遭遇しました。

if (OpenClipboard(_hwnd))
{
  // クリップボードメモリのハンドルを得る
  HANDLE hMem = GetClipboardData(CF_UNICODETEXT);
  if (!hMem)
    hMem = hMem;
  // クリップボードメモリへのポインタを得る
  wchar_t* pBuffer = (wchar_t*)GlobalLock(hMem);
  if (pBuffer)
  {
    wstring str(pBuffer);

    // クリップボードを閉じる
    EmptyClipboard();
    CloseClipboard();
  }
  GlobalUnlock(hMem);
}

 で、理由はよくわかりませんでしたが、以前は起こらなかった現象なので、他のアプリケーションも同じクリップボードを使うことから、他のアプリケーションが悪さをしていると見込み、常駐しているプログラムを全部閉じ、セキュリティソフトもオフにしてみたところ、この現象は回避出来ました。その後、セキュリティソフトは起動してもクリップボードを正常に使えたので、他のソフトウェアとの兼ね合いであろうと思われます。

 復数のアプリケーションを同時に閉じて試したので、ちゃんとした調査にはなっていませんが、そういうことです。

 どのアプリが悪さをしているのかを調べるには少し手間が必要です。クリップボードの中身を常に監視して、どうやらクリップボードへのロックを外していなさそうなもの、を探すしかありません。また、GetLastErrorで一応エラーメッセージを確認しておくと分かることも有るかもしれません。

 まぁとにかく、ちゃんと作られているクリップボード操作プログラムを復数動かしていても、こんなことは起こりません。世にあるソフトウェアは信用しすぎるなといういい例かもしれません。