Моя цель — сделать так, чтобы у приложения был собственный буфер обмена — пользователи приложения не должны иметь возможности копировать (CTRL+C/CTRL+X / Щелкните правой кнопкой мыши -> Копировать/Вырезать) содержимое и вставьте его за пределы приложения.
Мой первый подход заключался в вызове AddClipboardFormatListener в главном окне. Однако окно получало копирование/вставку извне приложения (например, когда пользователь нажимал CTRL+C в другом приложении).
В конце концов, я решил это, создав подкласс каждого элемента управления в app и обработку событий WM_COPY, WM_PASTE и WM_CLIPBOARDUPDATE следующим образом:
Код: Выделить всё
char clipboard_data[1024];
LRESULT (*g_OldWndProc)(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK NewWndProc( HWND hwnd, UINT mesg, WPARAM wParam, LPARAM lParam )
{
switch( mesg )
{
case WM_COPY:
AddClipboardFormatListener(hwnd);
break;
case WM_CLIPBOARDUPDATE:
if(IsClipboardFormatAvailable(CF_TEXT) ||
IsClipboardFormatAvailable(CF_UNICODETEXT))
{
if (!OpenClipboard(nullptr)) break;
HGLOBAL hglb = GetClipboardData(CF_TEXT);
if (hglb != nullptr)
{
char* lptstr = (char*) GlobalLock(hglb);
if (lptstr != nullptr)
{
strcpy(clipboard_data, lptstr);
}
GlobalUnlock(hglb);
}
EmptyClipboard();
CloseClipboard();
RemoveClipboardFormatListener(hwnd);
}
break;
case WM_PASTE:
{
int nStrLen = strlen(clipboard_data);
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, nStrLen + 1);
char* pCopyTo = (char*) GlobalLock(hMem);
memcpy(pCopyTo, clipboard_data, nStrLen + 1);
GlobalUnlock(hMem);
if(!OpenClipboard(hwnd)) break;
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();
auto status = CallWindowProc(g_OldWndProc, hwnd, mesg, wParam, lParam);
if(!OpenClipboard(nullptr)) break;
EmptyClipboard();
CloseClipboard();
if(hMem) GlobalFree(hMem);
return status;
}
}
return CallWindowProc(g_OldWndProc, hwnd, mesg, wParam, lParam);
}
Код: Выделить всё
g_OldWndProc = (decltype(g_OldWndProc)) SetWindowLongPtr( hSomeControl, GWLP_WNDPROC,( LONG_PTR ) NewWndProc );
Таким образом , я могу обрабатывать действия копирования и вставки элементов управления пользовательского интерфейса, которые я создал.
Однако немного утомительно создавать подклассы для каждого компонента пользовательского интерфейса, как это.
Есть ли способ сделать это в общих чертах?
Подробнее здесь: https://stackoverflow.com/questions/793 ... indows-api
Мобильная версия