2009-08-12 17 views
22

La funzione SetClipboardData richiede un riferimento HANDLE; Ho problemi a convertire la mia stringa per l'uso nella funzione.Come copiare la stringa negli appunti in C?

Ecco il mio codice:

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

Che cosa sto facendo male qui e qual è il modo corretto di farlo?

Grazie.

risposta

45

Leggere la documentazione MSDN per la funzione SetClipboardData. Sembra che manchi qualche passo e rilasci la memoria prematuramente. Prima di tutto, è necessario chiamare OpenClipboard prima di poter utilizzare SetClipboardData. In secondo luogo, il sistema acquisisce la proprietà della memoria passata negli appunti e deve essere sbloccata. Inoltre, la memoria deve essere mobile, che richiede il flag GMEM_MOVEABLE utilizzato con GlobalAlloc (anziché 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

Questo funziona! C'è un errore di battitura nella terza riga. –

+0

Funziona anche per me ... con due correzioni: GMEM_MOVEABLE e nessun parametro passato in OpenClipboard(); – Harvey

+1

Perché copiare anche il terminatore null-byte? – Jack

0

Dai uno sguardo allo Microsoft's Documentation on using the clipboard. Questo richiede che tu stia usando WinAPI, ma questo non dovrebbe essere un problema da quando sei su Windows. Si noti che la programmazione dell'API di Windows non è mai semplice a meno che non si utilizzi un linguaggio di livello molto elevato.

+0

Beh, ho già guardato questo, e si avvicinò con il codice che non funziona. –

+0

Si potrebbe semplicemente provare a copiare il codice esatto e vedere se funziona. Quindi puoi andare da lì. – Kredns

9

ho scritto uno strumento open source a riga di comando per fare questa operazione in Windows:

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

copie ccwd.exe la directory di lavoro corrente negli appunti. È utile quando sono a diversi livelli in profondità in un repository di origine e ho bisogno di copiare il percorso.

Ecco il sorgente 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 per CF_UNICODETEXT. – Jichao

Problemi correlati