Я пишу dll с глобальными крючками. Одной из задач является просмотр буфера обмена и удаление всех данных из него, когда кто-то выполняет операцию копирования. Вот моя функция обратного вызова для окна:Мониторинг буфера обмена
string test("my data");
LRESULT CALLBACK WndHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_CREATE:
nextClipboardViewer = SetClipboardViewer(windowHandler);
MessageBeep(MB_ICONINFORMATION);
break;
case WM_CHANGECBCHAIN:
if((HWND) wParam == nextClipboardViewer)
nextClipboardViewer == (HWND) lParam;
else if(nextClipboardViewer != NULL)
SendMessage(nextClipboardViewer, msg, wParam, lParam);
break;
case WM_DRAWCLIPBOARD:
if(OpenClipboard(windowHandler)) {
EmptyClipboard();
HGLOBAL hClipboardData;
hClipboardData = GlobalAlloc(GMEM_MOVEABLE, test.size() + 1);
char * pchData;
pchData = (char*)GlobalLock(hClipboardData);
memcpy(pchData, test.c_str(), test.size() + 1);
GlobalUnlock(hClipboardData);
SetClipboardData(CF_TEXT, hClipboardData);
CloseClipboard();
}
SendMessage(nextClipboardViewer, msg, wParam, lParam);
break;
case WM_DESTROY:
ChangeClipboardChain(windowHandler, nextClipboardViewer);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
break;
}
return 0;
}
Я просто пытаюсь заменить информацию в буфере обмена, но этот код не работает.
Обновлено: Теперь я использую невидимое окно и SetClipboardViewer для мониторинга изменений. Но данные в буфере обмена не меняются.
Даже если это может быть сделано, чтобы работать, все, что вы ловушка где сообщение 'WM_COPY' используется для размещения данных в буфере обмена - нет гарантии, что это будет. Создание окна и использование 'SetClipboardViewer' или' AddClipboardFormatListener' - гораздо лучшее решение. –
Нет смысла опустошать буфер обмена * до * приложение копирует данные на него. Неправильный крючок, используйте WH_CALLWNDPROCRET. И вы действительно * * хотите использовать SetClipboardViewer. Если у вас нет HWND, просто создайте его, он не должен быть видимым. Удостоверьтесь, что ваш деинсталлятор безупречен, он получит хорошую тренировку. –