sample\win32_gen2\clipboard_history.hsp » Plain Format
;
; clipboard_history.hsp - クリップボード履歴ビューワ (GetClipboardSequenceNumber ポーリング)
; Win32 API gen2 サンプル (hsp3net 必須)
;
; 使い方:
; hsp3net から実行する。定期的に GetClipboardSequenceNumber() を呼び、
; 値が変化したら OpenClipboard → GetClipboardData(CF_UNICODETEXT) で
; テキストを取得し、履歴リストに追加して画面に表示する。
;
; 動作確認:
; 起動後に任意のアプリで文字列をコピーすると、画面下部に
; [1] こんにちは
; [2] Hello World
; [3] ...
; のように追加されていく。
;
; 備考:
; - SetClipboardViewer はレガシー API であり、代わりに
; AddClipboardFormatListener が推奨されるが、サンプルとしては
; シーケンス番号ポーリング方式がもっとも単純。
;
#include "win32_types_gen2.as"
#include "user32_gen2.as"
#include "kernel32_gen2.as"
; --- 定数 ---
; CF_UNICODETEXT は win32_types_gen2 側で定義済み (0xD)
title "クリップボード履歴ビューワ"
screen 0, 480, 480
sdim history, 1024, 64
hist_count = 0
last_seq = GetClipboardSequenceNumber()
mes "起動時シーケンス番号: " + last_seq
mes "(任意のアプリでテキストをコピーしてください)"
mes "----"
base_y = ginfo_cy
repeat
await 200 ; 200ms ポーリング
cur_seq = GetClipboardSequenceNumber()
if cur_seq = last_seq : continue
last_seq = cur_seq
; テキスト形式が入っているか?
if IsClipboardFormatAvailable(CF_UNICODETEXT) = 0 : continue
; OpenClipboard → GetClipboardData → GlobalLock → 文字列コピー
if OpenClipboard(0) = 0 : continue
hData = GetClipboardData(CF_UNICODETEXT)
if hData = 0 {
CloseClipboard
continue
}
pText = GlobalLock(hData)
if pText = 0 {
CloseClipboard
continue
}
; pText は LPCWSTR (生アドレス)。dupptr でアドレスを var に alias して
; cnvwtos でそのまま cp932 に変換する。アドレス範囲は 8KB 決め打ち
; (十分大きめ) にする。
dupptr wsrc, pText, 8192
txt = cnvwtos(wsrc)
GlobalUnlock hData
CloseClipboard
if hist_count < 64 {
history(hist_count) = txt
hist_count++
} else {
; 先頭を落としてシフト
i = 0
repeat 63
history(i) = history(i + 1)
i++
loop
history(63) = txt
}
; 再描画
redraw 0
color 255, 255, 255 : boxf
color 0, 0, 0
pos 8, 8
mes "クリップボード履歴 (seq=" + cur_seq + ")"
mes "----"
i = 0
repeat hist_count
mes "[" + (i + 1) + "] " + history(i)
i++
loop
redraw 1
loop