※ ChatGPTを利用し、要約された質問です(原文:VC++2008 で クリップボードの監視を行いたい)
VC++2008でクリップボードの監視を行いたい
このQ&Aのポイント
VC++2008 Express Editionを使用して、クリップボードの監視を行いたいです。
クリップボードにデータがコピーされる度に、クリップボードのデータを取得する機能を実装したいです。
クリップボード上のデータを消さずに新しいデータがコピーされたかどうかを判断したいです。
VC++2008 で クリップボードの監視を行いたい
いつもおせわになっております。
ただいま、Visual C++ 2008 Express Edition を使いまして、クリップボード拡張アプリを作っております。
実装したい機能として・・・
A.クリップボードにデータがコピーされる度に、クリップボードのデータを取得する。
B.ただし、クリップボード上のデータは消さない。
というものがあります。
この使用を実装するために、下記のようにデータ存在の有無をタイマーな
どでポーリングすれば良いと考えました。
>IDataObject ^data = System::Windows::Forms::Clipboard::GetDataObject();
>pictureShowPicture->Image->Dispose();
>if(data->GetDataPresent(DataFormats::Bitmap) == true){
しかし、この方法だと、一回でもデータがクリップボードにコピーされると、その後もずっと「データが存在する」状態となってしまい、新しいデータが来たのかどうか判断が出来ません。
クリップボード上のデータを消せば、「データが存在しない」状態となり、次にデータがコピーされたことが分かるのですが、クリップボード上のデータは消さない実装としたいのです。
このため、下記のようにすれば問題が解決できると思いました。
1.何らかの方法でクリップボードにデータがコピーされたという通知を受け取る。
2.現在のデータが直前のデータと同じか異なるかを判断する。
(ポーリングしておいて、データが異なれば新規データと判断)
上記1,2について、実現方法をご存知の方は教えていただけませんでしょうか。
ちなみに、受け取りたいデータ形式は、ビットマップ形式画像およびテキスト形式です。
お忙しいところ恐縮ですが、よろしくお願いいたします。
お礼
早速のご回答ありがとうございます。 さっそくやってみます。
補足
ご回答ありがとうございます。 さっそくやってみました。 結果は・・・・いちおう思っていたことが実現できました。 ありがとうございます。 若干、コードを変えたりしたので、その部分も含めて書いて置きます。 ***stdafx.h #include <windows.h> #pragma comment(lib, "user32.lib") //このライブラリを使うように指示。これがないとリンクしてくれない。 ***Form1.h private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { //クリップボードビュワーに登録。 this->m_hWndNext = ::SetClipboardViewer(static_cast<HWND>(this->Handle.ToPointer())); } public: virtual System::Void WndProc(System::Windows::Forms::Message% m) override { System::Windows::Forms::IDataObject ^data = System::Windows::Forms::Clipboard::GetDataObject(); this->Form::WndProc(m); //ここにおかないとエラーになる。なぜだろう??? switch(m.Msg) { case WM_DRAWCLIPBOARD: if(data->GetDataPresent(DataFormats::Bitmap) == true) { textHashCode->Text = data->GetHashCode().ToString(); pictureShowPicture->Image = (Image^)data->GetData(DataFormats::Bitmap); //フォルダの最後の文字を "\" にする。 if( textFolderDestination->Text[textFolderDestination->Text->Length - 1] != '\\'){ textFolderDestination->Text = textFolderDestination->Text + "\\"; } } pictureShowPicture->Image->Save(textFolderDestination->Text + textHashCode->Text + ".jpg"); ::SendMessage(this->m_hWndNext, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32()); break; case WM_CHANGECBCHAIN: if(this->m_hWndNext == static_cast<HWND>(m.WParam.ToPointer())){ this->m_hWndNext = static_cast<HWND>(m.LParam.ToPointer()); } else if(this->m_hWndNext != NULL){ ::SendMessage(this->m_hWndNext, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32()); } break; } }