2017年10月24日 星期二

C++ 複製剪貼簿內容並寫入檔案 [寬字元處理方法]

C++ 複製剪貼簿內容並寫入檔案 [寬字元處理方法]

這一篇是擷取剪貼簿內容,需要將文字複製到剪貼簿上(Ctrl+C)的請參考這一篇:
http://charlottehong.blogspot.com/2017/10/c_25.html
卡關卡很久的地方
  1. UTF-8原來是要檔頭的,一開始沒注意到嘗試超久,sublimetext開出來都一堆碼
  2. CStringW 如何轉型 char* 這個也弄很久
下面直接上幾個重要的函式
#include <windows.h>
#include <atlstr.h> 

//獲取剪貼簿
CStringW getClipboard(){
    /* 轉型(char*)(LPCSTR)(CStringA)
    剪貼簿參考:https://goo.gl/bjzEeA
    轉型參考:https://goo.gl/bEmvbU */
    CStringW strData;
    if (OpenClipboard(NULL)) {
        HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT);
        //DWORD dwLength = GlobalSize(hClipboardData);
        if (hClipboardData) {
            WCHAR *pchData = (WCHAR*)GlobalLock(hClipboardData);
            if (pchData) {
                strData = pchData;
                GlobalUnlock(hClipboardData);
            }
        }
        CloseClipboard();
    }
    return strData; 
}

// 寫入文件
void WriteFiles(char* fileName, const CStringW& ClipStrW) {
    ofstream file (fileName, ios::binary);
    file.exceptions (ifstream::eofbit | ifstream::failbit | ifstream::badbit);
    // CP_UTF8 檔頭
    int UTF_8 = 0xBFBBEF;
    file.write((char*)&UTF_8, 3);
    // 寫入 CP_UTF8
    wstring str = ClipStrW;
    string result = std::string();
    result.resize(WideCharToMultiByte(CP_UTF8, 0, str.c_str(), -1, NULL, 0, 0, 0) - 1);
    char* ptr = &result[0];
    WideCharToMultiByte(CP_UTF8, 0, str.c_str(), -1, ptr, result.size(), 0, 0);
    file << result;
}
main的操作方式如下
#include <windows.h>
#include <atlstr.h> 

    // 獲取剪貼簿內容 “salient”
    CStringW ClipStrW = getClipboard();
    const char* ClipStr = (LPCSTR)(CStringA)ClipStrW;
    //cout << ClipStr << endl;
    // 剪貼簿內容寫入文件
    WriteFiles("Paper.txt", ClipStrW);

沒有留言:

張貼留言