Windows 透過剪貼板檢視器鏈結通知應用程式剪貼板內容變更。應用程式需呼叫 SetClipboardViewer 將自身視窗加入鏈結,並處理 WM_DRAWCLIPBOARD 訊息。結束監視時呼叫 ChangeClipboardChain 移除自身。
class TForm1 : public TForm {
__published:
// ... 元件宣告 ...
private:
void __fastcall ClipboardChanged(TMessage &Msg);
public:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DRAWCLIPBOARD, TMessage, ClipboardChanged)
END_MESSAGE_MAP(TForm)
};
void __fastcall TForm1::ClipboardChanged(TMessage &Msg)
{
POINT MousePos;
GetCursorPos(&MousePos);
PopupMenu4->PopupComponent = Form1;
PopupMenu4->Popup(MousePos.x, MousePos.y); // 剪貼板變更時彈出選單
}
void __fastcall TForm1::ToolButton9Click(TObject *Sender)
{
static HWND hNextViewer;
static bool bWatching = false;
if (bWatching) {
ToolButton9->Down = false;
ChangeClipboardChain(Form1->Handle, hNextViewer); // 移除鏈結
} else {
ToolButton9->Down = true;
Clipboard()->Clear();
Application->Minimize();
hNextViewer = SetClipboardViewer(Form1->Handle); // 加入鏈結,保存下一個視窗控制碼
}
bWatching = !bWatching;
}
SetClipboardViewer 返回鏈結中下一個視窗控制碼,必須保存以便 ChangeClipboardChain 使用。WM_DRAWCLIPBOARD 後,若不處理該訊息,必須傳遞給下一個視窗:SendMessage(hNextViewer, WM_DRAWCLIPBOARD, 0, 0)。本範例為示範彈出選單,省略轉發,實務上應加上轉發以免斷鏈影響其他監視程式。ChangeClipboardChain 移除自身。