MyGUI 3.4.3
MyGUI_WindowsClipboardHandler.cpp
Go to the documentation of this file.
1/*
2 * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3 * Distributed under the MIT License
4 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5 */
6
7#include "MyGUI_Precompiled.h"
9#include "MyGUI_Gui.h"
10#include "MyGUI_TextIterator.h"
12
13#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
14
15 #include <windows.h>
16
17namespace MyGUI
18{
19
20 HWND g_hWnd = nullptr;
21
22 BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
23 {
24 DWORD dwProcessID = 0;
25 GetWindowThreadProcessId(hWnd, &dwProcessID);
26
27 if (dwProcessID != (DWORD)lParam)
28 return TRUE;
29
30 if (GetParent(hWnd) == nullptr)
31 {
32 // Нашли. hWnd - то что надо
33 g_hWnd = hWnd;
34 return FALSE;
35 }
36
37 return TRUE;
38 }
39
40 BOOL CALLBACK EnumChildWindowProc(HWND hWnd, LPARAM lParam)
41 {
42 DWORD dwProcessID = 0;
43 GetWindowThreadProcessId(hWnd, &dwProcessID);
44
45 if (dwProcessID != GetCurrentProcessId())
46 return TRUE;
47
48 if (GetWindowLongPtr(hWnd, GWLP_HINSTANCE) == lParam)
49 {
50 // Нашли. hWnd - то что надо
51 g_hWnd = hWnd;
52 return FALSE;
53 }
54
55 return TRUE;
56 }
57
58 WindowsClipboardHandler::WindowsClipboardHandler()
59 {
60 }
61
62 void WindowsClipboardHandler::initialise()
63 {
64 // get executable path
65 char buf[MAX_PATH];
66 GetModuleFileName(0, (LPCH)&buf, MAX_PATH);
67 // get module instance
68 HINSTANCE instance = GetModuleHandle(buf);
69
70 EnumChildWindows(GetDesktopWindow(), (WNDENUMPROC)EnumWindowProc, (LPARAM)instance);
71 mHwnd = (size_t)g_hWnd;
72
74 newDelegate(this, &WindowsClipboardHandler::handleClipboardChanged);
76 newDelegate(this, &WindowsClipboardHandler::handleClipboardRequested);
77 }
78
79 void WindowsClipboardHandler::shutdown()
80 {
82 newDelegate(this, &WindowsClipboardHandler::handleClipboardChanged);
84 newDelegate(this, &WindowsClipboardHandler::handleClipboardRequested);
85 }
86
87 void WindowsClipboardHandler::handleClipboardChanged(std::string_view _type, std::string_view _data)
88 {
89 if (_type == "Text")
90 {
91 mPutTextInClipboard = TextIterator::getOnlyText(UString(_data));
92 size_t size = (mPutTextInClipboard.size() + 1) * 2;
93 //открываем буфер обмена
94 if (OpenClipboard((HWND)mHwnd))
95 {
96 EmptyClipboard(); //очищаем буфер
97 HGLOBAL hgBuffer = GlobalAlloc(GMEM_DDESHARE, size); //выделяем память
98 wchar_t* chBuffer = hgBuffer ? (wchar_t*)GlobalLock(hgBuffer) : nullptr;
99 if (chBuffer)
100 {
101 memcpy(chBuffer, mPutTextInClipboard.asWStr_c_str(), size);
102 GlobalUnlock(hgBuffer); //разблокируем память
103 SetClipboardData(CF_UNICODETEXT, hgBuffer); //помещаем текст в буфер обмена
104 }
105 CloseClipboard(); //закрываем буфер обмена
106 }
107 }
108 }
109
110 void WindowsClipboardHandler::handleClipboardRequested(std::string_view _type, std::string& _data)
111 {
112 if (_type == "Text")
113 {
114 UString buff;
115 //открываем буфер обмена
116 if (OpenClipboard((HWND)mHwnd))
117 {
118 HANDLE hData = GetClipboardData(CF_UNICODETEXT); //извлекаем текст из буфера обмена
119 wchar_t* chBuffer = hData ? (wchar_t*)GlobalLock(hData) : nullptr;
120 if (chBuffer)
121 {
122 buff = chBuffer;
123 GlobalUnlock(hData); //разблокируем память
124 }
125 CloseClipboard(); //закрываем буфер обмена
126 }
127 // если в буфере не то что мы ложили, то берем из буфера
128 if (mPutTextInClipboard != buff)
129 {
130 // вставляем теги, если нуно
131 const UString& text = TextIterator::toTagsString(buff);
132 _data = text.asUTF8();
133 }
134 }
135 }
136
137} // namespace MyGUI
138
139#endif // MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
static ClipboardManager & getInstance()
EventPairConvertStringView< delegates::MultiDelegate< const std::string &, const std::string & >, delegates::MultiDelegate< std::string_view, std::string_view > > eventClipboardChanged
EventPairConvertStringView< delegates::MultiDelegate< const std::string &, std::string & >, delegates::MultiDelegate< std::string_view, std::string & > > eventClipboardRequested
static UString getOnlyText(const UString &_text)
static UString toTagsString(const UString &_text)
BOOL CALLBACK EnumChildWindowProc(HWND hWnd, LPARAM lParam)
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))
BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)