1// Windows/Clipboard.cpp 2 3#include "StdAfx.h" 4 5#ifdef UNDER_CE 6#include <winuserm.h> 7#endif 8 9#include "../Common/StringConvert.h" 10 11#include "Clipboard.h" 12#include "Defs.h" 13#include "MemoryGlobal.h" 14#include "Shell.h" 15 16namespace NWindows { 17 18bool CClipboard::Open(HWND wndNewOwner) throw() 19{ 20 m_Open = BOOLToBool(::OpenClipboard(wndNewOwner)); 21 return m_Open; 22} 23 24bool CClipboard::Close() throw() 25{ 26 if (!m_Open) 27 return true; 28 m_Open = !BOOLToBool(CloseClipboard()); 29 return !m_Open; 30} 31 32bool ClipboardIsFormatAvailableHDROP() 33{ 34 return BOOLToBool(IsClipboardFormatAvailable(CF_HDROP)); 35} 36 37/* 38bool ClipboardGetTextString(AString &s) 39{ 40 s.Empty(); 41 if (!IsClipboardFormatAvailable(CF_TEXT)) 42 return false; 43 CClipboard clipboard; 44 45 if (!clipboard.Open(NULL)) 46 return false; 47 48 HGLOBAL h = ::GetClipboardData(CF_TEXT); 49 if (h != NULL) 50 { 51 NMemory::CGlobalLock globalLock(h); 52 const char *p = (const char *)globalLock.GetPointer(); 53 if (p != NULL) 54 { 55 s = p; 56 return true; 57 } 58 } 59 return false; 60} 61*/ 62 63/* 64bool ClipboardGetFileNames(UStringVector &names) 65{ 66 names.Clear(); 67 if (!IsClipboardFormatAvailable(CF_HDROP)) 68 return false; 69 CClipboard clipboard; 70 71 if (!clipboard.Open(NULL)) 72 return false; 73 74 HGLOBAL h = ::GetClipboardData(CF_HDROP); 75 if (h != NULL) 76 { 77 NMemory::CGlobalLock globalLock(h); 78 void *p = (void *)globalLock.GetPointer(); 79 if (p != NULL) 80 { 81 NShell::CDrop drop(false); 82 drop.Attach((HDROP)p); 83 drop.QueryFileNames(names); 84 return true; 85 } 86 } 87 return false; 88} 89*/ 90 91static bool ClipboardSetData(UINT uFormat, const void *data, size_t size) throw() 92{ 93 NMemory::CGlobal global; 94 if (!global.Alloc(GMEM_DDESHARE | GMEM_MOVEABLE, size)) 95 return false; 96 { 97 NMemory::CGlobalLock globalLock(global); 98 LPVOID p = globalLock.GetPointer(); 99 if (!p) 100 return false; 101 memcpy(p, data, size); 102 } 103 if (::SetClipboardData(uFormat, global) == NULL) 104 return false; 105 global.Detach(); 106 return true; 107} 108 109bool ClipboardSetText(HWND owner, const UString &s) 110{ 111 CClipboard clipboard; 112 if (!clipboard.Open(owner)) 113 return false; 114 if (!::EmptyClipboard()) 115 return false; 116 117 bool res; 118 res = ClipboardSetData(CF_UNICODETEXT, (const wchar_t *)s, (s.Len() + 1) * sizeof(wchar_t)); 119 #ifndef _UNICODE 120 AString a (UnicodeStringToMultiByte(s, CP_ACP)); 121 if (ClipboardSetData(CF_TEXT, (const char *)a, (a.Len() + 1) * sizeof(char))) 122 res = true; 123 a = UnicodeStringToMultiByte(s, CP_OEMCP); 124 if (ClipboardSetData(CF_OEMTEXT, (const char *)a, (a.Len() + 1) * sizeof(char))) 125 res = true; 126 #endif 127 return res; 128} 129 130} 131