クリップボードの操作


OpenClipboard 関数でリップボードをオープンすると、アプリケーションでクリップボードの内容を変更することができます。
クリップボードのオープンとクローズは1つのWindowsメッセージを処理している間に行われなければいけません。

主なクリップボード操作関数

関数名 機能
OpenClipboard クリップボードをオープンし、 ほかのアプリケーションがクリップボードの内容を変更しないようにします。
CloseClipboard クリップボードをクローズします。
EmptyClipboard クリップボードの内容を空にし、 クリップボード内のデータを識別するハンドルを解放します。
GetClipboardData 指定された形式を持つクリップボードのデータを取得します。
SetClipboardData クリップボードに、指定されたデータ形式でデータを入れます。
IsClipboardFormatAvailable 特定のデータ形式がクリップボードに存在するかどうかを調べます。


Sample code
#include <windows.h>
#include <tchar.h>

#define IDM_COPY  100
#define IDM_PASTE 101
#define IDM_EXIT  102

#define AllocMemory(s) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, s)
#define FreeMemory(p)  HeapFree(GetProcessHeap(), 0, p)

#ifdef UNICODE
#define CLIPBOARDFORMAT CF_UNICODETEXT
#else
#define CLIPBOARDFORMAT CF_TEXT
#endif

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hInst;
LPCTSTR lpszAppName   = TEXT("MyApp");
LPCTSTR lpszAppTitle  = TEXT("MyApp");

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    MSG        msg = {0};
    HWND       hWnd;
    WNDCLASSEX wc = {0};
    
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    UNREFERENCED_PARAMETER(nCmdShow);
    
    //メインウィンドウクラス登録
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = lpszAppName;
    wc.hIconSm       = NULL;
    if(RegisterClassEx(&wc) == 0) {
        return 0;
    }
    
    hInst = hInstance;
    
    //メニュー作成
    HMENU hMenu = CreateMenu();
    HMENU hPopMenu = CreatePopupMenu();
    AppendMenu(hPopMenu, MF_STRING, IDM_COPY, TEXT("&Copy"));
    AppendMenu(hPopMenu, MF_STRING, IDM_PASTE, TEXT("&Paste"));
    AppendMenu(hPopMenu, MF_SEPARATOR, 0, NULL);
    AppendMenu(hPopMenu, MF_STRING, IDM_EXIT, TEXT("&Exit"));
    AppendMenu(hMenu, MF_POPUP | MF_STRING, reinterpret_cast<UINT_PTR>(hPopMenu), TEXT("&File"));
    
    //メインウインドウ作成
    hWnd = CreateWindow(lpszAppName, lpszAppTitle, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, hMenu, hInstance, NULL
    );
    if(hWnd == NULL) {
        return 0;
    }
    
    ShowWindow(hWnd, SW_SHOWDEFAULT);
    UpdateWindow(hWnd);
    
    //メイン メッセージ ループ
    while(GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg); 
        DispatchMessage(&msg);
    }
    return static_cast<int>(msg.wParam);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndEdit = NULL;
    
    switch(uMsg) {
        case WM_COMMAND:
            switch(LOWORD(wParam)) {
                case IDM_COPY: //コピー
                    {
                        BOOL bResult = FALSE;
                        
                        DWORD dwStart, dwEnd;
                        SendMessage(hwndEdit, EM_GETSEL, reinterpret_cast<WPARAM>(&dwStart), reinterpret_cast<LPARAM>(&dwEnd));
                        if(dwStart == dwEnd) {
                            break;
                        }
                        
                        LPTSTR lpszData = static_cast<LPTSTR>(AllocMemory((dwEnd + 1) * sizeof(TCHAR)));
                        if(lpszData != NULL) {
                            GetWindowText(hwndEdit, lpszData, dwEnd + 1);
                            
                            HANDLE hMem = GlobalAlloc(GHND, ((dwEnd + 1) - dwStart) * sizeof(TCHAR));
                            if(hMem) {
                                LPTSTR lpMem = static_cast<LPTSTR>(GlobalLock(hMem));
                                CopyMemory(lpMem, &lpszData[dwStart], ((dwEnd + 1) - dwStart) * sizeof(TCHAR));
                                GlobalUnlock(hMem);
                                
                                //クリップボードをオープンします
                                if(OpenClipboard(hWnd)) {
                                    //クリップボードの内容を空にします
                                    if(EmptyClipboard()) {
                                        //クリップボードにデータを入れる
                                        if(SetClipboardData(CLIPBOARDFORMAT, hMem) != NULL) {
                                            bResult = TRUE;
                                        }
                                    }
                                    CloseClipboard();
                                }
                                if(!bResult) {
                                    //失敗した場合はメモリを開放
                                    GlobalFree(hMem);
                                }
                            }
                            FreeMemory(lpszData);
                        }
                    }
                    break;
                case IDM_PASTE: //貼り付け
                    {
                        if(IsClipboardFormatAvailable(CLIPBOARDFORMAT)) {
                            //クリップボードをオープンします
                            if(OpenClipboard(hWnd)) {
                                //クリップボードからデータを取り出します
                                HANDLE hData = GetClipboardData(CLIPBOARDFORMAT);
                                if(hData != NULL) {
                                    LPTSTR lpData = static_cast<LPTSTR>(GlobalLock(hData));
                                    //エディットコントロールに書き出します
                                    SendMessage(hwndEdit, EM_REPLACESEL, 0, reinterpret_cast<LPARAM>(lpData));
                                    GlobalUnlock(hData);
                                }
                                CloseClipboard();
                            }
                        }
                    }
                    break;
                case IDM_EXIT: //終了
                    SendMessage(hWnd, WM_CLOSE, 0, 0);
                    break;
            }
            break;
        case WM_CREATE:
            {
                //エディットコントロール作成
                hwndEdit = CreateWindow(TEXT("EDIT"), NULL,
                    WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
                    0, 0, 0, 0, hWnd, NULL, hInst, NULL
                );
                if(hwndEdit == NULL) {
                    return -1;
                }
                SetFocus(hwndEdit);
            }
            break;
        case WM_SIZE:
            {
                RECT rc;
                GetClientRect(hWnd, &rc);
                MoveWindow(hwndEdit, 0, 0, rc.right, rc.bottom, TRUE);
            }
            break;
        case WM_DESTROY:
            {
                PostQuitMessage(0);
            }
            break;
        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    
    return 0;
}

一覧メニューへ