Подтвердить что ты не робот

Как скопировать строку в буфер обмена в C?

Для функции SetClipboardData требуется ссылка HANDLE; У меня возникли проблемы с преобразованием моей строки для использования в этой функции.

Вот мой код:

char* output = "Test";
HLOCAL hMem =  LocalAlloc( LHND,1024);
char* cptr = (char*) LocalLock(hMem);
memcpy( cptr, output, 500 );
SetClipboardData(CF_TEXT, hMem);
LocalUnlock( hMem );
LocalFree( hMem );
CloseClipboard();

Что я делаю неправильно здесь и как правильно это сделать?

Спасибо.

4b9b3361

Ответ 1

Прочитайте документацию MSDN для функции SetClipboardData. Кажется, что вам не хватает нескольких шагов и преждевременно освобождение памяти. Прежде всего, вы должны позвонить OpenClipboard, прежде чем вы сможете использовать SetClipboardData. Во-вторых, система берет на себя ответственность за память, переданную в буфер обмена, и ее необходимо разблокировать. Кроме того, память должна быть подвижной, для которой требуется флаг GMEM_MOVEABLE, используемый с GlobalAlloc (вместо LocalAlloc).

const char* output = "Test";
const size_t len = strlen(output) + 1;
HGLOBAL hMem =  GlobalAlloc(GMEM_MOVEABLE, len);
memcpy(GlobalLock(hMem), output, len);
GlobalUnlock(hMem);
OpenClipboard(0);
EmptyClipboard();
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();

Ответ 2

Я написал инструмент командной строки с открытым исходным кодом, чтобы сделать это в Windows:

http://coffeeghost.net/2008/07/25/ccwdexe-copy-current-working-directory-command/

ccwd.exe копирует текущий рабочий каталог в буфер обмена. Это удобно, когда я на несколько уровней углубляюсь в исходное репо и вам нужно скопировать путь.

Здесь полный источник:

#include "stdafx.h"
#include "windows.h"
#include "string.h"
#include <direct.h>

int main()
{
    LPWSTR cwdBuffer;

    // Get the current working directory:
    if( (cwdBuffer = _wgetcwd( NULL, 0 )) == NULL )
        return 1;

    DWORD len = wcslen(cwdBuffer);
    HGLOBAL hdst;
    LPWSTR dst;

    // Allocate string for cwd
    hdst = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (len + 1) * sizeof(WCHAR));
    dst = (LPWSTR)GlobalLock(hdst);
    memcpy(dst, cwdBuffer, len * sizeof(WCHAR));
    dst[len] = 0;
    GlobalUnlock(hdst);

    // Set clipboard data
    if (!OpenClipboard(NULL)) return GetLastError();
    EmptyClipboard();
    if (!SetClipboardData(CF_UNICODETEXT, hdst)) return GetLastError();
    CloseClipboard();

    free(cwdBuffer);
    return 0;
}

Ответ 3

Взгляните на Документация Microsoft по использованию буфера обмена. Это требует, чтобы вы использовали WinAPI, но это не должно быть проблемой с вашего компьютера. Обратите внимание, что программирование Windows API никогда не бывает простым, если вы не используете язык очень высокого уровня.