MyGUI  3.0.1
MyGUI_ClipboardManager.cpp
Go to the documentation of this file.
1 
7 /*
8  This file is part of MyGUI.
9 
10  MyGUI is free software: you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  MyGUI is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22 */
23 #include "MyGUI_Precompiled.h"
24 #include "MyGUI_ClipboardManager.h"
25 #include "MyGUI_Gui.h"
26 #include "MyGUI_TextIterator.h"
27 
28 #if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
29 #include <windows.h>
30 #endif
31 
32 namespace MyGUI
33 {
34 
35 #if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
36 
37  HWND g_hWnd = NULL;
38 
39  BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
40  {
41  DWORD dwProcessID = 0;
42  ::GetWindowThreadProcessId(hWnd, &dwProcessID);
43 
44  if (dwProcessID != (DWORD)lParam)
45  return TRUE;
46 
47  if (::GetParent(hWnd) == NULL)
48  {
49  // Нашли. hWnd - то что надо
50  g_hWnd = hWnd;
51  return FALSE;
52  }
53 
54  return TRUE;
55  }
56 
57  BOOL CALLBACK EnumChildWindowProc(HWND hWnd, LPARAM lParam)
58  {
59  DWORD dwProcessID = 0;
60  ::GetWindowThreadProcessId(hWnd, &dwProcessID);
61 
62  if (dwProcessID != ::GetCurrentProcessId())
63  return TRUE;
64 
65  if (::GetWindowLong(hWnd, GWL_HINSTANCE) == lParam)
66  {
67  // Нашли. hWnd - то что надо
68  g_hWnd = hWnd;
69  return FALSE;
70  }
71 
72  return TRUE;
73  }
74 
75 #endif
76 
77  MYGUI_INSTANCE_IMPLEMENT( ClipboardManager )
78 
79  void ClipboardManager::initialise()
80  {
81  MYGUI_ASSERT(!mIsInitialise, INSTANCE_TYPE_NAME << " initialised twice");
82  MYGUI_LOG(Info, "* Initialise: " << INSTANCE_TYPE_NAME);
83 
84 #if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
85  // берем имя нашего экзешника
86  char buf[MAX_PATH];
87  ::GetModuleFileName(0, (LPCH)&buf, MAX_PATH);
88  // берем инстанс нашего модуля
89  HINSTANCE instance = ::GetModuleHandle(buf);
90 
91  ::EnumChildWindows(::GetDesktopWindow(), (WNDENUMPROC)EnumWindowProc, (LPARAM)instance);
92  mHwnd = (size_t)g_hWnd;
93 
94 #endif
95 
96  MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully initialized");
97  mIsInitialise = true;
98  }
99 
101  {
102  if (!mIsInitialise) return;
103  MYGUI_LOG(Info, "* Shutdown: " << INSTANCE_TYPE_NAME);
104 
105  MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully shutdown");
106  mIsInitialise = false;
107  }
108 
109  void ClipboardManager::setClipboardData(const std::string& _type, const std::string& _data)
110  {
111  mClipboardData[_type] = _data;
112 
113 #if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
114  if (_type == "Text")
115  {
116  mPutTextInClipboard = TextIterator::getOnlyText(UString(_data));
117  size_t size = (mPutTextInClipboard.size() + 1) * 2;
118  //открываем буфер обмена
119  if (::OpenClipboard((HWND)mHwnd))
120  {
121  ::EmptyClipboard(); //очищаем буфер
122  HGLOBAL hgBuffer = ::GlobalAlloc(GMEM_DDESHARE, size);//выделяем память
123  wchar_t * chBuffer = NULL;
124  if ((hgBuffer) && (chBuffer = (wchar_t*)GlobalLock(hgBuffer)))
125  {
126  ::memcpy(chBuffer, mPutTextInClipboard.asWStr_c_str(), size);
127  ::GlobalUnlock(hgBuffer);//разблокируем память
128  ::SetClipboardData(CF_UNICODETEXT, hgBuffer);//помещаем текст в буфер обмена
129  }
130  ::CloseClipboard(); //закрываем буфер обмена
131  }
132  }
133 #endif
134  }
135 
136  void ClipboardManager::clearClipboardData(const std::string& _type)
137  {
138  MapString::iterator iter = mClipboardData.find(_type);
139  if (iter != mClipboardData.end()) mClipboardData.erase(iter);
140  }
141 
142  std::string ClipboardManager::getClipboardData(const std::string& _type)
143  {
144 #if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
145  if (_type == "Text")
146  {
147  UString buff;
148  //открываем буфер обмена
149  if ( ::OpenClipboard((HWND)mHwnd) )
150  {
151  HANDLE hData = ::GetClipboardData(CF_UNICODETEXT);//извлекаем текст из буфера обмена
152  wchar_t * chBuffer = NULL;
153  if ((hData) && (chBuffer = (wchar_t*)::GlobalLock(hData)))
154  {
155  buff = chBuffer;
156  ::GlobalUnlock(hData);//разблокируем память
157  }
158  ::CloseClipboard();//закрываем буфер обмена
159  }
160  // если в буфере не то что мы ложили, то берем из буфера
161  if (mPutTextInClipboard != buff)
162  {
163  // вставляем теги, если нуно
164  const UString& text = TextIterator::toTagsString(buff);
165  return text.asUTF8();
166  }
167 
168  MapString::iterator iter = mClipboardData.find(_type);
169  if (iter != mClipboardData.end()) return (*iter).second;
170  return "";
171  }
172 #endif
173 
174  MapString::iterator iter = mClipboardData.find(_type);
175  if (iter != mClipboardData.end()) return (*iter).second;
176  return "";
177  }
178 
179 } // namespace MyGUI