| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1749 人关注过本帖
标题:windows复制粘贴的代码
只看楼主 加入收藏
xyzdwf
Rank: 2
等 级:论坛游民
威 望:1
帖 子:52
专家分:10
注 册:2017-1-9
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:8 
windows复制粘贴的代码
复制可以,粘贴还没测试。有没有什么问题?
程序代码:
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();
}
搜索更多相关主题的帖子: 复制 str size windows return 
2021-09-26 18:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
当我遇到不熟悉的函数时,我都去查官方说法,从不瞎猜

程序代码:
#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;
}
2021-09-27 09:21
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
收藏
得分:10 
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
2021-09-27 09:33
xyzdwf
Rank: 2
等 级:论坛游民
威 望:1
帖 子:52
专家分:10
注 册:2017-1-9
收藏
得分:0 
回复 2楼 rjsp
感谢版主大哥回复,sizeof(tmp)/sizeof(*tmp) 是不是要比字符串函数wcslen循环获取长度高效,一个除法就能搞定太牛了
但是为什么要用memcpy没明白
2021-09-27 10:48
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 4楼 xyzdwf
你用什么函数无所谓
但 GlobalSize 返回的是 字节数,不是 wchar_t 的数量
2021-09-27 11:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 4楼 xyzdwf
sizeof(tmp)/sizeof(*tmp) 是不是要比字符串函数wcslen循环获取长度高效

两个完全不相干的东西。

比如 wchar_t s[100] = L"abc";
sizeof(tmp)/sizeof(*tmp) 获得的是数组长度 100;
wcslen(s) 获得的是 NULL结尾字符串 的长度 3。
2021-09-27 11:49
xyzdwf
Rank: 2
等 级:论坛游民
威 望:1
帖 子:52
专家分:10
注 册:2017-1-9
收藏
得分:0 
回复 6楼 rjsp
讲的很明白,我再试试
2021-09-27 14:53
xyzdwf
Rank: 2
等 级:论坛游民
威 望:1
帖 子:52
专家分:10
注 册:2017-1-9
收藏
得分:0 
回复 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编辑过]

2021-09-27 17:32
xyzdwf
Rank: 2
等 级:论坛游民
威 望:1
帖 子:52
专家分:10
注 册:2017-1-9
收藏
得分:0 
回复 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
2021-09-27 17:35
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
收藏
得分:0 
oh sorry, never heard of it, my mistake, gui is a very complicated subsystem, I m too old to pick it up again
2021-09-27 17:41
快速回复:windows复制粘贴的代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040901 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved