プログラミング工房 > HSP > サンプルモジュール > 

クリップボード操作(テキスト専用)

>> ダウンロード

/***********************************************************

	クリップボード操作(テキスト専用)モジュール

		【2006/6/19 更新】

	関数一覧

	setcbtext var p1

		クリップボードにテキストをコピー

		p1 : クリップボードにコピーするテキストを入れた文字列変数
		stat : 処理結果(0=成功 / 1=失敗)

	getcbtext var p1

		クリップボード内のテキストを取得

		p1 : クリップボードテキストを受け取るための文字列変数(空=失敗、またはテキストなし)

***********************************************************/

#include	"user32.as"
#include	"kernel32.as"

#module _open_cb

#const NULL	0
#const ERR_OPENCB	0	// OpenClipboard APIが失敗した

/**********************************************************/
// クリップボードをオープン
/**********************************************************/
#deffunc _opencb
	repeat 100 	// 1秒間程度はリトライする
		OpenClipboard NULL
		result = stat
		if result!ERR_OPENCB { 	// 成功
			break
		}
		wait 1
	loop

	return result

#global

/**********************************************************/

#module set_cb_text

#const NULL		0

#const OK_SETCBTEXT	0	// setcbtext が成功したらこの値を返す
#const ERR_SETCBTEXT	1	// setcbtext が失敗したらこの値を返す

#const ERR_OPENCB		0	// OpenClipboard APIが失敗した
#const ERR_EMPTYCB		0	// EmptyClipboard APIが失敗した

#const CF_TEXT		1	// クリップボード内で「テキスト」データ形式を表す番号
#const GHND		66	// グローバルメモリ確保の方法を指定する定数

/**********************************************************/
// クリップボードにテキストをコピー
/**********************************************************/
#deffunc setcbtext var p1
	/* グローバルメモリブロック確保 */
	textlen = strlen(p1)
	if textlen<=0 {
		return ERR_SETCBTEXT
	}
	GlobalAlloc GHND,textlen+1
	if stat=NULL { // 失敗
		return ERR_SETCBTEXT
	}
	hGlobalMem = stat

	/* コピー元変数のポインタを取得 */
	textptr = varptr(p1)

	/* グローバルメモリブロックをロックして、そのポインタを取得 */
	GlobalLock hGlobalMem
	if stat=NULL { // 失敗
		GlobalFree hGlobalMem		// グローバルメモリブロック開放
		return ERR_SETCBTEXT
	}
	globalMemPtr = stat

	/* クリップボードにコピーしたいテキストをグローバルメモリブロックにコピー */
	lstrcpy globalMemPtr,textptr
	if stat=NULL { // 失敗
		GlobalUnlock hGlobalMem		// グローバルメモリブロックのロック解除
		GlobalFree hGlobalMem
		return ERR_SETCBTEXT
	}

	/* グローバルメモリブロックのロック解除 */
	GlobalUnlock hGlobalMem

	;---------- 

	/* クリップボードをオープン */
	_opencb
	if stat=ERR_OPENCB { // 失敗
		GlobalFree hGlobalMem
		return ERR_SETCBTEXT
	}

	/* クリップボードの所有権を得る */
	EmptyClipboard
	if stat=ERR_EMPTYCB { // 失敗
		GlobalFree hGlobalMem
		CloseClipboard
		return ERR_SETCBTEXT
	}

	/* クリップボードにテキストをコピー */
	SetClipboardData CF_TEXT,hGlobalMem
	if stat=NULL { // 失敗
		GlobalFree hGlobalMem
		CloseClipboard
		return ERR_SETCBTEXT
	}

	/* SetClipboardDataが成功した場合はGlobalFreeしてはならない */
	/* クリップボードをクローズ */
	CloseClipboard

	return OK_SETCBTEXT

#global

/**********************************************************/

#module get_cb_text

#const NULL	0

#const ERR_OPENCB		0	// OpenClipboard APIが失敗した
#const ERR_COUNTCBFORMATS	0	// CountClipboardFormatsAPIが失敗した
#const ERR_ENUMCBFORMATS	0	// EnumClipboardFormatsAPIが失敗した

#const CF_TEXT		1	// クリップボード内で「テキスト」データ形式を表す番号
#const CF_OEMTEXT		7	// クリップボード内で「OEM文字セットテキスト」データ形式を表す番号
#const CF_UNICODETEXT	13	// クリップボード内で「Unicodeテキスト」データ形式を表す番号

#const TRUE	1
#const FALSE	0

/**********************************************************/
// クリップボード内のテキストを取得
/**********************************************************/
#deffunc getcbtext var p1
	p1 = ""

	/* クリップボードをオープン */
	_opencb
	if stat=ERR_OPENCB { // 失敗
		return
	}

	/* クリップボード内データ形式の数を取得 */
	CountClipboardFormats
	if stat=ERR_COUNTCBFORMATS {
		CloseClipboard
		return
	}
	formatsNum = stat

	/* クリップボードにテキストがあるかチェック */
	result = FALSE
	repeat formatsNum
		EnumClipboardFormats 0
		if (stat=CF_TEXT)|(stat=CF_OEMTEXT)|(stat=CF_UNICODETEXT) {
			result = TRUE
			break
		}
		if stat=ERR_ENUMCBFORMATS {
			continue
		}
	loop
	if result=FALSE { // クリップボードにテキストはない
		CloseClipboard
		return
	}

	/* クリップボード内テキストがあるグローバルメモリブロックのハンドルを取得 */
	GetClipboardData CF_TEXT
	if stat=NULL {
		CloseClipboard
		return
	}
	hGlobalMem = stat

	/* グローバルメモリブロックのサイズを取得 */
	GlobalSize hGlobalMem
	if stat=0 {
		CloseClipboard
		return
	}
	globalMemLen = stat

	/* テキストを受け取るための変数を用意して、そのポインタを取得 */
	sdim cbTextBuf,globalMemLen+1
	bufPtr = varptr(cbTextBuf)

	/* グローバルメモリブロックをロックして、そのポインタを取得 */
	GlobalLock hGlobalMem
	if stat=NULL { // 失敗
	CloseClipboard
		return
	}
	globalMemPtr = stat

	/* クリップボード内テキストを取得 */
	lstrcpy bufPtr,globalMemPtr
	result = stat
	GlobalUnlock hGlobalMem
	CloseClipboard
	if result=NULL { // 失敗
		return
	}
	p1 = cbTextBuf
	return

#global

/**********************************************************/