OpenClipboard
関数でリップボードをオープンすると、アプリケーションでクリップボードの内容を変更することができます。
クリップボードのオープンとクローズは1つのWindowsメッセージを処理している間に行われなければいけません。
主なクリップボード操作関数
| 関数名 | 機能 |
|---|---|
| OpenClipboard | クリップボードをオープンし、 ほかのアプリケーションがクリップボードの内容を変更しないようにします。 |
| CloseClipboard | クリップボードをクローズします。 |
| EmptyClipboard | クリップボードの内容を空にし、 クリップボード内のデータを識別するハンドルを解放します。 |
| GetClipboardData | 指定された形式を持つクリップボードのデータを取得します。 |
| SetClipboardData | クリップボードに、指定されたデータ形式でデータを入れます。 |
| IsClipboardFormatAvailable | 特定のデータ形式がクリップボードに存在するかどうかを調べます。 |
#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;
}