注册 登录
编程论坛 C语言论坛

windows复制粘贴的代码

xyzdwf 发布于 2021-09-26 18:44, 2019 次点击
复制可以,粘贴还没测试。有没有什么问题?
程序代码:

void gui_gdiplus_copy(wchar_t* str, int len)
{
    if(!str || len<1 || !OpenClipboard(NULL))return;

    HGLOBAL mem = (HGLOBAL)GlobalAlloc(GMEM_MOVEABLE, (len + 1) * sizeof(wchar_t));
    if(!mem) {
        CloseClipboard();
        return;
    }

    wchar_t* wstr = (wchar_t*)GlobalLock(mem);
    if(!wstr) {
        GlobalFree(mem);
        CloseClipboard();
        return;
    }

    wcsncpy(wstr, str, len);
    wstr[len] = 0;
    GlobalUnlock(mem);
    if (!SetClipboardData(CF_UNICODETEXT, mem))
        GlobalFree(mem);
    CloseClipboard();
}

void gui_gdiplus_paste(wchar_t* str, int len)
{
    if(len<1)return;
    if(!IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL))
        return;
        
    HGLOBAL mem;
    size_t size;
    wchar_t* wstr;

    mem = (HGLOBAL)GetClipboardData(CF_UNICODETEXT);
    if (!mem) {
        CloseClipboard();
        return;
    }

    size = GlobalSize(mem) - 1;
    if (!size) {
        CloseClipboard();
        return;
    }

    wstr = (wchar_t*)GlobalLock(mem);
    if (!wstr) {
        CloseClipboard();
        return;
    }
   
    wcsncpy(str, wstr, len<size?len:size);

    GlobalUnlock(mem);
    CloseClipboard();
}
8 回复
#2
rjsp2021-09-27 09:21
当我遇到不熟悉的函数时,我都去查官方说法,从不瞎猜

程序代码:
#include <windows.h>

bool gui_gdiplus_paste( wchar_t* str, size_t len )
{
    str[0] = L'\0';

    if( !IsClipboardFormatAvailable(CF_UNICODETEXT) )
        return true;

    if( !OpenClipboard(NULL) )
        return false;
        
    HGLOBAL mem = GetClipboardData(CF_UNICODETEXT);
    if( !mem ) {
        CloseClipboard();
        return false;
    }

    SIZE_T size = GlobalSize(mem);
    if( size == 0 ) {
        CloseClipboard();
        return true;
    }

    if( size > len*sizeof(wchar_t) ) {
        CloseClipboard();
        return false;
    }

    wchar_t* wstr = (wchar_t*)GlobalLock(mem);
    if( !wstr ) {
        CloseClipboard();
        return false;
    }

    memcpy( str, wstr, size );

    GlobalUnlock(mem);
    CloseClipboard();
    return true;
}

int main( void )
{
    wchar_t tmp[1000];
    gui_gdiplus_paste( tmp, sizeof(tmp)/sizeof(*tmp) );

    return 0;
}
#3
自由而无用2021-09-27 09:33
wow, gui is a very very lovely & fashion subsystem
take good care of her, fall in love with her, thats a very very romantic feeling
#4
xyzdwf2021-09-27 10:48
回复 2楼 rjsp
感谢版主大哥回复,sizeof(tmp)/sizeof(*tmp) 是不是要比字符串函数wcslen循环获取长度高效,一个除法就能搞定太牛了
但是为什么要用memcpy没明白
#5
rjsp2021-09-27 11:47
回复 4楼 xyzdwf
你用什么函数无所谓
但 GlobalSize 返回的是 字节数,不是 wchar_t 的数量
#6
rjsp2021-09-27 11:49
回复 4楼 xyzdwf
sizeof(tmp)/sizeof(*tmp) 是不是要比字符串函数wcslen循环获取长度高效

两个完全不相干的东西。

比如 wchar_t s[100] = L"abc";
sizeof(tmp)/sizeof(*tmp) 获得的是数组长度 100;
wcslen(s) 获得的是 NULL结尾字符串 的长度 3。
#7
xyzdwf2021-09-27 14:53
回复 6楼 rjsp
讲的很明白,我再试试
#8
xyzdwf2021-09-27 17:32
回复 5楼 rjsp
已测试过的
程序代码:

void gui_gdiplus_paste(wchar_t* str, int len)
{
    if(len<1)return;
    if(!IsClipboardFormatAvailable(CF_UNICODETEXT) || !OpenClipboard(NULL))
        return;
        
    HGLOBAL mem;
    size_t size;
    wchar_t* wstr;

    mem = (HGLOBAL)GetClipboardData(CF_UNICODETEXT);
    if (!mem) {
        CloseClipboard();
        return;
    }

    size = GlobalSize(mem);
    if (!size) {
        CloseClipboard();
        return;
    }
   
    size /= sizeof(wchar_t);
    size--;
   
    wstr = (wchar_t*)GlobalLock(mem);
    if (!wstr) {
        CloseClipboard();
        return;
    }
   
    int rlen = len<size?len:size;
    wcsncpy(str, wstr, rlen);
    str[rlen] = 0;

    GlobalUnlock(mem);
    CloseClipboard();
}



[此贴子已经被作者于2021-10-1 12:52编辑过]

#9
xyzdwf2021-09-27 17:35
回复 3楼 自由而无用
最近又想用cairo(https://)来绘制ui,有人说性能不好,你用过没,性能怎么样?有没有什么坑?
Recently also want to use cairo to draw ui, some people say performance is not good, you have used not, performance how there is no pit
#10
自由而无用2021-09-27 17:41
oh sorry, never heard of it, my mistake, gui is a very complicated subsystem, I m too old to pick it up again
#11
xyzdwf2021-09-27 17:52
回复 10楼 自由而无用
谢了,正好msys2中有cairo的库,有时间我去试试才知深浅,网上的片面之词不可信
Thanks, just ‘msys2’ has cairo library, there is time for me to try to know the depth, the one-sided words on the Internet is not credible
#12
自由而无用2021-09-27 17:57
smart boy, I really like what you said, you have a great PQ(practice quotient)
1