C++ GetClipboardData(CF_文本)

C++ GetClipboardData(CF_文本),c++,winapi,clipboard,C++,Winapi,Clipboard,如何使用GetClipboardData(CF_TEXT) 不调用和使用C++中的进程ID? GetClipboardData(CF_TEXT)属于哪个库?是一个Win32 API函数 必须首先使用GlobalLock()锁定GetClipboardData()返回的句柄,然后才能在剪贴板中检索ANSI文本的char*指针(请注意,如果要检索Unicode文本,应使用) 下面是从剪贴板检索文本并将其存储在方便的std::string类实例中的示例代码(为简单起见,省略了错误管理): std::s

如何使用GetClipboardData(CF_TEXT) <强>不调用和使用C++中的进程ID?
GetClipboardData(CF_TEXT)
属于哪个库?

是一个Win32 API函数

必须首先使用
GlobalLock()
锁定
GetClipboardData()
返回的句柄,然后才能在剪贴板中检索ANSI文本的
char*
指针(请注意,如果要检索Unicode文本,应使用)

下面是从剪贴板检索文本并将其存储在方便的
std::string
类实例中的示例代码(为简单起见,省略了错误管理):

std::string GetClipboardText()
{
//尝试打开剪贴板
如果(!OpenClipboard(nullptr))
…//错误
//获取ANSI文本的剪贴板对象句柄
HANDLE hData=GetClipboardData(CF_TEXT);
如果(hData==nullptr)
…//错误
//锁定句柄以获取实际的文本指针
char*pszText=static_cast(GlobalLock(hData));
if(pszText==nullptr)
…//错误
//在字符串类实例中保存文本
std::字符串文本(pszText);
//松开锁
GlobalUnlock(hData);
//释放剪贴板
CloseClipboard();
返回文本;
}

可以使用C++的RAIE模式,并使用异常管理错误条件,类似这样的情况:

#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;
  }
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
等级铁路侧板
{
公众:
RaiiClipboard()
{
如果(!OpenClipboard(nullptr))
抛出运行时_错误(“无法打开剪贴板”);
//…或为剪贴板错误定义一些自定义异常类。
}
~raiclipboard()
{
CloseClipboard();
}
//禁止复制
私人:
RaiiClipboard(const RaiiClipboard&);
RaiiClipboard&operator=(常数RaiiClipboard&);
};
类RaiiTextGlobalLock
{
公众:
显式RaiiTextGlobalLock(句柄hData)
:m_hData(hData)
{
m_psz=静态_cast(GlobalLock(m_hData));
如果(!m_psz)
抛出运行时_错误(“无法获取剪贴板文本锁定”);
}
~raitextgloballock()
{
GlobalUnlock(m_hData);
}
常量char*Get()常量
{ 
返回m_psz;
}
私人:
处理m_hData;
const char*m_psz;
//禁止复制
RaiiTextGlobalLock(const RaiiTextGlobalLock&);
raitextgloballock&运算符=(const raitextgloballock&);
};
字符串GetClipboardText()
{
纸板剪贴板;
HANDLE hData=GetClipboardData(CF_TEXT);
如果(hData==nullptr)
抛出运行时_错误(“无法获取剪贴板文本”);
RaiiTextGlobalLock文本Globallock(hData);
字符串文本(textloballock.Get());
返回文本;
}
int main()
{
静态常数int kExitOk=0;
静态常量int kexit error=1;
尝试
{

你能澄清第一个问题吗?我不知道你在问什么。至于第二个问题,答案在结尾的信息框中。@behnam27:我已经在你的问题中添加了winapi和剪贴板标记。问题不好,答案很好。这个片段非常有用。@PaulGreen:谢谢。我很高兴它有帮助。@Mr.C64为什么它能工作即使我没有用
GlobalLock
锁定句柄,也会出现异常?您的代码段正在工作,是否可以添加非文本剪贴板示例?即FileGroupDescriptor
#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;
  }
}