在windows中设置GLOBAL剪贴板文本,本机c ++

时间:2010-07-05 05:08:13

标签: c++ windows clipboard

我有一个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()

似乎什么都没有用。 编辑: 上面的代码总是'有效'它永远不会出错,它永远不会做我想要的!

3 个答案:

答案 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_MOVEABLEGlobalAlloc,当您应该使用GMEM_MOVEABLE时,我还没有验证这一点。

答案 2 :(得分:0)

我必须先清空剪贴板,然后再调用EmptyClipboard()

我认为这是因为,在我试过的所有CF_XXX中,我没有为文本选择最“默认”的。[/ p>

这个想法是,您可以复制图像,然后复制文本,然后将它们放入剪贴板,这样您就可以转到图像程序,点击粘贴,然后粘贴图像,然后转到文本程序,点击粘贴,它将粘贴文本。

因此我相信我的问题是我没有选择“默认”文本格式,它只是以更“默认”格式添加到剪贴板后面,所以当你在程序中粘贴时,它选择了更多'默认'格式的东西来粘贴。

所以是的,我不完全理想的修复是在OpenClipboard()之后添加EmptyClipboard(),这会导致所有内容从剪贴板中删除,并且程序默认粘贴我不完全默认的格式文本。