2009-08-12 32 views
22

Chức năng SetClipboardData yêu cầu tham chiếu HANDLE; Tôi gặp sự cố khi chuyển đổi chuỗi của mình để sử dụng trong hàm.Làm thế nào để sao chép chuỗi vào clipboard trong C?

Đây là mã của tôi:

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

Tôi đang làm gì sai ở đây và cách thích hợp để làm điều đó là gì?

Cảm ơn.

Trả lời

45

Đọc tài liệu MSDN cho hàm SetClipboardData. Dường như bạn đang thiếu một vài bước và phát hành bộ nhớ sớm. Trước hết, bạn phải gọi OpenClipboard trước khi bạn có thể sử dụng SetClipboardData. Thứ hai, hệ thống sở hữu bộ nhớ được chuyển vào clipboard và nó phải được mở khóa. Ngoài ra, bộ nhớ phải được di chuyển, yêu cầu cờ GMEM_MOVEABLE được sử dụng với GlobalAlloc (thay vì 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

Điều đó hoạt động! Có một lỗi đánh máy trên dòng thứ ba. –

+0

Làm việc cho tôi quá ... với hai hiệu chỉnh: GMEM_MOVEABLE và không có tham số nào được truyền trong OpenClipboard(); – Harvey

+1

Tại sao sao chép null-byte-terminattor quá? – Jack

0

Hãy xem Microsoft's Documentation on using the clipboard. Điều này đòi hỏi rằng bạn sử dụng WinAPI, nhưng điều này không phải là một vấn đề kể từ khi bạn trên Windows. Lưu ý rằng lập trình API Windows không bao giờ đơn giản trừ khi bạn sử dụng một ngôn ngữ cấp cao.

+0

Vâng, Tôi đã nhìn thấy, và đã đưa ra mã mà không hoạt động. –

+0

Bạn có thể chỉ cần thử sao chép mã chính xác và xem nó có hoạt động hay không. Sau đó, bạn có thể đi từ đó. – Kredns

9

tôi đã viết một nguồn công cụ dòng lệnh mở để làm điều này trong Windows:

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

ccwd.exe bản sao thư mục làm việc hiện hành vào clipboard. Đó là tiện dụng khi tôi là một số cấp độ sâu vào một repo nguồn và cần phải sao chép đường dẫn.

Đây là nguồn hoàn chỉnh:

#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 cho CF_UNICODETEXT. – Jichao

Các vấn đề liên quan