GetClipboardData (CF_TEXT)

Как пользоваться GetClipboardData(CF_TEXT); без вызова и использования идентификатора процесса этого в C ++?
и какая библиотека GetClipboardData(CF_TEXT) принадлежать?

2

Решение

GetClipboardData() является функцией Win32 API

Ручка, возвращенная GetClipboardData() должен быть сначала заблокирован с GlobalLock(), то вы можете получить char* указатель текста ANSI в буфере обмена (обратите внимание, что если вы хотите получить текст Unicode, вы должны использовать CF_UNICODETEXT формат).

Пример кода для извлечения текста из буфера обмена и сохранения его в удобном 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;
}
}
28

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]