在應用程式中監視剪貼簿的變化和內容

2021-04-12 18:36:26 字數 3028 閱讀 9520

剪貼簿是windows中系統級的堆空間,系統中任何乙個應用程式對剪貼簿都有訪問權,可以通過剪貼簿訊息和使用剪貼簿api來讀寫剪貼簿內容。因此使用剪貼簿不僅可以在同乙個應用程式內互動資料,也可以在不通應用程式之間互動資料。尤其是在不通應用程式之間互動時,應用程式往往需要對剪貼簿內容的變化做到實時感知,即應用程式要能監視剪貼簿內容的變化。

windows應用是訊息驅動的,同理當剪貼簿內容發生變化時,windows提供了剪貼簿變化訊息,因此要實時感知剪貼簿內容的變化,關鍵是應用程式要能響應和處理windows觸發的剪貼簿變化訊息。

第一步,要將視窗註冊為clipboard viewer

需要首先解釋兩個概念:clipboard viewer和clipboard viewer chain。

clipboard viewer是乙個需要取得並顯示剪貼簿內容的視窗,通過clipboard viewer這個機制,應用程式可以在不影響剪貼簿內容的情況下獲取剪貼簿的變化訊息。clipboard viewer可以顯示系統定義的標準格式的剪貼簿內容,也可以顯示應用自定義的私有資料格式的內容。通過呼叫函式setclipboardviewer將視窗註冊為clipboard viewer。

clipboard viewer chain是儲存clipboard viewer視窗以及他們之間的前後向關係的乙個windows系統鍊錶,當乙個視窗註冊為clipboard viewer後,他會被加入clipboard viewer chain,並得到鍊錶中下乙個viewer視窗的控制代碼,該控制代碼必須儲存以在響應訊息時使用,該控制代碼的作用在下文說明。windows正是通過clipboard viewer chain保證了所有clipboard viewer能接收和響應剪貼簿變化訊息。

第二步,響應剪貼簿變化訊息,判斷和取出剪貼簿內容

在訊息響應裡必須正確處理兩個訊息:wm_drawclipboard和wm_changecbchain。

當剪貼簿內容發生變化時,windows將觸發wm_drawclipboard訊息,並將該訊息送給clipboard viewer chain的第乙個視窗。每乙個clipboard viewer視窗,包括第乙個視窗在響應和處理該訊息後,必須根據其儲存的鍊錶中的下乙個視窗的控制代碼將該訊息傳送給下乙個clipboard viewer視窗。視窗可以在該訊息中取出剪貼簿內容,並判斷是否是該視窗增在監視的內容,如果是就進行相應的處理。

當某個clipboard viewer視窗登出時,系統將觸發wm_changecbchain,並將該訊息送給clipboard viewer chain的第乙個視窗。每乙個視窗必須處理該訊息。

第三步,將視窗從clipboard viewer chain中登出

當視窗不再需要監視剪貼簿變化訊息,或視窗要關閉時,必須呼叫changeclipboardchain函式將視窗從clipboard viewer chain中登出。登出後系統會觸發wm_changecbchain訊息,同wm_drawclipboard訊息一樣,該訊息會給傳送給clipboard viewer chain的第乙個視窗處理。下面**示例當視窗被關閉時進行登出。

下面的**片斷給出了監視剪貼簿中是否拷貝了url位址的例子,如果剪貼簿中的內容是url位址,則將其顯示在視窗介面上。為使示例**具有一般性,下面給出了一般windows程式**和基於mfc的代**。其他語言要實現該功能可以參考windows程式**。兩個demo的完成**請見附件。

windows程式示例**

lresult callback wndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam) ;

unsigned int nformat;

switch (message)

break;

case wm_paint:

hdc = beginpaint(hwnd, &ps);

//判斷剪貼簿中的內容是否為url位址,如是則顯示

nformat = getpriorityclipboardformat(anformats,sizeof(anformats));           

if(nformat == cf_text)

globalunlock(hmem);

closeclipboard();

} endpaint(hwnd, &ps);

break;

default:

return defwindowproc(hwnd, message, wparam, lparam); }

return 0; }

mfc程式示例**

首先要對映以下訊息和繼承以下函式

afx_msg void onchangecbchain(hwnd hwndremove, hwnd hwndafter);

afx_msg void ondrawclipboard();

afx_msg void ondestroy();

virtual void oninitialupdate();

void cmonitorurlview::oninitialupdate()

void cmonitorurlview::ondestroy()

//clipboard viewer登出

void cmonitorurlview::onchangecbchain(hwnd hwndremove, hwnd hwndafter)

//剪貼簿內容變化,判斷剪貼簿中的內容是否為url位址,如是則顯示

void cmonitorurlview::ondrawclipboard() ;

unsigned int nformat =

getpriorityclipboardformat(anformats,sizeof(anformats)); 

if(nformat == cf_text)

globalunlock(hmem); }

closeclipboard();

}   }

在應用程式中監視剪貼簿的變化和內容

剪貼簿是 windows中系統級的堆空間,系統中任何乙個應用程式對剪貼簿都有訪問權,可以通過剪貼簿訊息和使用剪貼簿api來讀寫剪貼簿內容。因此使用剪貼簿不僅可以在同乙個應用程式內互動資料,也可以在不通應用程式之間互動資料。尤其是在不通應用程式之間互動時,應用程式往往需要對剪貼簿內容的變化做到實時感知...

VC 監視剪貼簿的變化和內容監視

剪貼簿是windows中系統級的堆空間,系統中任何乙個應用程式對剪貼簿都有訪問權,可以通過剪貼簿訊息和使用剪貼簿api來讀寫剪貼簿內容。因此使用剪貼簿不僅可以在同乙個應用程式內互動資料,也可以在不通應用程式之間互動資料。尤其是在不通應用程式之間互動時,應用程式往往需要對剪貼簿內容的變化做到實時感知,...

在應用程式中啟動其他程式的方法

1 uint winexec lpcstr lpcmdline,uint ucmdshow eg if winexec cdplayer.exe sw maximize 31 afxmessagebox 執行cd eg winexec winmine.exe sw shownormal winexe...