Otwórz sobie okno, odpal SetClipboardViewer i reaguj na WM_CHANGECBCHAIN, WM_DRAWCLIPBOARD. Ja to robię mniejwięcej tak:
class CClipboardChain
{
public:
BOOL HandleMessage(HWND, UINT, WPARAM, LPARAM);
HWND m_hwndNext;
};
BOOL CClipboardChain::HandleMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
m_hwndNext = SetClipboardViewer(hwnd);
break;
case WM_CHANGECBCHAIN:
// If the next window is closing, repair the chain
if (wParam == (WPARAM)m_hwndNext)
{
m_hwndNext = (HWND)lParam;
}
else // Otherwise, pass the message to the next link.
{
LRESULT result;
if (m_hwndNext) SendMessageTimeout(m_hwndNext, WM_CHANGECBCHAIN,
wParam, lParam, SMTO_ABORTIFHUNG, 100, &result);
}
break;
case WM_DRAWCLIPBOARD:
if (m_hwndNext) SendMessageTimeout(m_hwndNext, WM_DRAWCLIPBOARD,
wParam, lParam, SMTO_ABORTIFHUNG, 100, &result);
return TRUE;
case WM_DESTROY:
ChangeClipboardChain(hwnd, m_hwndNext);
}
return FALSE;
}
// usage
LRESULT CALLBACK MainMsgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static CClipboardChain Clipboard;
if (Clipboard.HandleMessage(hwnd, uMsg, wParam, lParam))
Toolbar.UpdateButtons();
switch (uMsg)...
}
Clipboard.HandleMessage zwróci TRUE gdy stan schowka się zmieni.
potrzebuje informacji jaka aplikacja skorzystala ze schowka
Niestety tutaj nie ma takiej możliwości, ale zawsze możesz wstawić swój plugin do AppInit_DLLs i przejąć funkcję SetClipboardData z user32.dll.