Pokud programujete pro Windows Vista a novější, pro sledování obsahu schránky můžete využít AddClipboardFormatListener.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-addclipboardformatlistener
Pokud potřebujete podporovat i Windows XP, musíte využít funkci ChangeClipboardChain. Zde musíte být opatrný, abyste nerozbil ostatní aplikace, protože zde v zásadě dochází k vytváření spojového seznamu oken, kterým se má notifikace posílat. Ten samozřejmě nesmíte rozpojit...
Pak budete potřebovat funkce na přístup k obsahu schránky. Ten samý obsah může být uložen ve více různých formátech, takže si můžete vybrat ten nejvhodnější pro vaši aplikaci. Pozor na to, že aplikace si může přidat vlastní formát.
Co se týče vámi navrhované metody monitorování zpráv, pro kterou se obvykle používá termín subclassing, není přísliš vhodná, chcete-li monitorovat všechny aplikace na daném desktopu či window station. Pro tento účel se lépe hodí tzv. Háky Windows (mrkněte na funkci SetWindowsHookEx). I zde ale musíte být velmi opatrný, abyste nerozbil jiné aplikace. V podstatě totiž systém přimějete, aby do každé vhodné aplikace injektoval vaší DLL knihovnu, která pak bude odposlouchávat (a teoreticky i upravovat) zprávy zasílané jejím oknům. Je třeba opravdu pečlivě číst dokumentaci.
Ďakujem za vyčerpávajúce info. Tie hooky som skúšal ešte na začiatku, hook na wnd proc som mal v exernom DLLku, ale asi som robil niečo zlé lebo mi to nefungovalo.
Medzitým som si, ale na githube našiel príklad pre inšpiráciu -
jednu appku, ktorá pracuje so schránkou (príklad je v C# takže som to musel prepísať do C++).
Tu je kód tej inšpirácie v C#:
https://github.com/chrisnas/DebuggingExtensions/blob/b3c38e5e3d95f1f53ce26bbe1209569716e60714/src/LeakShell/ClipboardListener.cs#L124,L165Keď si zadefinujem:
HWND nextInChain = SetClipboardViewer(hWnd);
tak potom sa mi pri cut + copy akcii v akejkoľvek windows aplikácii triggeruje WM_DRAWCLIPBOARD ktoré zachytávam vo WndProc taktiež tam riešim WM_CHANGECBCHAIN (ako ste spomínali). Po skončení aplikácie zavolám ChangeClipboardChain(hWnd, nextInChain);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CHANGECBCHAIN:
{
if ((HWND)wParam == nextInChain)
{
nextInChain = (HWND)lParam;
}
else if (nextInChain != NULL)
{
SendMessage(nextInChain, message, wParam, lParam);
}
}
break;
case WM_DRAWCLIPBOARD:
{
if (attachedToClipboard && nextInChain != NULL)
{
/*** TU MOŽEM ZACHYTÁVAŤ KOPÍROVANIE ***/
SendMessage(nextInChain, message, wParam, lParam);
}
}
break;
Každopádne AddClipboardFormatListener a RemoveClipboardFormatListener bude na tento účel asi adresnejšie (idem to vyskúšať). Akurát týmto mám vyriešené len CUT a COPY akcie. Ale ako mám zachytiť PASTE?