Мне нужно обработать содержимое буфера обмена в фоновом приложении.
Как я могу это сделать?
Мне нужно событие, которое будет вызываться каждый раз, когда меняется буфер обмена. Неважно, из какого приложения копируется.
Я знаю функцию для чтения и записи, такую как GetClipboardData()
а также SetClipboardData()
,
Есть идеи, как это сделать в C ++?
Заранее спасибо!
Начиная с Windows Vista, правильным методом является использование слушателей формата буфера обмена:
case WM_CREATE:
// ...
AddClipboardFormatListener(hwnd);
// ...
break;
case WM_DESTROY:
// ...
RemoveClipboardFormatListener(hwnd);
// ...
break;
case WM_CLIPBOARDUPDATE:
// Clipboard content has changed
break;
Увидеть Мониторинг содержимого буфера обмена:
Существует три способа отслеживания изменений в буфере обмена. Самый старый способ — создать окно просмотра буфера обмена. В Windows 2000 добавлена возможность запрашивать порядковый номер буфера обмена и В Windows Vista добавлена поддержка слушателей в формате буфера обмена. Окна просмотра буфера обмена поддерживаются для обратной совместимости с более ранними версиями Windows. Новые программы должны использовать слушателей формата буфера обмена или порядковый номер буфера обмена.
Взгляни на Мониторинг содержимого буфера обмена:
Окно просмотра буфера обмена отображает текущее содержимое буфера обмена и получает
сообщения при изменении содержимого буфера обмена. Создать буфер обмена
окно просмотра, ваше приложение должно сделать следующее:Add the window to the clipboard viewer chain. Process the WM_CHANGECBCHAIN message. Process the WM_DRAWCLIPBOARD message. Remove the window from the clipboard viewer chain before it is destroyed.
Добавление окна в цепочку просмотра буфера обмена:
case WM_CREATE:
// Add the window to the clipboard viewer chain.
hwndNextViewer = SetClipboardViewer(hwnd);
break;
Обработка сообщения WM_CHANGECBCHAIN:
case WM_CHANGECBCHAIN:
// If the next window is closing, repair the chain.
if ((HWND) wParam == hwndNextViewer)
hwndNextViewer = (HWND) lParam;
// Otherwise, pass the message to the next link.
else if (hwndNextViewer != NULL)
SendMessage(hwndNextViewer, uMsg, wParam, lParam);
break;