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

jljoyd4f  于 2022-11-30  发布在  Windows
关注(0)|答案(3)|浏览(131)

我在控制台应用程序中有一个ASCII字符串(一个空终止的字符数组)。
所有我想做的是使它,使我的应用程序将把这个字符串到“全局剪贴板”,以便运行后,我可以在任何标准的应用程序(在这种情况下,Visual Studio)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(
似乎什么都不起作用。编辑:上面的代码总是“工作”它从来没有错误,它只是从来没有做我想要的!

kcrjzv8t

kcrjzv8t1#

如何打开EPUB文件

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();
a64a0gku

a64a0gku2#

您应该尝试使用Raymond的helper function来表示SetClipboardData
问题的一部分可能是您使用了LMEM_MOVEABLEGlobalAlloc,而您应该使用GMEM_MOVEABLE,但我还没有验证这一点。

w9apscun

w9apscun3#

我必须先调用EmptyClipboard()清空剪贴板
我想这是因为,在我尝试过的所有CF_XXX中,我没有选择最“默认”的一个。
你可以复制一张图片,然后复制文本,它们都被放到剪贴板上,你可以进入一个图片程序,点击粘贴,它会粘贴图片,然后进入一个文本程序,点击粘贴,它会粘贴文本。
因此,我认为我的问题是我没有选择一个“默认”的文本格式,它只是被添加到剪贴板后面的东西在更多的“默认”格式,所以当你点击粘贴在一个程序,它选择了更多的“默认”格式的东西粘贴。
所以,我的不完全理想的修复方法是在OpenClipboard()之后添加EmptyClipboard(),这会导致剪贴板中的所有内容都被删除,程序默认粘贴我的不完全默认格式的文本。

相关问题