1370b324cSopenharmony_ci// Windows/Clipboard.cpp 2370b324cSopenharmony_ci 3370b324cSopenharmony_ci#include "StdAfx.h" 4370b324cSopenharmony_ci 5370b324cSopenharmony_ci#ifdef UNDER_CE 6370b324cSopenharmony_ci#include <winuserm.h> 7370b324cSopenharmony_ci#endif 8370b324cSopenharmony_ci 9370b324cSopenharmony_ci#include "../Common/StringConvert.h" 10370b324cSopenharmony_ci 11370b324cSopenharmony_ci#include "Clipboard.h" 12370b324cSopenharmony_ci#include "Defs.h" 13370b324cSopenharmony_ci#include "MemoryGlobal.h" 14370b324cSopenharmony_ci#include "Shell.h" 15370b324cSopenharmony_ci 16370b324cSopenharmony_cinamespace NWindows { 17370b324cSopenharmony_ci 18370b324cSopenharmony_cibool CClipboard::Open(HWND wndNewOwner) throw() 19370b324cSopenharmony_ci{ 20370b324cSopenharmony_ci m_Open = BOOLToBool(::OpenClipboard(wndNewOwner)); 21370b324cSopenharmony_ci return m_Open; 22370b324cSopenharmony_ci} 23370b324cSopenharmony_ci 24370b324cSopenharmony_cibool CClipboard::Close() throw() 25370b324cSopenharmony_ci{ 26370b324cSopenharmony_ci if (!m_Open) 27370b324cSopenharmony_ci return true; 28370b324cSopenharmony_ci m_Open = !BOOLToBool(CloseClipboard()); 29370b324cSopenharmony_ci return !m_Open; 30370b324cSopenharmony_ci} 31370b324cSopenharmony_ci 32370b324cSopenharmony_cibool ClipboardIsFormatAvailableHDROP() 33370b324cSopenharmony_ci{ 34370b324cSopenharmony_ci return BOOLToBool(IsClipboardFormatAvailable(CF_HDROP)); 35370b324cSopenharmony_ci} 36370b324cSopenharmony_ci 37370b324cSopenharmony_ci/* 38370b324cSopenharmony_cibool ClipboardGetTextString(AString &s) 39370b324cSopenharmony_ci{ 40370b324cSopenharmony_ci s.Empty(); 41370b324cSopenharmony_ci if (!IsClipboardFormatAvailable(CF_TEXT)) 42370b324cSopenharmony_ci return false; 43370b324cSopenharmony_ci CClipboard clipboard; 44370b324cSopenharmony_ci 45370b324cSopenharmony_ci if (!clipboard.Open(NULL)) 46370b324cSopenharmony_ci return false; 47370b324cSopenharmony_ci 48370b324cSopenharmony_ci HGLOBAL h = ::GetClipboardData(CF_TEXT); 49370b324cSopenharmony_ci if (h != NULL) 50370b324cSopenharmony_ci { 51370b324cSopenharmony_ci NMemory::CGlobalLock globalLock(h); 52370b324cSopenharmony_ci const char *p = (const char *)globalLock.GetPointer(); 53370b324cSopenharmony_ci if (p != NULL) 54370b324cSopenharmony_ci { 55370b324cSopenharmony_ci s = p; 56370b324cSopenharmony_ci return true; 57370b324cSopenharmony_ci } 58370b324cSopenharmony_ci } 59370b324cSopenharmony_ci return false; 60370b324cSopenharmony_ci} 61370b324cSopenharmony_ci*/ 62370b324cSopenharmony_ci 63370b324cSopenharmony_ci/* 64370b324cSopenharmony_cibool ClipboardGetFileNames(UStringVector &names) 65370b324cSopenharmony_ci{ 66370b324cSopenharmony_ci names.Clear(); 67370b324cSopenharmony_ci if (!IsClipboardFormatAvailable(CF_HDROP)) 68370b324cSopenharmony_ci return false; 69370b324cSopenharmony_ci CClipboard clipboard; 70370b324cSopenharmony_ci 71370b324cSopenharmony_ci if (!clipboard.Open(NULL)) 72370b324cSopenharmony_ci return false; 73370b324cSopenharmony_ci 74370b324cSopenharmony_ci HGLOBAL h = ::GetClipboardData(CF_HDROP); 75370b324cSopenharmony_ci if (h != NULL) 76370b324cSopenharmony_ci { 77370b324cSopenharmony_ci NMemory::CGlobalLock globalLock(h); 78370b324cSopenharmony_ci void *p = (void *)globalLock.GetPointer(); 79370b324cSopenharmony_ci if (p != NULL) 80370b324cSopenharmony_ci { 81370b324cSopenharmony_ci NShell::CDrop drop(false); 82370b324cSopenharmony_ci drop.Attach((HDROP)p); 83370b324cSopenharmony_ci drop.QueryFileNames(names); 84370b324cSopenharmony_ci return true; 85370b324cSopenharmony_ci } 86370b324cSopenharmony_ci } 87370b324cSopenharmony_ci return false; 88370b324cSopenharmony_ci} 89370b324cSopenharmony_ci*/ 90370b324cSopenharmony_ci 91370b324cSopenharmony_cistatic bool ClipboardSetData(UINT uFormat, const void *data, size_t size) throw() 92370b324cSopenharmony_ci{ 93370b324cSopenharmony_ci NMemory::CGlobal global; 94370b324cSopenharmony_ci if (!global.Alloc(GMEM_DDESHARE | GMEM_MOVEABLE, size)) 95370b324cSopenharmony_ci return false; 96370b324cSopenharmony_ci { 97370b324cSopenharmony_ci NMemory::CGlobalLock globalLock(global); 98370b324cSopenharmony_ci LPVOID p = globalLock.GetPointer(); 99370b324cSopenharmony_ci if (!p) 100370b324cSopenharmony_ci return false; 101370b324cSopenharmony_ci memcpy(p, data, size); 102370b324cSopenharmony_ci } 103370b324cSopenharmony_ci if (::SetClipboardData(uFormat, global) == NULL) 104370b324cSopenharmony_ci return false; 105370b324cSopenharmony_ci global.Detach(); 106370b324cSopenharmony_ci return true; 107370b324cSopenharmony_ci} 108370b324cSopenharmony_ci 109370b324cSopenharmony_cibool ClipboardSetText(HWND owner, const UString &s) 110370b324cSopenharmony_ci{ 111370b324cSopenharmony_ci CClipboard clipboard; 112370b324cSopenharmony_ci if (!clipboard.Open(owner)) 113370b324cSopenharmony_ci return false; 114370b324cSopenharmony_ci if (!::EmptyClipboard()) 115370b324cSopenharmony_ci return false; 116370b324cSopenharmony_ci 117370b324cSopenharmony_ci bool res; 118370b324cSopenharmony_ci res = ClipboardSetData(CF_UNICODETEXT, (const wchar_t *)s, (s.Len() + 1) * sizeof(wchar_t)); 119370b324cSopenharmony_ci #ifndef _UNICODE 120370b324cSopenharmony_ci AString a (UnicodeStringToMultiByte(s, CP_ACP)); 121370b324cSopenharmony_ci if (ClipboardSetData(CF_TEXT, (const char *)a, (a.Len() + 1) * sizeof(char))) 122370b324cSopenharmony_ci res = true; 123370b324cSopenharmony_ci a = UnicodeStringToMultiByte(s, CP_OEMCP); 124370b324cSopenharmony_ci if (ClipboardSetData(CF_OEMTEXT, (const char *)a, (a.Len() + 1) * sizeof(char))) 125370b324cSopenharmony_ci res = true; 126370b324cSopenharmony_ci #endif 127370b324cSopenharmony_ci return res; 128370b324cSopenharmony_ci} 129370b324cSopenharmony_ci 130370b324cSopenharmony_ci} 131