ChangeClipboardChain クリップボードビューアの削除

Cの宣言:

BOOL ChangeClipboardChain(HWND hWnd, HWND hNextWnd);

説明:

hWndで指定されたクリップボードビューアをクリップボードビューアチェインから削除する。

引数の意味は以下の通り。
hWnd 削除するクリップボードビューアを識別するウィンドウハンドル。
hNextWnd クリップボードチェイン中でhWndの次のクリップボードビューアを識別するウィンドウハンドル。

戻り値は、関数の実行に成功したか否かを表す真偽値である。

Cのサンプル:

以下のサンプルは、テキスト形式のみサポートする簡単なクリップボードビューアの例である。クリップボードのデータが変更されるたびに、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);
}

(original text:1999/04/05 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。