2016-04-21 45 views
1

我試圖做一個快速方法來設置MFC中的剪貼板文本,但這不起作用。將文本複製到MFC中的剪貼板中

void CopyTextToClipBoard(CString strText) 
{ 
    if (OpenClipboard(GetFrame()->GetSafeHwnd())) 
    { 
     EmptyClipboard() ; 
     SetClipboardData (CF_TEXT, strText.GetBuffer()) ; 
     CloseClipboard() ; 
    } 
} 

我在'setClipboardData'上得到'Windows斷點'錯誤。任何人都知道我可能做錯了什麼?

編輯:感謝您的評論。 Modfied。現在它失敗:memcopy函數。

void CopyTextToClipBoard(CString strText) 
{ 
if (OpenClipboard(GetFrame()->GetSafeHwnd())) 
{ 
    HGLOBAL hglbCopy; 
     LPTSTR lptstrCopy; 
    hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (strText.GetLength() + 1) * sizeof(TCHAR)); 
    if (hglbCopy == NULL) 
    { 
     CloseClipboard(); 
     return ; 
    } 
    memcpy(GlobalLock(hglbCopy), &strText, strText.GetLength() + 1 * sizeof(TCHAR));  
    GlobalUnlock(hglbCopy); 
    SetClipboardData(CF_TEXT, hglbCopy); 
    EmptyClipboard() ;  
    SetClipboardData (CF_TEXT, strText.GetBuffer()) ; 
    CloseClipboard() ; 
    } 
} 

編輯:使用這個舊的msdn示例。

const char* output = "Test"; 
const size_t len = strlen(output) + 1; 
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len); 
memcpy(GlobalLock(hMem), output, len); 
GlobalUnlock(hMem); 
OpenClipboard(0); 
EmptyClipboard(); 
SetClipboardData(CF_TEXT, hMem); 
CloseClipboard(); 
+2

你從哪裏得到的信息是,第二個參數[SetClipboardData(https://msdn.microsoft.com/en-us/library/ windows/desktop/ms649051%28v = vs.85%29.aspx)是一個字符串? – PaulMcKenzie

+0

而不是使用*&strText *,您應該使用* strText.GetBuffer()*。並且不要忘記在memcpy之後的字符串末尾添加空終止符。 –

回答

4

SetClipboardData(uFormat,hMem)

如果HMEM參數標識一個內存對象的MSDN文檔,對象必須 一直在使用功能與GMEM_MOVEABLE標誌分配

你可以這樣做:

 LPTSTR lptstrCopy; 
    HGLOBAL hglbCopy; 
    unsigned int strSize=strText.GetLength();//get your string lenght 
    hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (strSize+1) * sizeof(TCHAR));//allocate the memory object with GMEM_MOVEABLE 
    if (hglbCopy == NULL) 
    { 
      CloseClipboard(); 
      //other error handling 
    } 

    lptstrCopy = (LPTSTR)GlobalLock(hglbCopy); 
    memcpy(lptstrCopy, strText.GetBuffer(), strSize * sizeof(TCHAR)); //copy the text data 
    lptstrCopy[strSize] = (TCHAR) 0;//the null terminator 
    GlobalUnlock(hglbCopy); 

    EmptyClipboard() ; 

    SetClipboardData (CF_TEXT,hglbCopy); 

    CloseClipboard() ; 
+0

謝謝。 hglbCopy設置正確,但在我的電腦上SetClipboardData()失敗。 – netcat

+0

@Matt Fomich它在我的電腦上運行良好。當你的意思是失敗時,這是一個運行時錯誤? –

+0

它是調試器中的一個斷點,處於調試模式(錯誤 - Windows已生成一個斷點..)。我會在另一臺PC上再次嘗試。 – netcat

3

這是一個工作的 - unicode。

void CopyToClipboard(HWND owner, const std::wstring &w) 
{ 
    if (OpenClipboard(owner)) 
    { 
     HGLOBAL hgClipBuffer = nullptr; 
     std::size_t sizeInWords = w.size() + 1; 
     std::size_t sizeInBytes = sizeInWords * sizeof(wchar_t); 
     hgClipBuffer = GlobalAlloc(GHND | GMEM_SHARE, sizeInBytes); 
     if (!hgClipBuffer) 
     { 
      CloseClipboard(); 
      return; 
     } 
     wchar_t *wgClipBoardBuffer = static_cast<wchar_t*>(GlobalLock(hgClipBuffer)); 
     wcscpy_s(wgClipBoardBuffer, sizeInWords, w.c_str()); 
     GlobalUnlock(hgClipBuffer); 
     EmptyClipboard(); 
     SetClipboardData(CF_UNICODETEXT, hgClipBuffer); 
     CloseClipboard(); 
    } 
} 

(應該是正確的,寫了一篇關於手機)