GetClipboardData(CF_TEXT)

前端 未结 1 1523
春和景丽
春和景丽 2020-12-03 08:50

How to use GetClipboardData(CF_TEXT); without calling and use process id of this in C++?
and which libary does GetClipboardD

相关标签:
1条回答
  • 2020-12-03 09:33

    GetClipboardData() is a Win32 API function.

    The handle returned by GetClipboardData() must be first locked with GlobalLock(), then you can retrieve the char* pointer of the ANSI text in the clipboard (note that if you want to retrieve Unicode text, you should use the CF_UNICODETEXT format).

    A sample code to retrieve the text from the clipboard and store it in a convenient std::string class instance follows (error management omitted for simplicity):

    std::string GetClipboardText()
    {
      // Try opening the clipboard
      if (! OpenClipboard(nullptr))
        ... // error
    
      // Get handle of clipboard object for ANSI text
      HANDLE hData = GetClipboardData(CF_TEXT);
      if (hData == nullptr)
        ... // error
    
      // Lock the handle to get the actual text pointer
      char * pszText = static_cast<char*>( GlobalLock(hData) );
      if (pszText == nullptr)
        ... // error
    
      // Save text in a string class instance
      std::string text( pszText );
    
      // Release the lock
      GlobalUnlock( hData );
    
      // Release the clipboard
      CloseClipboard();
    
      return text;
    }
    

    You can use C++ RAII pattern and manage error conditions using exceptions, something like 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 some custom exception class for clipboard errors.
      }
    
      ~RaiiClipboard()
      {
        CloseClipboard();
      }
    
      // Ban copy   
    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
      { 
        return m_psz;
      }
    
    private:
      HANDLE m_hData;
      const char* m_psz;
    
      // Ban copy
      RaiiTextGlobalLock(const RaiiTextGlobalLock&);
      RaiiTextGlobalLock& operator=(const RaiiTextGlobalLock&);
    };
    
    string GetClipboardText()
    {
      RaiiClipboard clipboard;
    
      HANDLE hData = GetClipboardData(CF_TEXT);
      if (hData == nullptr)
        throw runtime_error("Can't get clipboard text.");
    
      RaiiTextGlobalLock textGlobalLock(hData);
      string text( textGlobalLock.Get() );
    
      return text;
    }
    
    int main()
    {
      static const int kExitOk = 0;
      static const int kExitError = 1;
      try
      {
        cout << GetClipboardText() << endl;
        return kExitOk;
      }
      catch(const exception& e)
      {
        cerr << "*** ERROR: " << e.what() << endl;
        return kExitError;
      }
    }
    
    0 讨论(0)
提交回复
热议问题