c++獲取剪下板的內容
剪貼簿內建在windows中,並且使用系統的內部資源RAM,或虛擬記憶體來臨時儲存剪下和複製的資訊,可以存放的資訊種類是多種多樣的。剪下或複製時儲存在剪貼簿上的資訊,只有再剪貼或複製另外的資訊
,或停電、或退出windows,或有意地清除時,才可能更新或清除其內容,即剪貼或複製一次,就可以貼上多次。
下面介紹在C++中怎麼操作剪貼簿,主要是寫入資料和獲取資料,對剪貼簿的操作可以看做是一種程序間通訊的方式
1、在VC++(6.0~9.0)新建一個基於對話方塊的MFC的專案 ClipboardTest
2、 新增兩個編輯控制元件(IDC_EDIT_SEND 和 IDC_EDIT_RECV)和兩個按鈕(IDC_BTN_SEND 和 IDC_BTN_RECV)
3、為IDC_BTN_SEND 新增向剪貼簿寫入資料的程式碼
- if (OpenClipboard())//開啟剪貼簿
- {
- CString str;
- HANDLE hClip;
- char* pBuf;
- EmptyClipboard();//清空剪貼簿
- GetDlgItemText(IDC_EDIT_SEND,str);//獲取IDC_EDIT_SEND中的資料
- //寫入資料
- hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);
-
pBuf=(char*)GlobalLock(hClip);
- strcpy(pBuf,str);
- GlobalUnlock(hClip);//解鎖
- SetClipboardData(CF_TEXT,hClip);//設定格式
- //關閉剪貼簿
- CloseClipboard();
- }
4、為IDC_BTN_RECV 新增讀取剪貼簿資料的程式碼
- if (OpenClipboard())//開啟剪貼簿
- {
- if (IsClipboardFormatAvailable(CF_TEXT))//判斷格式是否是我們所需要
- {
- HANDLE hClip;
- char* pBuf;
- //讀取資料
-
hClip=GetClipboardData(CF_TEXT);
- pBuf=(char*)GlobalLock(hClip);
- GlobalUnlock(hClip);
- SetDlgItemText(IDC_EDIT_RECV,pBuf);//講資料顯示在IDC_EDIT_RECV中
- CloseClipboard();
- }
- }
粘貼出現中文亂碼的現象
方法一:會這樣的原因是當複製到剪貼簿的時候那個程式使用的不是中文輸入法,那麼複製的時候就會以英文(一般情況下)編碼,再複製回來的時候,內碼已經變了,自然成了亂碼。UE能正確顯示是因為它自動相容多種中文內碼。解決方式如下:
1. 你可以把中文輸入法設定為預設的輸入法,再執行你的程式碼,肯定不會亂碼的,但這種方法太笨了,不可能要求客戶這樣的嘛,對不對?所以要看方法2,這個方法僅作為測試之用,測試成功。
2. 根據上面的情況,可以只要是中文輸入法環境下複製中文就沒有問題,那麼我們可以呼叫API把輸入法選擇為中文輸入法(任一皆可,拼音五筆都沒有問題)。複製之後再用API設定為原來的輸入法。Copy到某一程式的時候,那個程式可以是任意輸入法的。這兩三個API為IME開頭的什麼keyboardlayout的函式,你google一下,找到這樣的函式名再去MSDN看看用法,很快就解決了。
方法二:
編碼問題,將檔案以ANSI編碼儲存就不會亂碼了,C++ 11加入了編碼轉換,可以直接以UTF8/UTF16編碼處理字串,使用寬字串std::wstring
#include <locale>
#include <codecvt>
//...
const std::locale empty_locale = std::locale::empty();
typedef std::codecvt_utf8<wchar_t> converter_type; //std::codecvt_utf16
const converter_type* converter = new converter_type;
const std::locale utf8_locale = std::locale(empty_locale, converter);
std::wifstream fin(L"in.txt"); //input
fin.imbue(utf8_locale);
std::wstring text;
fin >> text;
std::wfstream fout;
fout.imbue(utf8_locale);
fout.open(L"out.txt", std::ios::out); //output
fout << text;
方法三:
sdf