1 // Windows/Clipboard.cpp
\r
6 #include <winuserm.h>
\r
9 #include "Windows/Clipboard.h"
\r
10 #include "Windows/Defs.h"
\r
11 #include "Windows/Memory.h"
\r
12 #include "Windows/Shell.h"
\r
13 #include "Windows/Memory.h"
\r
15 #include "Common/StringConvert.h"
\r
17 namespace NWindows {
\r
19 bool CClipboard::Open(HWND wndNewOwner)
\r
21 m_Open = BOOLToBool(::OpenClipboard(wndNewOwner));
\r
25 CClipboard::~CClipboard()
\r
30 bool CClipboard::Close()
\r
34 m_Open = !BOOLToBool(CloseClipboard());
\r
38 bool ClipboardIsFormatAvailableHDROP()
\r
40 return BOOLToBool(IsClipboardFormatAvailable(CF_HDROP));
\r
44 bool ClipboardGetTextString(AString &s)
\r
47 if (!IsClipboardFormatAvailable(CF_TEXT))
\r
49 CClipboard clipboard;
\r
51 if (!clipboard.Open(NULL))
\r
54 HGLOBAL h = ::GetClipboardData(CF_TEXT);
\r
57 NMemory::CGlobalLock globalLock(h);
\r
58 const char *p = (const char *)globalLock.GetPointer();
\r
70 bool ClipboardGetFileNames(UStringVector &names)
\r
73 if (!IsClipboardFormatAvailable(CF_HDROP))
\r
75 CClipboard clipboard;
\r
77 if (!clipboard.Open(NULL))
\r
80 HGLOBAL h = ::GetClipboardData(CF_HDROP);
\r
83 NMemory::CGlobalLock globalLock(h);
\r
84 void *p = (void *)globalLock.GetPointer();
\r
87 NShell::CDrop drop(false);
\r
88 drop.Attach((HDROP)p);
\r
89 drop.QueryFileNames(names);
\r
97 static bool ClipboardSetData(UINT uFormat, const void *data, size_t size)
\r
99 NMemory::CGlobal global;
\r
100 if (!global.Alloc(GMEM_DDESHARE | GMEM_MOVEABLE, size))
\r
103 NMemory::CGlobalLock globalLock(global);
\r
104 LPVOID p = globalLock.GetPointer();
\r
107 memcpy(p, data, size);
\r
109 if (::SetClipboardData(uFormat, global) == NULL)
\r
115 bool ClipboardSetText(HWND owner, const UString &s)
\r
117 CClipboard clipboard;
\r
118 if (!clipboard.Open(owner))
\r
120 if (!::EmptyClipboard())
\r
124 res = ClipboardSetData(CF_UNICODETEXT, (const wchar_t *)s, (s.Length() + 1) * sizeof(wchar_t));
\r
127 a = UnicodeStringToMultiByte(s, CP_ACP);
\r
128 res |= ClipboardSetData(CF_TEXT, (const char *)a, (a.Length() + 1) * sizeof(char));
\r
129 a = UnicodeStringToMultiByte(s, CP_OEMCP);
\r
130 res |= ClipboardSetData(CF_OEMTEXT, (const char *)a, (a.Length() + 1) * sizeof(char));
\r