| 
          【代码】C++操作Windows的剪切板的文本内容 | 
        
                
          
            
                         一派护法 十九级              | 
          
            
            
             
              void cut(HWND hWnd) {     TCHAR str[] = TEXT("information");     HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(str));     LPTSTR lptStr = (LPTSTR)GlobalLock(hMem);     memcpy(lptStr, str, sizeof(str));     GlobalUnlock(hMem);
      OpenClipboard(hWnd);     EmptyClipboard();     SetClipboardData(CF_TEXT, hMem);     CloseClipboard(); }
  void paste(HWND hWnd) {     if (!IsClipboardFormatAvailable(CF_TEXT))     {         MessageBox(hWnd, TEXT("剪切板中没有文本内容!"), TEXT("剪切板"), MB_ICONWARNING);         return;     }     OpenClipboard(hWnd);     HGLOBAL hMem = GetClipboardData(CF_TEXT);     if (hMem)     {         LPTSTR str = (LPTSTR)GlobalLock(hMem);         if (str)         {             MessageBox(hWnd, str, TEXT("剪切板内容"), MB_ICONWARNING);             GlobalUnlock(hMem);         }     }     CloseClipboard(); } 说明:编译前,请将工程改为使用单字节字符串的版本。              
                       | 
        
                
          
            
                         一派护法 十九级              | 
          
            
            
            
                            void cut(HWND hWnd) {     TCHAR str[] = TEXT("information");... 
			  “单字节字符串”就是“多字节字符集”              
                       | 
        
                
          
            
                         一派护法 十九级              | 
          
            
              
                3楼
                发表于: 2016-1-2 11:59
                                
              
             
            
            
              如果被粘贴对象是一个句柄,比如位图句柄HBITMAP,窗口句柄HWND,那么就可以直接放入SetClipboardData作为参数,无需创建hMem全局句柄。             
                       | 
        
                
          
            
                         一派护法 十九级              | 
          
            
            
             
              如果要想把宽字符wchar_t文本内容放入到剪切板中,只需将剪切板格式改为CF_UNICODETEXT就行了: int _tmain(int argc, _TCHAR* argv[]) {     time_t t = time(NULL);     WCHAR wstr[30];     LPWSTR pwStr;     HGLOBAL hMem;     swprintf_s(wstr, L"请注意,当前的UNIX时间戳是%ld。", t);          OpenClipboard(NULL);     EmptyClipboard();     hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(wstr));     pwStr = (LPWSTR)GlobalLock(hMem);     memcpy(pwStr, wstr, sizeof(wstr));     GlobalUnlock(hMem);     SetClipboardData(CF_UNICODETEXT, hMem);     CloseClipboard();
      system("pause");     return 0; } 在CF_TEXT和CF_UNICODETEXT这两种格式中,剪切/复制时只需放置一种格式就行了,不需要两个格式都放。因为Windows会在粘贴的时候自动完成转换。              
                       | 
        
                
          
            
                         一派护法 十九级              | 
          
            
            
             
              【设置为直到粘贴时才获取内容】 响应Windows消息: case WM_RENDERFORMAT:         renderFormat(wParam);         break;
  剪切命令执行函数: void cut(HWND hWnd) {     OpenClipboard(hWnd);     EmptyClipboard();     SetClipboardData(CF_UNICODETEXT, NULL);     CloseClipboard(); }
  响应WM_RENDERFORMAT消息的函数,获取内容: void renderFormat(WPARAM wParam) {     if (wParam != CF_UNICODETEXT)         return;          time_t tm = time(NULL);     WCHAR wstr[30];     swprintf_s(wstr, L"时间戳: %ld", tm);     HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(wstr));     LPWSTR pwStr = (LPWSTR)GlobalLock(hMem);     memcpy(pwStr, wstr, sizeof(wstr));
      GlobalUnlock(hMem);     SetClipboardData(CF_UNICODETEXT, hMem); } 一旦SetClipboardData执行成功,这个函数以后就不再被调用。如果执行失败则会在每次粘贴时都调用,直到最终成功。              
                       | 
        
                
          
            
                         一派护法 十九级              | 
          
            
            
             
              【复制wstring字符串对象的例子】     wstring str = L"简体中文abc";     int size = (str.length() + 1) * sizeof(wchar_t);     HGLOBAL hMem;     LPWSTR pStr;
      OpenClipboard(NULL);     EmptyClipboard();     hMem = GlobalAlloc(GMEM_MOVEABLE, size);     pStr = (LPWSTR)GlobalLock(hMem);     memcpy(pStr, str.data(), size);     GlobalUnlock(hMem);     SetClipboardData(CF_UNICODETEXT, hMem);     CloseClipboard();              
                       | 
        
                
          
            
                         一派护法 十九级              | 
          
            
            
             
              在Visual Studio 2012的Win32控制台程序中,如果char字符数组包含汉字,那么粘贴的时候就会乱码。改用wchar_t字符数组并把剪切板格式设为CF_UNICODETEXT后问题解决。 例如:     char str[] = "abc中文def";     HGLOBAL hMem;     char *pStr;
      OpenClipboard(NULL);     EmptyClipboard();     hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(str));     pStr = (char *)GlobalLock(hMem);     memcpy(pStr, str, sizeof(str));     GlobalUnlock(hMem);     SetClipboardData(CF_TEXT, hMem);     CloseClipboard(); 执行程序后,剪切板的内容为:abcÖÐÎÄdef              
                       |