Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在windows中设置全局剪贴板文本,本机c++;_C++_Windows_Clipboard - Fatal编程技术网

C++ 在windows中设置全局剪贴板文本,本机c++;

C++ 在windows中设置全局剪贴板文本,本机c++;,c++,windows,clipboard,C++,Windows,Clipboard,我有一个ASCII字符串(以null结尾的字符数组) 在控制台应用程序中 我想做的就是让我的应用程序将这个字符串放入“全局剪贴板” 这样,在运行它之后,我可以在任何标准应用程序(在本例中为visual studio)中按住ctrl+v键,我的字符串将被粘贴 我该怎么做 我已经做了: void SetClipboardText(char* txt) { if(!OpenClipboard(NULL)) { __asm int 3; } int l

我有一个ASCII字符串(以null结尾的字符数组) 在控制台应用程序中

我想做的就是让我的应用程序将这个字符串放入“全局剪贴板” 这样,在运行它之后,我可以在任何标准应用程序(在本例中为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()

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(); 
似乎什么都不管用。 编辑:
上面的代码总是'工作'它从来没有错误,它只是从来没有做我想要的

您应该尝试使用Raymond's for
SetClipboardData


部分问题可能是您正在使用
LMEM\u MOVEABLE
GlobalAlloc
,而您本应使用
GMEM\u MOVEABLE
,但我尚未对此进行验证。

您应该尝试使用Raymond的
SetClipboardData


部分问题可能是您正在使用
LMEM\u MOVEABLE
GlobalAlloc
,而您应该使用
GMEM\u MOVEABLE
,但我还没有验证这一点。

我必须先调用EmptyClipboard()清空剪贴板

我想这是因为,在我尝试的所有CF_XXX中,我没有为文本选择最“默认”的一个

这个想法是,你可以复制一个图像,然后复制文本,它们都被放在剪贴板上,这样你就可以转到一个图像程序,点击粘贴,它会粘贴图像,然后转到一个文本程序,点击粘贴,它会粘贴文本

因此,我认为我的问题在于我没有选择“默认”文本格式,它只是以更“默认”的格式添加到剪贴板上,因此当你在程序中点击“粘贴”时,它会选择更“默认”的格式进行粘贴


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

我必须先调用EmptyClipboard()清空剪贴板

我想这是因为,在我尝试的所有CF_XXX中,我没有为文本选择最“默认”的一个

这个想法是,你可以复制一个图像,然后复制文本,它们都被放在剪贴板上,这样你就可以转到一个图像程序,点击粘贴,它会粘贴图像,然后转到一个文本程序,点击粘贴,它会粘贴文本

因此,我认为我的问题在于我没有选择“默认”文本格式,它只是以更“默认”的格式添加到剪贴板上,因此当你在程序中点击“粘贴”时,它会选择更“默认”的格式进行粘贴


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

如何在剪贴板上设置文本

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(); 
如何从剪贴板中获取文本

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

如何设置剪贴板上的文本

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(); 
如何从剪贴板中获取文本

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

仅供参考:您可以调用
DebugBreak(),而不是
int3
.FYI:您可以调用
DebugBreak(),而不是
int3