2009-08-12 23 views
22

La función SetClipboardData requiere una referencia HANDLE; Tengo problemas para convertir mi cadena para utilizarla en la función.Cómo copiar una cadena al portapapeles en C?

Aquí está mi código:

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

¿qué estoy haciendo mal aquí y lo que es la forma correcta de hacerlo?

Gracias.

Respuesta

45

Lea la documentación de MSDN para la función SetClipboardData. Parece que te faltan algunos pasos y liberas la memoria prematuramente. En primer lugar, debe llamar al OpenClipboard antes de poder usar SetClipboardData. En segundo lugar, el sistema toma posesión de la memoria pasada al portapapeles y debe estar desbloqueada. Además, la memoria debe ser movible, lo que requiere el indicador GMEM_MOVEABLE tal como se utiliza con GlobalAlloc (en lugar de 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(); 
+0

¡Eso funciona! Hay un error tipográfico en la tercera línea. –

+0

Funciona para mí también ... con dos correcciones: GMEM_MOVEABLE y sin parámetro pasado en OpenClipboard(); – Harvey

+1

¿Por qué también copiar el terminador de byte nulo? – Jack

0

Eche un vistazo a Microsoft's Documentation on using the clipboard. Esto requiere que uses el WinAPI, pero esto no debería ser un problema ya que estás en Windows. Tenga en cuenta que la programación de la API de Windows nunca es simple a menos que use un lenguaje de alto nivel.

+0

Bueno, Ya he mirado en ese, y se acercó con un código que no funciona. –

+0

Puede intentar copiar el código exacto y ver si funciona. Entonces usted puede ir de allí. – Kredns

9

me escribió una herramienta de línea de comandos de código abierto para hacer esto en Windows:

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

copias ccwd.exe el directorio de trabajo actual en el portapapeles. Es útil cuando tengo varios niveles en un repositorio fuente y necesito copiar la ruta.

Aquí está la fuente completo:

#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; 
} 
+1

+1 para CF_UNICODETEXT. – Jichao

Cuestiones relacionadas