2010-07-05 24 views
0

我在控制檯應用程序中有一個ASCII字符串(一個null結束字符數組) 。在windows中設置GLOBAL剪貼板文本,本地C++

我想要做的就是讓我的應用程序將此字符串放入「全局剪貼板」 中,以便在運行後,我可以在任何標準應用程序(本例中爲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()。 編輯: 上面的代碼總是'工作'它從來沒有錯誤,它只是從來沒有做我想要的!

+2

FYI的設置文本:不是'INT 3'你可以叫'的DebugBreak();'。 – 2010-07-05 05:14:37

回答

4

如何把剪貼板上

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

你應該嘗試使用雷蒙德的helper functionSetClipboardData

問題的一部分可能是你使用LMEM_MOVEABLEGlobalAlloc,當你應該使用GMEM_MOVEABLE,但我沒有證實這一點。

0

我不得不清空剪貼板首先調用EmptyClipboard()

我想這是因爲,所有我試過CF_XXX的,我並沒有選擇最「默認」一個文本。

想法是,您可以複製圖像,然後複製文本,然後將它們都放入剪貼板,然後您可以轉到圖像程序,點擊粘貼,然後粘貼圖像,然後轉到一個文本程序,點擊粘貼,它會粘貼文本。

因此我相信我的問題是我沒有選擇'默認'文本格式,它只是以更'默認'的格式添加到剪貼板背後,所以當你點擊粘貼到程序中時,它選擇了更多'默認'格式化的東西來粘貼。

所以是的,我不完全理想的解決方法是在OpenClipboard()之後添加EmptyClipboard(),這會導致一切從剪貼板中刪除,程序默認粘貼我的默認格式文本。