剪貼板通信實例
本人節選自《21天學通VC++》一書
爲了更好地理解以上講述的函數,下面給出一個實例來詳細地介紹如何使用剪貼板來實現進程間的通信。
【範例17-3】剪貼板實現進程通信。
新建一個MFC的基於對話框的應用程序。單擊【File】|【New】菜單項,打開新建對話框。選擇建立【MFC AppWizard[exe]】工程,爲工程命名爲“進程通信”。在AppWizard的第一步中選擇【Dialog based】。其他步驟按照默認設置,單擊【Finish】按鈕完成創建。
設計對話框。將對話框上的原有控件全部刪除。添加兩個文本框,一個讓用戶輸入數據,ID號爲IDC_EDIT_SEND;另一個是複製數據後用來顯示數據的,ID號爲IDC_EDIT_RECV。再添加兩個按鈕控件,一個名爲“複製”,ID號爲IDC_BTN_COPY;另一個名爲“粘貼”,ID號設爲IDC_BTN_PASTE。對話框設計結果。
添加消息響應函數。雙擊對話框上的兩個按鈕,分別將兩個按鈕的OnBtnCopy和OnBtnPaste函數添加到類CMyDlg中。
提示:添加消息響應函數在MFC ClassWizard工具中,選中對應的按鈕控件後,添加其COMMAND消息函數即可。
示例代碼17-3
01 void CMyDlg::OnBtnCopy() //複製按鈕
02 {
03 // TODO: Add your control notification handler code here
04 CString str;
05 //定義字符型變量用來保存用戶輸入的數據
06 GetDlgItemText(IDC_EDIT_SEND,str);
07 HGLOBAL hClip;
08 //定義一個HGLOBAL句柄變量用來指向分配的內存塊
09 if (OpenClipboard())
10 {
11 EmptyClipboard(); //將剪貼板內容清空
12 hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);
13 //在堆上分配可移動的內存塊,程序返回一個內存句柄
14 char * buff; //定義指向字符型的指針變量
15 buff=(char*)GlobalLock(hClip);
16 //對分配的內存塊進行加鎖,將內存塊句柄轉化成一個指針,並將相應的引用計數器加1
17 strcpy(buff,str);
18 //將用戶輸入的數據複製到指針變量中,實際上就是複製到分配的內存塊中
19 GlobalUnlock(hClip);
20 //數據寫入完畢,進行解鎖操作,並將引用計數器數字減1
21 SetClipboardData(CF_TEXT,hClip);
22 //將存放有數據的內存塊放入剪貼板的資源管理中
23 CloseClipboard();
24 //關閉剪貼板,釋放剪貼板資源的佔用權
25 MessageBox("已將數據存入剪貼板");
26 }
27 }
28 void CMyDlg::OnBtnPaste() //粘貼按鈕
29 {
30 // TODO: Add your control notification handler code here
31 CString str;
32 //字符型變量保存由剪貼板複製下來的數據
33 HANDLE hClip;
34 //定義HANDLE句柄型變量用來指向GetClipboardData函數返回的句柄
35 if (OpenClipboard())
36 {
37 hClip=GetClipboardData(CF_TEXT);
38 //從剪貼板中取出一個內存的句柄
39 char* buff;
40 //定義字符型指針變量用來保存內存塊中的數據
41 buff=(char*)GlobalLock(hClip);
42 //對內存塊進行加鎖,將內存句柄值轉化爲一個指針,並將內存塊的引用計數器加一,內存 //中的數據也返回到指針型變量中
43 str=buff;
44 //將數據保存到字符型變量中
45 GlobalUnlock(hClip);
46 //將內存塊的引用計數器減一
47 CloseClipboard();
48 //關閉剪貼板,釋放剪貼板資源的佔用權
49 SetDlgItemText(IDC_EDIT_RECV,str);
50 }
51 }
【運行結果】在Visual C++ 6.0中編譯後無錯誤,使用快捷鍵【Ctrl+F5】運行該工程。在左邊的編輯框中輸入字符串“21天學會Visual C++”。單擊【複製】按鈕,該字符串就存放到剪貼板中了。
說明:上述代碼中用到了剪貼板的操作函數,此外,還應用到了字符串賦值函數strcpy(),用於將輸入字符串複製到內存中。
在上圖中單擊【複製】按鈕後,單擊【粘貼】按鈕。將存儲在剪貼板中的字符串取出並顯示在右邊的編輯框中,如圖17-18所示。
圖17-18 【粘貼】按鈕運行結果
【代碼解析】從以上代碼中可以看出,不管是把內存塊放到剪貼板資源管理中,還是從剪貼板中取出內存塊,都要經過加鎖和解鎖的過程。這是爲了方便句柄型變量和字符型指針變量的轉換,實現數據的寫入和讀取。上述代碼中,【複製】按鈕和【粘貼】按鈕的執行流程如圖17-19和圖17-20所示。
至此,一個通過剪貼板實現進程通信的實例就完成了。事實上,本例中實現的功能不用剪貼板也一樣能夠很簡單的完成。此處只是爲了演示剪貼板的用法。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/broadview2006/archive/2009/01/16/3795912.aspx