Windows — Как отслеживать изменения буфера обмена в фоновом режиме с помощью переполнения стека

Мне нужно обработать содержимое буфера обмена в фоновом приложении.

Как я могу это сделать?

Мне нужно событие, которое будет вызываться каждый раз, когда меняется буфер обмена. Неважно, из какого приложения копируется.

Я знаю функцию для чтения и записи, такую ​​как GetClipboardData() а также SetClipboardData(),

Есть идеи, как это сделать в C ++?

Заранее спасибо!

3

Решение

Начиная с 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. Новые программы должны использовать слушателей формата буфера обмена или порядковый номер буфера обмена.

4

Другие решения

Взгляни на Мониторинг содержимого буфера обмена:

Окно просмотра буфера обмена отображает текущее содержимое буфера обмена и получает
сообщения при изменении содержимого буфера обмена. Создать буфер обмена
окно просмотра, ваше приложение должно сделать следующее:

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;
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector