- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如何在 C++ 中使用 GetClipboardData(CF_TEXT);
而不调用和使用进程 ID?GetClipboardData(CF_TEXT)
属于哪个库?
最佳答案
GetClipboardData()
是一个 Win32 API 函数。
GetClipboardData()
返回的句柄必须先用GlobalLock()
锁定,然后才能取回char*
指针剪贴板中的 ANSI 文本(请注意,如果要检索 Unicode 文本,应使用 CF_UNICODETEXT
format )。
从剪贴板检索文本并将其存储在方便的 std::string
类实例中的示例代码如下(为简单起见省略了错误管理):
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;
}
您可以使用 C++ RAII 模式并使用异常管理错误条件,如下所示:
#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;
}
}
关于c++ - 获取剪贴板数据(CF_TEXT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14762456/
如何在 C++ 中使用 GetClipboardData(CF_TEXT); 而不调用和使用进程 ID? GetClipboardData(CF_TEXT) 属于哪个库? 最佳答案 GetClipbo
我有这个断断续续的问题,让我发疯了很长时间:在我的一个程序中,获取剪贴板数据(CF_TEXT) 90%(左右)的时间成功,但每隔一段时间它就会返回 NULL。 尽管 OpenClipboard() 在
我们的应用程序在非 unicode 版本中存在错误;如果我们将一些俄语字符复制到剪贴板(使用 SetClipboardData(CF_TEXT)),然后将它们粘贴到记事本中,它们不会作为俄语字符粘贴,
我完全是 C++ 的初学者,但我设法修改了其他人的代码,并最终编写了一个将 Windows 剪贴板写入文本文件的程序,并将代码页中编码的文本指定为命令行程序的参数(例如 MyProg.exe 437)
我是一名优秀的程序员,十分优秀!