clipboard_history.hsp

sample\win32_gen2\clipboard_history.hsp » Plain Format

;
; clipboard_history.hsp - クリップボード履歴ビューワ (GetClipboardSequenceNumber ポーリング)
; Win32 API gen2 サンプル (hsp3net 必須)
;
; 使い方:
;   hsp3net から実行する。定期的に GetClipboardSequenceNumber() を呼び、
;   値が変化したら OpenClipboardGetClipboardData(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

        ; OpenClipboardGetClipboardDataGlobalLock → 文字列コピー
        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