スクリプト言語の 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
- クリップボード操作をオープン(OpenClipboard)
- クリップボード内容をクリア(EmptyClipboard)
- クリップボード操作をクローズ(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
- クリップボード内容をチェック(IsClipboardFormatAvailable)
- クリップボード操作をオープン(OpenClipboard)
- クリップボード内容を取得(GetClipboardData)
- クリップボード容量を取得(GlobalSize)
- グローバル・メモリをロック設定(GlobalLock)
- グローバル・メモリを引数 _text_ にコピー(lstrcpy)
- グローバル・メモリをロック解除(GlobalUnlock)
- クリップボード操作をクローズ(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
- 文字列の長さを計算(strlen)
- グローバル・メモリを確保(GlobalAlloc)
- グローバル・メモリをロック設定(GlobalLock)
- 引数 _text_ をグローバル・メモリにコピー(dupptr)
- グローバル・メモリをロック解除(GlobalUnlock)
- クリップボード操作をオープン(OpenClipboard)
- クリップボード内容をクリア(EmptyClipboard)
- クリップボード内容を設定(SetClipboardData)
- クリップボード操作をクローズ(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 //------------------------------------------------------------------------------
- 「クリップボードのクリア」ボタンを押すとクリップボードのデータをクリアします。
- 「クリップボードの取得」ボタンを押すとクリップボードのテキストをメッセージ・ボックスに入力します。
- 「クリップボードの設定」ボタンを押すとメッセージ・ボックスのテキストをクリップボードにコピーします。
※コメント投稿者のブログIDはブログ作成者のみに通知されます