c++ - GetClipboardData(CF_TEXT) -
c++ - GetClipboardData(CF_TEXT) -
how using getclipboarddata(cf_text);
without calling , utilize process id of in c++? , getclipboarddata(cf_text)
belong library?
getclipboarddata()
win32 api function.
the handle returned getclipboarddata()
must first locked globallock()
, can retrieve char*
pointer of ansi text in clipboard (note if want retrieve unicode text, should utilize cf_unicodetext
format).
a sample code retrieve text clipboard , store in convenient std::string
class instance follows (error management omitted simplicity):
std::string getclipboardtext() { // seek opening clipboard if (! openclipboard(nullptr)) ... // error // handle of clipboard object ansi text handle hdata = getclipboarddata(cf_text); if (hdata == nullptr) ... // error // lock handle actual text pointer char * psztext = static_cast<char*>( globallock(hdata) ); if (psztext == nullptr) ... // error // save text in string class instance std::string text( psztext ); // release lock globalunlock( hdata ); // release clipboard closeclipboard(); homecoming text; }
you can utilize c++ raii pattern , manage error conditions using exceptions, this:
#include <exception> #include <iostream> #include <ostream> #include <stdexcept> #include <string> #include <windows.h> using namespace std; class raiiclipboard { public: raiiclipboard() { if (! openclipboard(nullptr)) throw runtime_error("can't open clipboard."); // ... or define custom exception class clipboard errors. } ~raiiclipboard() { closeclipboard(); } // ban re-create private: raiiclipboard(const raiiclipboard&); raiiclipboard& operator=(const raiiclipboard&); }; class raiitextgloballock { public: explicit raiitextgloballock(handle hdata) : m_hdata(hdata) { m_psz = static_cast<const char*>(globallock(m_hdata)); if (! m_psz) throw runtime_error("can't acquire lock on clipboard text."); } ~raiitextgloballock() { globalunlock(m_hdata); } const char* get() const { homecoming m_psz; } private: handle m_hdata; const char* m_psz; // ban re-create raiitextgloballock(const raiitextgloballock&); raiitextgloballock& operator=(const raiitextgloballock&); }; string getclipboardtext() { raiiclipboard clipboard; handle hdata = getclipboarddata(cf_text); if (hdata == nullptr) throw runtime_error("can't clipboard text."); raiitextgloballock textgloballock(hdata); string text( textgloballock.get() ); homecoming text; } int main() { static const int kexitok = 0; static const int kexiterror = 1; seek { cout << getclipboardtext() << endl; homecoming kexitok; } catch(const exception& e) { cerr << "*** error: " << e.what() << endl; homecoming kexiterror; } }
c++ winapi clipboard
Comments
Post a Comment