- ベストアンサー
VC++2008でクリップボードの監視を行いたい
- VC++2008 Express Editionを使用して、クリップボードの監視を行いたいです。
- クリップボードにデータがコピーされる度に、クリップボードのデータを取得する機能を実装したいです。
- クリップボード上のデータを消さずに新しいデータがコピーされたかどうかを判断したいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 win32APIを呼び出して良ければ、こういった手段があります。 http://wisdom.sakura.ne.jp/system/winapi/win32/win92.html 以下は、クリップボードが変更される度に、メッセージボックスを出します。参考程度に。 //メンバ変数 private: HWND m_hWndNext; //自分をクリップボードビューワに登録 private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { this->m_hWndNext = ::SetClipboardViewer(static_cast<HWND>(this->Handle.ToPointer())); } //自分をクリップボードビューワから解除 private: System::Void Form1_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) { ::ChangeClipboardChain(static_cast<HWND>(this->Handle.ToPointer()), this->m_hWndNext); } //ウィンドウプロシージャのオーバーライド public: virtual System::Void WndProc(System::Windows::Forms::Message% m) override { switch(m.Msg) { //クリップボードが更新されると此処に飛び込んでくる case WM_DRAWCLIPBOARD: { //クリップボードを開く ::OpenClipboard(static_cast<HWND>(this->Handle.ToPointer())); //クリップボードフォーマットを総当りで調べて、何か見つかれば直に中断 HANDLE hClipboard = NULL; for(UINT uFormat = ::EnumClipboardFormats(0); uFormat != 0; uFormat = ::EnumClipboardFormats(uFormat)) { hClipboard = ::GetClipboardData(uFormat); //クリップボード内にデータを発見 if(hClipboard)break; } //クリップボードを閉じる ::CloseClipboard(); if(hClipboard != NULL) System::Windows::Forms::MessageBox::Show("クリップボードにデータが来ました"); ::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; } this->Form::WndProc(m); }
お礼
早速のご回答ありがとうございます。 さっそくやってみます。
補足
ご回答ありがとうございます。 さっそくやってみました。 結果は・・・・いちおう思っていたことが実現できました。 ありがとうございます。 若干、コードを変えたりしたので、その部分も含めて書いて置きます。 ***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; } }