;=============================================================== ; クリップボード操作モジュール ;=============================================================== #module "_clipboard" ; さくらさんのHSP−NEXT(http://hspnext.com/)のHSPサンプル蔵のモジュールに少し付け加えました #uselib "user32.dll" #func IsClipboardFormatAvailable "IsClipboardFormatAvailable" sptr ; UINT format クリップボードのデータ形式 #cfunc RegisterClipboardFormat "RegisterClipboardFormatA" sptr ; UINT format 新しいデータ形式の名前 #func OpenClipboard "OpenClipboard" sptr ; HWND hWndNewOwner ウィンドウのハンドル #func GetClipboardData "GetClipboardData" sptr ; UINT uFormat クリップボードのデータ形式 #func SetClipboardData "SetClipboardData" sptr,sptr ; UINT uFormat クリップボードのデータ形式 ; HANDLE hMem データのハンドル #func EmptyClipboard "EmptyClipboard" #func CloseClipboard "CloseClipboard" #const CF_OEMTEXT $00000007 #const CF_BITMAP $00000002 #const CF_HDROP $0000000F #define CFSTR_PREFERREDDROPEFFECT "Preferred DropEffect" ; #constではダメです #const DROPEFFECT_COPY $00000001 ;コピー(COPY) #const DROPEFFECT_MOVE $00000002 ; 移動(MOVE) #const DROPEFFECT_LINK $00000004 ; ショートカット(LINK) #func GetDC "GetDC" sptr #func ReleaseDC "ReleaseDC" sptr,sptr #func InvalidateRect "InvalidateRect" sptr,sptr,sptr #uselib "gdi32.dll" #func BitBlt "BitBlt" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr #const SRCCOPY $00CC0020 #func CreateCompatibleDC "CreateCompatibleDC" sptr #func CreateCompatibleBitmap "CreateCompatibleBitmap" sptr,sptr,sptr #func SelectObject "SelectObject" sptr,sptr #func GetObject "GetObjectA" sptr,sptr,sptr ;#func CreateDC "CreateDCA" sptr,sptr,sptr,sptr #func DeleteDC "DeleteDC" sptr #uselib "kernel32.dll" #func GlobalAlloc "GlobalAlloc" sptr,sptr #const GHND $00000042 ; GMEM_MOVEABLE と GMEM_ZEROINIT の各フラグの組み合わせです。 #const GMEM_FIXED $00000000 ; 固定メモリを割り当てます。ポインタが返ります #const GMEM_MOVEABLE $00000002 ; 移動可能メモリを割り当てます。Win32 環境では、物理メモリ内でメモリブロックが移動されることは決してありませんが、既定のヒープ内で移動することは可能です。この値を GMEM_FIXED フラグと組み合わせることはできません。 #const GMEM_ZEROINIT $00000040 ; メモリの内容を 0 へ初期化します。 #const GPTR $00000040 ; GMEM_FIXED と GMEM_ZEROINIT の各フラグの組み合わせです。 #func GlobalLock "GlobalLock" sptr #func GlobalSize "GlobalSize" sptr #func GlobalUnlock "GlobalUnlock" sptr #func lstrcpy "lstrcpy" sptr,sptr #func GlobalFree "GlobalFree" int #func RtlMoveMemory "RtlMoveMemory" int,int,int #func GetFileAttributes "GetFileAttributesA" sptr ; LPCTSTR lpFileName ファイルまたはディレクトリの名 ;#func SetFileAttributes "SetFileAttributesA" sptr,sptr ; LPCTSTR lpFileName, ファイル名 ; DWORD dwFileAttributes 属性 #const FILE_ATTRIBUTE_READONLY 0x1 ; 読み込み専用属性(書き込み禁止) #const FILE_ATTRIBUTE_HIDDEN 0x2 ; 隠しファイル属性 #const FILE_ATTRIBUTE_SYSTEM 0x4 ; システムファイル属性 #const FILE_ATTRIBUTE_DIRECTORY 0x10 ; ディレクトリ属性 #const FILE_ATTRIBUTE_ARCHIVE 0x20 ; アーカイブ属性 #const FILE_ATTRIBUTE_NORMAL 0x80 ; ファイル属性を持たない(標準タイプ) #const FILE_ATTRIBUTE_TEMPORARY 0x100 ; メモリー上ファイル #const FILE_ATTRIBUTE_COMPRESSED 0x800 ; 圧縮ファイル #uselib "shell32.dll" #func DragQueryFile "DragQueryFile" sptr,sptr,sptr,sptr ; HDROP hDrop, ファイル名構造体のハンドル ; UINT iFile, ファイルのインデックス番号 ; LPTSTR lpszFile, ファイル名を格納するバッファ ; UINT cch バッファのサイズ ;#func DragAcceptFiles "DragAcceptFiles" sptr,sptr ; HWND hWnd, ウィンドウのハンドル ; BOOL fAccept 受け入れの有無 #const FALSE 0 #const TRUE 1 ;--------------------------------------------------------------- ; クリップボードからテキストデータを取得 (getcliptext) ; ・書式 getcliptext Value ; ・引数 Value (var) : 文字列型変数 ; ・戻り値 : 成功 stat=0, 失敗 stat=-1 ; 使用例 getcliptext s : mes s ;--------------------------------------------------------------- #deffunc getcliptext var prm1 ; 新命令「getcliptext」を生成 if vartype(prm1)!2 : return -1 OpenClipboard hwnd IsClipboardFormatAvailable CF_OEMTEXT ret=stat : if ret==0 : CloseClipboard : return -1 if ret!0 { GetClipboardData ret : lngHwnd=stat if lngHwnd==0 : CloseClipboard : return -1 GlobalLock lngHwnd : lngMem=stat GlobalSize lngHwnd : ls=stat sdim strClipData,ls+1 lstrcpy varptr(strClipData),lngMem GlobalUnlock lngHwnd CloseClipboard prm1=strClipData : sdim strClipData,0 } return 0 ;--------------------------------------------------------------- ; クリップボードにテキストデータを設定 (setcliptext) ; ・書式 setcliptext strData ; ・引数 strData (str) : 設定文字列データ or 文字列変数 ; ・戻り値 : 成功 stat=1, 失敗 stat=1以外 ; 使用例 s="ABCDEFG" : setcliptext s ;--------------------------------------------------------------- #deffunc setcliptext str prm1 ; 新命令「setcliptext」を生成 OpenClipboard hwnd ret=stat : if ret!0 : EmptyClipboard ;GMEM_MOVEABLE 2 ls=strlen(prm1)+1 : sdim strData,ls strData = prm1 GlobalAlloc 2,ls lngHwnd=stat if lngHwnd!0 { GlobalLock lngHwnd lngMem=stat if lngMem!0 { lstrcpy lngMem,varptr(strData) : ret=stat if ret!0 { SetClipboardData CF_OEMTEXT,lngHwnd lngRet=stat } GlobalUnlock lngHwnd : lngRet=stat } } CloseClipboard : sdim strData,0 return stat ;--------------------------------------------------------------- ; クリップボードから画像を取得 (getclipimg) ; ・書式 getclipimg ; ・引数 なし ; ・戻り値 : 成功 stat=0, 失敗 stat=0以外 ; 使用例 getclipimg ;--------------------------------------------------------------- #deffunc getclipimg ; 新命令「getclipimg」を生成 IsClipboardFormatAvailable CF_BITMAP ret=stat : if ret==0 : return -1 if ret { OpenClipboard hwnd GetClipboardData CF_BITMAP : hBitmap=stat if hBitmap==0 : return -2 CreateCompatibleDC hdc : hdc_mem=stat if hdc_mem==0 : return -3 SelectObject hdc_mem,hBitmap dim bm,84 ;BITMAP_INFO構造体 GetObject hBitmap,84,varptr(bm) BitBlt hdc,0,0,bm.1,bm.2,hdc_mem,0,0,SRCCOPY DeleteDC hdc_mem ReleaseDC hwnd,hdc CloseClipboard : dim bm,0 } InvalidateRect hwnd,0,TRUE return 0 ;--------------------------------------------------------------- ; クリップボードに画像を設定 (setclipimg) ; ・書式 setclipimg plx,ply,pbx,pby ; ・引数 plx (int) : 0〜ginfo_winx(0) 位置 x ; ply (int) : 0〜ginfo_winy(0) 位置 y ; pbx (int) : 0〜ginfo_winx(0) 幅 ; pby (int) : 0〜ginfo_winy(0) 高さ ; ・戻り値 : 成功 stat=0, 失敗 stat=0以外 ; 使用例 picload "sample.jpg",1 : setclipimg 0,0,300,128 ;--------------------------------------------------------------- #deffunc setclipimg int prm1,int prm2,int prm3,int prm4 ; 新命令「setclipimg」を生成 plx = prm1 : if (plx<=0)|(plx>ginfo_winx) : plx=0 ply = prm2 : if (ply<=0)|(ply>ginfo_winy) : ply=0 pbx = prm3 : if (pbx<=0)|(pbx>ginfo_winx) : pbx=0 pby = prm4 : if (pby<=0)|(pby>ginfo_winy) : pby=0 ; ビットマップメモリを確保 GetDC hwnd : ghdc=stat if ghdc==0 : return -1 ;CreateCompatibleDC chdc : hdc_mem=stat CreateCompatibleDC ghdc : hdc_mem=stat ;CreateCompatibleDC hwnd : hdc_mem=stat if hdc_mem==0 : return -2 CreateCompatibleBitmap ghdc,pbx,pby : hBitmap=stat if hBitmap==0 : return -3 await 1 SelectObject hdc_mem,hBitmap BitBlt hdc_mem,0,0,pbx,pby,ghdc,plx,ply,SRCCOPY ; クリップボードにデータを転送 OpenClipboard hwnd ;OpenClipboard 0 EmptyClipboard SetClipboardData CF_BITMAP,hBitmap CloseClipboard ; ビットマップメモリを解放 DeleteDC hdc_mem ReleaseDC hwnd,ghdc return 0 ;--------------------------------------------------------------- ; クリップボードからファイル名を取得 (getclipfilename) ; ・書式 getclipfilename Value ; ・引数 Value (var) : 文字列型変数 ; ・戻り値 0:コピー(COPY) 1:切り取り(MOVE) : 2:コピー(COPY)とショートカット(LINK) : 3:ショートカット(LINK)のみ : -1:失敗 ; 使用例 getclipfilename s : mes s+"\n"+stat ;--------------------------------------------------------------- ; HSP3ラウンジ「クリップボードのファイルを貼り付けしたい」のYoshizawaさんの質問(2008/02/02)と月影ともさんの回答(2008/02/02)を参考にしました #deffunc getclipfilename var prm1 ; 新命令「getclipfilename」を生成 size=3000 ; <= バッファの最大サイズ if vartype(prm1)!2 : return -1 IsClipboardFormatAvailable CF_HDROP ret=stat : if ret==0 : return -1 if ret!0 { OpenClipboard hwnd GetClipboardData CF_HDROP : clip_hwnd=stat if clip_hwnd==0 : CloseClipboard : return -1 GlobalLock clip_hwnd : p_clip_hwnd=stat DragQueryFile p_clip_hwnd, -1, 0, 0 : buf="" repeat stat sdim tmp, 256 DragQueryFile p_clip_hwnd, cnt, varptr(tmp), 256 size = size-stat-2 : : if size<1 : break ; バッファオーバー buf+=tmp+"\n" loop prm1=buf GlobalUnlock clip_hwnd CF_DROPEFFECT=RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT) if stat=0 { ;mes "ERROR - CF_DROPEFFECT="+CF_DROPEFFECT CloseClipboard return -1 } GetClipboardData CF_DROPEFFECT : hEffect=stat if stat=0 { ;mes "ERROR - hEffect="+hEffect CloseClipboard return -1 } GlobalLock hEffect : pEffect=stat dupptr effect, pEffect, 4 if effect & DROPEFFECT_COPY { if effect & DROPEFFECT_LINK { ret=2 }else{ ret=0 } }else{ if effect & DROPEFFECT_MOVE { ret=1 }else{ if effect & DROPEFFECT_LINK { ret=3 }else{ ret=-1 } } } GlobalUnlock hEffect CloseClipboard } return ret ;--------------------------------------------------------------- ; クリップボードに複数のファイル/フォルダをコピー (CopyFilesToClipBoard) ; ・書式 CopyFilesToClipBoard array, Count, Flag ; ・引数 array : 文字列型配列 ; Count : コピーするファイル/フォルダの数 ; Flag : 0:コピー(COPY) 1:移動(MOVE) 2:コピー(COPY)とショートカット(LINK) ; 2は動作しない ; ・戻り値 0:成功 <0:失敗 ; 使用例 CopyFilesToClipBoard FileNames, 3, 0 ;--------------------------------------------------------------- ; HSP3ラウンジ「クリップボードにファイルを登録したい」のDoubleQuoteさんの質問(2006/07/27の)と月影ともさんの回答(2006/07/28)を参考にしました #deffunc CopyFilesToClipBoard array FileNames, int Count, int MoveFlag ; 新命令「CopyFilesToClipBoard」を生成 ; DROPFILES 構造体 DROPFILES = 20,0,0,0,0 ; 0 DWORD offset = pDF->pFiles; ; 1 POINT pt = pDF->pt; ; 2 BOOL bNonClientArea = pDF->fNC; ; 3 BOOL bUnicde = pDF->fWide; ; 4 DWORD offset2 = 0; ; 5 FILE *file; ; \0区切り文字列生成 終端は\0\0 len = 0 : nsfn="" : notexist = 0 repeat Count exist FileNames.cnt if strsize=-1 { ; ファイルが存在しない notexist=1 GetFileAttributes FileNames.cnt if (stat != -1) & (stat & FILE_ATTRIBUTE_DIRECTORY) { notexist=0 }else{ ; フォルダも存在しない break } } memexpand nsfn,len+strlen(FileNames.cnt)+2 poke nsfn,len,FileNames.cnt len += strsize+1 loop if notexist { return -1 } poke nsfn,len,0 : len++ ; 終端に\0をもういっこ追加 ; メモリの準備 GlobalAlloc GHND, len+20 : hDrop=stat GlobalLock hDrop : pDrop=stat ; dupptr 変数に poke/memcpy できないようだ。。不具合? ;dupptr sDrop, pDrop, len+20, vartype("str") ;memcpy sDrop, DROPFILES, 20 ;memcpy sDrop, nsfn ,len, 20 RtlMoveMemory pDrop, varptr(DROPFILES),20 ; memcpy のAPIバージョン RtlMoveMemory pDrop+20, varptr(nsfn), len GlobalUnlock hDrop ; コピーなのか、切り取りなのか、ショートカットなのかを付加情報として与える。 GlobalAlloc GHND, 4 : hDropEffect=stat GlobalLock hDropEffect : pDropEffect=stat dupptr sDropEffect,pDropEffect,4,vartype("int") if MoveFlag == 0 { sDropEffect = DROPEFFECT_COPY ; [貼り付け(P)]るだけ(COPY) }else{ if MoveFlag == 1 { sDropEffect = DROPEFFECT_MOVE ; [貼り付け(P)]て移動(MOVE) }else{ if MoveFlag == 2 { sDropEffect = DROPEFFECT_LINK | DROPEFFECT_COPY ; [ショートカットの貼り付け(S)]は動作しない }else{ sDropEffect = DROPEFFECT_COPY } } } GlobalUnlock hDropEffect ; クリップボードへ CF_DROPEFFECT = RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT) if stat=0 { ;mes "ERROR - CF_DROPEFFECT="+CF_DROPEFFECT return -1 } OpenClipboard hWnd if stat = 0 { ; クリップボード開くの失敗 GlobalFree hDrop GlobalFree hDropEffect return -2 } EmptyClipboard SetClipboardData CF_HDROP, hDrop SetClipboardData CF_DROPEFFECT, hDropEffect CloseClipboard return 0 ;--------------------------------------------------------------- ; クリップボードにファイル/フォルダをコピー (CopyFileToClipBoard) ; ・書式 CopyFileToClipBoard array, Flag ; ・引数 array : 文字列 ; Flag : 0:コピー(COPY) 1:移動(MOVE) 4:ショートカット(LINK) ; ・戻り値 0:成功 <0:失敗 ; 使用例 CopyFilesToClipBoard FileNames, 0 ;--------------------------------------------------------------- #deffunc CopyFileToClipBoard str FileName, int MoveFlag ; 新命令「CopyFileToClipBoard」を生成 fn = FileName CopyFilesToClipBoard fn,1,MoveFlag return stat ;--------------------------------------------------------------- ; クリップボードをクリア ; ・引数 : なし ; 使用例 : Clipclr ; クリップボードにセットされている値を削除します。 ; 文字列だけでなく、ペイントなどで切り取ったビットマップデータ ; 音声データなどデータにかかわらず削除します。 ;--------------------------------------------------------------- #deffunc Clipclr ; 新命令「Clipclr」を生成 OpenClipboard hwnd EmptyClipboard CloseClipboard return #global /**** サンプル 1 **** a="" getclipfilename a mes a+"\n"+stat */ /**** サンプル 2 **** filename=dir_cur+"\\z_test.txt" ; ファイル filename=dir_cur+"\\aaa" ; フォルダ CopyFileToClipBoard filename, 0 mes ""+stat */ /**** サンプル 3 **** filename=s.0 = dir_cur+"\\test.hsp" filename=s.1 = dir_cur+"\\test2.hsp" filename=s.2 = dir_cur+"\\test3.hsp" CopyFilesToClipBoard filename=,3 mes ""+stat */