برای این کار برنامه شما باید یک Clipboard Viewer شود.
با استفاده از SetClipboardViewer پنجره کنونی را به Viewer تبدیل می کنید (در پیام WM_CREATE در هنگام شروع برنامه یا همان OnCreate در MFC) و پنجره بعد از آن می تواند پیام WM_DRAWCLIPBOARD را دریافت کند، این پیام وقتی ارسال می شود که اطلاعاتی در Clipboard وارد می شود و شما می توانید در آن با توجه به نوعی که واردش می شود آن را پردازش کنید (text باشد یا فایل یا ...).
WM_CHANGECBCHAIN نیز باید با SendMessage تنظیم شود تا اگر پنجره دیگری خودش را از حالت Clipboard Viewer خارج کرد آن را حذف کنیم. (از پارامتر های این پیام استفاده می کنیم).
// OnCreate
HWND hwndNextViewer;
hwndNextViewer = SetClipboardViewer () ;
سپس در پیام WM_DRAWCLIPBOARD (همان OnDrawClipboard در MFC) مثلا به این شکل:
TCHAR fileName[256];
HDROP hdrop;
//--------------
OpenClipboard (hwnd) ;
if (hwndNextViewer)
::SendMessage (hwndNextViewer, WM_CHANGECBCHAIN, 0, 0) ; // It is necessary
hdrop = (HDROP) ::GetClipboardData (CF_HDROP) ;
::DragQueryFile(hdrop,0 ,fileName, sizeof(fileName)/2);
// use fileName here, for example: fileName = C:\myfile.dat
CloseClipboard () ;
با DragQueryFile و فلگ CF_HDROP برای کپی کردن فایل ها استفاده می کنیم و fileName مسیر فایل را می دهد.
مثلا وقتی فایل همان مورد نظر بود می توانید با EmptyClipboard آن را خالی کنید.
برای نوشته ها باید از CF_TEXT استفاده کنید. و ...
برای پیام WM_CHANGECBCHAIN هم به این شکل(همان OnChangeCbChain):
if ((HWND) hWndRemove == hwndNextViewer)
hwndNextViewer = (HWND) hWndAfter ;
else if (hwndNextViewer)
::SendMessage (hwndNextViewer, WM_CHANGECBCHAIN, hWndRemove, hWndAfter) ;
- در هنگام بستن برنامه هم باید ChangeClipboardChain را فراخوانی کنید.