/***********************************************************
クリップボード操作(テキスト専用)モジュール
【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
/**********************************************************/
|