C语言把中文字符串复制到剪贴板是乱码求解决办法

夏尘 2016-11-04 03:33:58
#include<stdio.h>
#include <Windows.h>

void main()
{
// 打开剪贴板
if (!OpenClipboard(NULL)|| !EmptyClipboard())
{
printf("打开或清空剪切板出错!\n");
return;
}

HGLOBAL hMen;
TCHAR strText[256] = L"我被拷贝到剪切板!\n";

// 分配全局内存
hMen = GlobalAlloc(GMEM_MOVEABLE, ((strlen(strText)+1)*sizeof(TCHAR)));

if (!hMen)
{
printf("分配全局内存出错!\n");
// 关闭剪切板
CloseClipboard();
return;
}

// 把数据拷贝考全局内存中
// 锁住内存区
LPSTR lpStr = (LPSTR)GlobalLock(hMen);

// 内存复制
memcpy(lpStr, strText, ((strlen(strText))*sizeof(TCHAR)));
// 字符结束符
lpStr[strlen(strText)] = (TCHAR)0;
// 释放锁
GlobalUnlock(hMen);

// 把内存中的数据放到剪切板上
SetClipboardData(CF_TEXT, hMen);
CloseClipboard();

return;
}
...全文
1128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
振翅高飞 2016-11-04
  • 打赏
  • 举报
回复
引用 3 楼 u012598124 的回复:
[quote=引用 2 楼 sunyongliang118 的回复:] 改为

char strText[256] = "我被拷贝到剪切板!\n";   

// 分配全局内存    
hMen = GlobalAlloc(GMEM_MOVEABLE, ((strlen(strText)+1)*sizeof(char)));  

改为char之后 复制出来的还是中文乱码[/quote] 把所有TCHAR改为char,同时把工程属性改为多字节字符集(方法按Alt+F7),改字符集为多字节字符集
振翅高飞 2016-11-04
  • 打赏
  • 举报
回复
UNICODE版本

/*
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define line 11
//第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
//即为:num!/(count!*(num-count)!)   "!"为阶乘
  
_int64 factorial(_int64 z)  //阶乘
{
	_int64 i,count_sum=1;
	for (i = 1; i <= z; ++i)
	{
		count_sum *= i;
	}
	return count_sum;
}

int main()
{
	_int64 num, count, kong;  //行号-num   数字-count 空格-kong  打印序号-xuhao
	for (num = 0; num < line; num++)
	{
		for (kong = line-num; kong > 0; --kong)
		{
			printf("  ");
		}
		for (count = 0; count <= num; count++)
		{
			printf("%lld  ", factorial(num)/ (factorial(count)*factorial(num-count)));
		}
		printf("\n");
	}
	double a = 2,b = 3,c = 4;
	for(num = 1;num < 11;++num)
	{
		printf("-----------------------------num=%d---------------------------\n",num);
		printf("%.1f^%lld=%lf\n",a,num,pow(a,(int)num));
		printf("%.1f^%lld=%lf\n",b,num,pow(b,(int)num));
		printf("%.1f^%lld=%lf\n",c,num,pow(c,(int)num));
	}
	system("pause");
	return 0;
}
*/

#include<stdio.h>
#include <Windows.h>
#include<cwchar>

void main()
{
// 打开剪贴板   
if (!OpenClipboard(NULL)|| !EmptyClipboard())    
{   
printf("打开或清空剪切板出错!\n");   
return;   
}   

HGLOBAL hMen;   
TCHAR strText[256] = {L"我被拷贝到剪切板!\n"};   

// 分配全局内存    
hMen = GlobalAlloc(GMEM_MOVEABLE, ((wcslen(strText))*sizeof(TCHAR))*2);    

if (!hMen)   
{   
printf("分配全局内存出错!\n");    
// 关闭剪切板    
CloseClipboard();   
return;         
}   

// 把数据拷贝考全局内存中   
// 锁住内存区    
LPWSTR lpStr = (LPWSTR)GlobalLock(hMen);    

// 内存复制   
wmemcpy(lpStr, strText, ((wcslen(strText))*sizeof(TCHAR)));    
// 字符结束符    
lpStr[wcslen(strText)] = (TCHAR)0;   
// 释放锁    
GlobalUnlock(hMen);   

// 把内存中的数据放到剪切板上   
SetClipboardData(CF_UNICODETEXT, hMen);   
CloseClipboard();   
return; 
}
ANSI版本

#include<stdio.h>
#include <Windows.h>

void main()
{
// 打开剪贴板   
if (!OpenClipboard(NULL)|| !EmptyClipboard())    
{   
printf("打开或清空剪切板出错!\n");   
return;   
}   

HGLOBAL hMen;   
char strText[256] = "我被拷贝到剪切板!\n";   

// 分配全局内存    
hMen = GlobalAlloc(GMEM_MOVEABLE, ((strlen(strText)+1)*sizeof(char)));    

if (!hMen)   
{   
printf("分配全局内存出错!\n");    
// 关闭剪切板    
CloseClipboard();   
return;         
}   

// 把数据拷贝考全局内存中   
// 锁住内存区    
LPSTR lpStr = (LPSTR)GlobalLock(hMen);    

// 内存复制   
memcpy(lpStr, strText, ((strlen(strText))*sizeof(char)));    
// 字符结束符    
lpStr[strlen(strText)] = (TCHAR)0;   
// 释放锁    
GlobalUnlock(hMen);   

// 把内存中的数据放到剪切板上   
SetClipboardData(CF_TEXT, hMen);   
CloseClipboard();
return; 
}
两个我都在操作系统上编译运行正确通过的。测试没问题。
paschen 2016-11-04
  • 打赏
  • 举报
回复
unicode 使用 CF_UNICODETEXT
夏尘 2016-11-04
  • 打赏
  • 举报
回复
引用 2 楼 sunyongliang118 的回复:
改为

char strText[256] = "我被拷贝到剪切板!\n";   

// 分配全局内存    
hMen = GlobalAlloc(GMEM_MOVEABLE, ((strlen(strText)+1)*sizeof(char)));  

改为char之后 复制出来的还是中文乱码
振翅高飞 2016-11-04
  • 打赏
  • 举报
回复
改为

char strText[256] = "我被拷贝到剪切板!\n";   

// 分配全局内存    
hMen = GlobalAlloc(GMEM_MOVEABLE, ((strlen(strText)+1)*sizeof(char)));  

夏尘 2016-11-04
  • 打赏
  • 举报
回复
运行完Ctrl+V 粘贴出来的是乱码 求解决办法

70,006

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧