BOOL ChangeClipboardChain(HWND hWnd, HWND hNextWnd);
引数の意味は以下の通り。
| hWnd | 削除するクリップボードビューアを識別するウィンドウハンドル。 |
| hNextWnd | クリップボードチェイン中でhWndの次のクリップボードビューアを識別するウィンドウハンドル。 |
戻り値は、関数の実行に成功したか否かを表す真偽値である。
以下のサンプルは、テキスト形式のみサポートする簡単なクリップボードビューアの例である。クリップボードのデータが変更されるたびに、WM_DRAWCLIPBOARDメッセージを受け取り、クリップボード中に置かれたテキストデータを表示する。
#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);
}