windows程式設計之剪下板
阿新 • • 發佈:2019-02-06
程序通訊的方式很多,可以通過套接字,管道,記憶體共享,WM_COPYDATA訊息,當然剪下板也是一種方式,並且在以後的環節還可能用得比較多。
使用剪下板的步驟主要是: 開啟剪下板,
傳送端程式碼大概如下:
接收端通過得到WM_PASTE訊息,對該訊息進行處理,可以方便的操作剪下板中的資料: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);
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;