HWND SetClipboardViewer(HWND hWnd);
引数の意味は以下の通り。
hWnd | 追加するクリップボードビューアを識別するウィンドウハンドル。 |
戻り値は、クリップボードビューアチェイン中で追加したクリップボードビューアの次のクリップボードビューアのウィンドウハンドルである。次のクリップボードビューアが存在しない場合、NULLが返される。
#define STRICT #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HWND g_hNextWnd; /* 次のクリップボードビューアのウィンドウハンドル */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { WNDCLASS wc; HWND hWnd; MSG msg; UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpszCmdLine); /* クリップボードビューアウィンドウの作成 */ 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 = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = 0; wc.lpszClassName = "TinyViewer"; RegisterClass(&wc); hWnd = CreateWindow( "TinyViewer", "Tiny Clipboard Viewer", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, NULL, hInstance, NULL ); /* クリップボードビューアの表示 */ ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); /* メッセージループ */ while (GetMessage(&msg, (HWND) NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } /* クリップボードビューアのウィンドウプロシージャ */ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HANDLE hText; char *pText; HDC hDC; switch(msg) { case WM_CREATE: /* ウィンドウが作成された */ /* クリップボードビューアチェインに自分を追加 */ g_hNextWnd = SetClipboardViewer(hWnd); break; case WM_DRAWCLIPBOARD: /* クリップボードの内容が変更された */ /* クリップボードの内容を取得 */ OpenClipboard(hWnd); hText = GetClipboardData(CF_TEXT); if(hText != NULL) { /* クリップボードの内容を表示 */ pText = GlobalLock(hText); hDC = GetDC(hWnd); TextOut(hDC, 0, 0, pText, lstrlen(pText)); ReleaseDC(hWnd, hDC); GlobalUnlock(hText); } CloseClipboard(); /* 次のクリップボードビューアへメッセージを送信 */ if(g_hNextWnd != NULL) SendMessage(g_hNextWnd, msg, wParam, lParam); break; case WM_CHANGECBCHAIN: /* クリップボードビューアチェインからクリップボードビューアが削除された */ if((HWND)wParam == g_hNextWnd) g_hNextWnd = (HWND)lParam; else if(g_hNextWnd != NULL) SendMessage(g_hNextWnd, msg, wParam, lParam); break; case WM_DESTROY: /* ウィンドウが破棄された */ /* クリップボードビューアチェインから自分を削除 */ ChangeClipboardChain(hWnd, g_hNextWnd); PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return(0); }