web-dev-qa-db-ja.com

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();

私はここで何を間違っているのですか、それを行う適切な方法は何ですか?

ありがとう。

26
unknown

SetClipboardData 関数のMSDNドキュメントをお読みください。いくつかのステップが欠落しており、メモリを時期尚早に解放しているようです。まず、SetClipboardDataを使用するには、まず OpenClipboard を呼び出す必要があります。次に、システムはクリップボードに渡されたメモリの所有権を取得し、ロックを解除する必要があります。また、メモリは移動可能である必要があります。これには、(LocalAllocの代わりに) GlobalAlloc で使用されるGMEM_MOVEABLEフラグが必要です。

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();
53
Judge Maygarden

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;
}
12
Al S.

クリップボードの使用に関するMicrosoftのドキュメント を見てください。これには、WinAPIを使用する必要がありますが、Windowsの場合は問題ありません。非常に高級な言語を使用しない限り、Windows APIのプログラミングは決して簡単ではないことに注意してください。

0
Kredns