C++ 在windows中设置全局剪贴板文本,本机c++;
我有一个ASCII字符串(以null结尾的字符数组) 在控制台应用程序中 我想做的就是让我的应用程序将这个字符串放入“全局剪贴板” 这样,在运行它之后,我可以在任何标准应用程序(在本例中为visual studio)中按住ctrl+v键,我的字符串将被粘贴 我该怎么做 我已经做了: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
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
代码>。