我有一个ASCII字符串(空终止字符数组) 在控制台应用程序中。
我想要做的就是让我的应用程序将此字符串放入“全局剪贴板” 运行后,我可以在任何标准应用程序(在这种情况下,视觉工作室)ctrl + v,我的字符串将被粘贴!
我该怎么做?
我做了:
void SetClipboardText(char* txt)
{
if(!OpenClipboard(NULL))
{
__asm int 3;
}
int l = PIstrlen(txt);
HLOCAL la = GlobalAlloc(LMEM_MOVEABLE,l+1);
void* dest = GlobalLock(la);
PImemcpy(dest,txt,l+1);
GlobalUnlock(la);
if(!SetClipboardData(CF_OEMTEXT,la))
{
__asm int 3;
}
CloseClipboard();
}
我已经尝试过CF_TEXT,CF_OEMTEXT,CF_UNICODE,我在打开剪贴板时尝试过NULL和GetDesktopWindow()
似乎什么都没有用。 编辑: 上面的代码总是'有效'它永远不会出错,它永远不会做我想要的!答案 0 :(得分:6)
如何在剪贴板上设置文字
CString source;
//put your text in source
if(OpenClipboard())
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(source));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
如何从剪贴板中删除文本
char * buffer;
if(OpenClipboard())
{
buffer = (char*)GetClipboardData(CF_TEXT);
//do something with buffer here
//before it goes out of scope
}
CloseClipboard();
答案 1 :(得分:3)
您应该尝试将Raymond的helper function用于SetClipboardData
。
部分问题可能是您使用LMEM_MOVEABLE
与GlobalAlloc
,当您应该使用GMEM_MOVEABLE
时,我还没有验证这一点。
答案 2 :(得分:0)
我必须先清空剪贴板,然后再调用EmptyClipboard()
我认为这是因为,在我试过的所有CF_XXX中,我没有为文本选择最“默认”的。[/ p>
这个想法是,您可以复制图像,然后复制文本,然后将它们放入剪贴板,这样您就可以转到图像程序,点击粘贴,然后粘贴图像,然后转到文本程序,点击粘贴,它将粘贴文本。
因此我相信我的问题是我没有选择“默认”文本格式,它只是以更“默认”格式添加到剪贴板后面,所以当你在程序中粘贴时,它选择了更多'默认'格式的东西来粘贴。
所以是的,我不完全理想的修复是在OpenClipboard()之后添加EmptyClipboard(),这会导致所有内容从剪贴板中删除,并且程序默认粘贴我不完全默认的格式文本。