1. 程式人生 > >windows程式設計之剪下板

windows程式設計之剪下板

程序通訊的方式很多,可以通過套接字,管道,記憶體共享,WM_COPYDATA訊息,當然剪下板也是一種方式,並且在以後的環節還可能用得比較多。

使用剪下板的步驟主要是: 開啟剪下板,

傳送端程式碼大概如下:

HWND hEdit = GetDlgItem(hwnd, IDC_EDIT_INPUT);
TCHAR szEdit[100] = { 0 };
GetWindowText(hEdit, szEdit, 99);//得到編輯框中的資料
if (!OpenClipboard(hwnd))//如果開啟失敗則返回
{
	return;
}
EmptyClipboard();//清空剪下板資料
HGLOBAL hglobal= GlobalAlloc(GMEM_FIXED, 100);//分配一塊固定大小的記憶體
TCHAR *buff = (TCHAR *)hglobal;
GlobalLock(hglobal);//鎖定該區域記憶體
memcpy(buff, szEdit, 99);//將值拷貝過去
SetClipboardData(CF_TEXT, hglobal);//設定資料格式
GlobalUnlock(hglobal);//解鎖該區域
CloseClipboard();//關閉剪下板,這裡很重要,如果這裡忘記了關閉,其他程序則無法使用剪下板,不能得到剪下板中的資料。
HWND hfind = FindWindow(NULL, L"OUTPUT");
//再次提醒,傳送之前一定要先關閉剪下板。
SendMessage(hfind, WM_PASTE, 0, 0);
	
接收端通過得到WM_PASTE訊息,對該訊息進行處理,可以方便的操作剪下板中的資料:
case WM_PASTE:
	{
		if (!OpenClipboard(GetDlgItem(hWnd,IDC_STATIC_OUTPUT)))
		{
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		HANDLE hClipData = GetClipboardData(CF_TEXT);

		TCHAR *buff =(TCHAR *) GlobalLock(hClipData);
		SetWindowText(GetDlgItem(hWnd, IDC_STATIC_OUTPUT), buff);
		CloseClipboard();
	}
	break;


接收端也可以是使用Edit,來追加一段資料:
case WM_PASTE:
		{//貼上訊息,把剪下板裡面的資料拿出來,顯示在文字框裡面

			//只接收文字訊息
			if (!IsClipboardFormatAvailable(CF_TEXT))
				break;

			//開啟剪下板
			if (!OpenClipboard(g_hMainWnd))
				break;

			//獲取剪下板資料
			HANDLE hClipboard = GetClipboardData(CF_TEXT);
			TCHAR* szBuffer = (TCHAR*)GlobalLock(hClipboard);
			if (szBuffer != NULL)
			{
				//把文字資料顯示在文字框裡面
				HWND hEdit = GetDlgItem(g_hMainWnd, IDC_EDIT_OUTPUT);

				//往文本里面插入資料
				//1)選擇一段空字元
				SendMessage(hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM)-1);
				//2)把一段選擇的字元替換掉
				SendMessage(hEdit, EM_REPLACESEL, FALSE, (LPARAM)szBuffer);

				//換行
				SendMessage(hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM)-1);
				SendMessage(hEdit, EM_REPLACESEL, FALSE, (LPARAM)L"\r\n");

				//解鎖
				GlobalUnlock(hClipboard);
			}
			CloseClipboard();
		}
		break;