プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

[HSP]クリップボードの操作(クリア・取得・設定)

2014年08月28日 20時20分00秒 | HSP講座

スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。(戻る)


ここでは、プラグインの「hspext.dll」を使わないでクリップボードの操作(クリア・取得・設定)を紹介します。
Window OS から直接クリップボード関係の API 関数を呼び出せばプラグインを使わなくても操作が出来ます。
特にクリップボードの機能だけ欲しい場合には、さらっと HSP のソースのみで動けば実行ファイルにしたときコンパクトですね。

なお、プラグインの「hspext.dll」内部でも同じような方法でクリップボードを操作する命令を用意してます。
API 関数については「クリップボード関連のカテゴリ」を参照して下さい。
ここに書かれた内容を HSP の呼び出し規則に従って書き直しモノが次の小技集です。
分かりやすくするために、あえてモジュールにしてません。

クリップボード関連の共通ヘッダ - apiClipHead.as

#ifndef __APICLIPBOARD__
#define __APICLIPBOARD__

//--------------------------------------
// Win32API関数の命令登録
//--------------------------------------
#uselib "Kernel32.dll"
    # func lstrcpy                      "lstrcpyA"                      sptr,sptr
    #cfunc GlobalAlloc                  "GlobalAlloc"                   sptr,sptr
    # func GlobalFree                   "GlobalFree"                    sptr
    #cfunc GlobalSize                   "GlobalSize"                    sptr
    #cfunc GlobalLock                   "GlobalLock"                    sptr
    # func GlobalUnlock                 "GlobalUnlock"                  sptr
#uselib "User32.dll"
    #cfunc OpenClipboard                "OpenClipboard"                 sptr
    # func CloseClipboard               "CloseClipboard"
    # func EmptyClipboard               "EmptyClipboard"
    #cfunc GetClipboardData             "GetClipboardData"              sptr
    # func SetClipboardData             "SetClipboardData"              sptr,sptr
    #cfunc IsClipboardFormatAvailable   "IsClipboardFormatAvailable"    sptr

//--------------------------------------
// Win32API関数の記号定数
//--------------------------------------
#const CF_TEXT          (1)
#const GHND             ($0042)
#const GMEM_SHARE       ($2000)

#endif
  • クリップボードの操作で必要な API 関数の呼び出し定義です。
  • Kernel32.dll は全体的にメモリ関係の API 関数です。
  • User32.dll がクリップボード関係の API 関数になります。
  • 上記の共通ヘッダは、各クリップボード操作でインクルードして使います。

クリップボードのデータをクリア - apiClipClear.as

#include "apiClipHead.as"

//--------------------------------------
// クリップボードのデータをクリア
//--------------------------------------
#deffunc apiClipClear
    if OpenClipboard(hWnd){
        EmptyClipboard
        CloseClipboard
        return 1
    }
return 0
  1. クリップボード操作をオープン(OpenClipboard)
  2. クリップボード内容をクリア(EmptyClipboard)
  3. クリップボード操作をクローズ(CloseClipboard)

クリップボードのテキストを取得 - apiClipLoad.as

#include "apiClipHead.as"

//--------------------------------------
// クリップボードのテキストを取得
//--------------------------------------
#deffunc apiClipLoad var _text_,\
    local hMem,\
    local nSize,\
    local pBuff
    sdim _text_
    
    if IsClipboardFormatAvailable(CF_TEXT){
        if OpenClipboard(hWnd){
            hMem=GetClipboardData(CF_TEXT):if(hMem){
                nSize=GlobalSize(hMem)
                pBuff=GlobalLock(hMem)
                sdim _text_,nSize+1
                lstrcpy varptr(_text_),pBuff
                GlobalUnlock hMem
                CloseClipboard
                return 1
            }
            CloseClipboard
        }
    }
return 0
  1. クリップボード内容をチェック(IsClipboardFormatAvailable)
  2. クリップボード操作をオープン(OpenClipboard)
  3. クリップボード内容を取得(GetClipboardData)
  4. クリップボード容量を取得(GlobalSize)
  5. グローバル・メモリをロック設定(GlobalLock)
  6. グローバル・メモリを引数 _text_ にコピー(lstrcpy)
  7. グローバル・メモリをロック解除(GlobalUnlock)
  8. クリップボード操作をクローズ(CloseClipboard)

クリップボードにテキストを設定 - apiClipSave.as

#include "apiClipHead.as"

//--------------------------------------
// クリップボードにテキストを設定
//--------------------------------------
#deffunc apiClipSave str _text_,\
    local hMem,\
    local nSize,\
    local pBuff,\
    local dupStr
    
    nSize=strlen(_text_)+1
    hMem=GlobalAlloc(GHND|GMEM_SHARE,nSize):if(hMem){
        pBuff=GlobalLock(hMem)
        ;文字列型のクローン変数作成
        dupptr dupStr,pBuff,nSize,2
        dupStr=_text_
        GlobalUnlock hMem
        
        if OpenClipboard(hWnd){
            EmptyClipboard
            SetClipboardData CF_TEXT,hMem
            CloseClipboard
            return 1
        }
        GlobalFree hMem
    }
return 0
  1. 文字列の長さを計算(strlen)
  2. グローバル・メモリを確保(GlobalAlloc)
  3. グローバル・メモリをロック設定(GlobalLock)
  4. 引数 _text_ をグローバル・メモリにコピー(dupptr)
  5. グローバル・メモリをロック解除(GlobalUnlock)
  6. クリップボード操作をオープン(OpenClipboard)
  7. クリップボード内容をクリア(EmptyClipboard)
  8. クリップボード内容を設定(SetClipboardData)
  9. クリップボード操作をクローズ(CloseClipboard)

小技集のサンプル

//------------------------------------------------------------------------------
// クリップボード関連のサンプル by 科学太郎
//------------------------------------------------------------------------------

//--------------------------------------
// メイン部
//--------------------------------------
*Init
    sdim strClip
*Main
    screen 0,600,430,SCREEN_NORMAL
    title "クリップボード関連のサンプル"
    mesbox strClip,600,400,5,0
    objsize 200,30
    pos   0,400:button gosub "クリップボードのクリア",  *PushClear
    pos 200,400:button gosub "クリップボードの取得",    *PushLoad
    pos 400,400:button gosub "クリップボードの設定",    *PushSave
    stop
//--------------------------------------
// クリップボードのデータをクリア
//--------------------------------------
*PushClear
    apiClipClear
    return
//--------------------------------------
// クリップボードのテキストを取得
//--------------------------------------
*PushLoad
    apiClipLoad strClip
    objprm 0,strClip
    return
//--------------------------------------
// クリップボードにテキストを設定
//--------------------------------------
*PushSave
    apiClipSave strClip
    return
//--------------------------------------
// 小技集のインクルード
//--------------------------------------
#include "apiClipClear.as"
#include "apiClipLoad.as"
#include "apiClipSave.as"
//------------------------------------------------------------------------------
// End of apiClipSample.hsp
//------------------------------------------------------------------------------
  • 「クリップボードのクリア」ボタンを押すとクリップボードのデータをクリアします。
  • 「クリップボードの取得」ボタンを押すとクリップボードのテキストをメッセージ・ボックスに入力します。
  • 「クリップボードの設定」ボタンを押すとメッセージ・ボックスのテキストをクリップボードにコピーします。

スクリーン・ショット



コメント   この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« コンパイル・オプションの記... | トップ | [HSP]ディスク容量の取得(1) »
最新の画像もっと見る

コメントを投稿

HSP講座」カテゴリの最新記事