クリップボードへ転送と取り出し(TEXT) <TOP>
クリップボートへテキストを転送(Copy)し、それを取り出し(Paste)ます。
OpenClipboard
クリップボードをオープン
CloseClipboard
クリップボードをクローズ
EmptyClipboard
クリップボードを空にする
SetClipboardData
クリップボードにデータを設定
GetClipboardData
クリップボードから指定フォーマットのデータを検索
GlobalAlloc
メモリブロックを確保しハンドルを取得
GlobalFree
メモリブロックのロックを解放
GlobalLock
ヒープに確保されたメモリをロック
GlobalUnlock
メモリブロックのロックを解除
GlobalSize
グローバルメモリオブジェクトのサイズを取得
MoveMemory
メモリの指定領域をコピー
lstrcpy
文字列をコピーする
「Button1」は、APIを使ったCopy、「Button2」は、F-BasicによるCopyです。
'================================================================ '= クリップボードへ転送と取り出し(TEXT) '= (GetClipboardData.bas) '================================================================ #include "Windows.bi" ' クリップボードをオープン Declare Function Api_OpenClipboard& Lib "user32" Alias "OpenClipboard" (ByVal hWnd&) ' クリップボードをクローズ Declare Function Api_CloseClipboard& Lib "user32" Alias "CloseClipboard" () ' クリップボードを空にする Declare Function Api_EmptyClipboard& Lib "user32" Alias "EmptyClipboard" () ' クリップボードにデータを設定 Declare Function Api_SetClipboardData& Lib "user32" Alias "SetClipboardData" (ByVal wFormat&, ByVal hMem&) ' クリップボードから指定フォーマットのデータを検索 Declare Function Api_GetClipboardData& Lib "user32" Alias "GetClipboardData" (ByVal wFormat&) ' メモリブロックを確保しハンドルを取得 Declare Function Api_GlobalAlloc& Lib "kernel32" Alias "GlobalAlloc" (ByVal wFlags&, ByVal dwBytes&) ' メモリブロックのロックを解放 Declare Function Api_GlobalFree& Lib "kernel32" Alias "GlobalFree" (ByVal hMem&) ' ヒープに確保されたメモリをロック Declare Function Api_GlobalLock& Lib "kernel32" Alias "GlobalLock" (ByVal hMem&) ' メモリブロックのロックを解除 Declare Function Api_GlobalUnlock& Lib "kernel32" Alias "GlobalUnlock" (ByVal hMem&) ' グローバルメモリオブジェクトのサイズを取得 Declare Function Api_GlobalSize& Lib "kernel32" Alias "GlobalSize" (byval hMem&) ' メモリの指定領域をコピー Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination&, ByVal Source&, ByVal Length&) ' 文字列をコピーする Declare Function Api_lstrcpy& Lib "kernel32" Alias "lstrcpy" (ByVal lpString1 As Any, ByVal lpString2 As Any) #define GMEM_DDESHARE &H2000 'DDE 関数が使用するメモリを確保する #define GMEM_FIXED &H0 '固定メモリブロックを割り当てる #define GMEM_MOVEABLE &H2 '移動可能メモリブロックを割り当てる #define GMEM_ZEROINIT &H40 '割り当てたメモリブロックをゼロで初期化する #define CF_TEXT 1 'テキスト形式のデータ。各行は復帰改行(CR-LF)コードで終わる #define MAXSIZE 4096 Var Shared Edit1 As Object Var Shared Text1 As Object Var Shared Button(2) As Object Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14 Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 For i = 0 To 2 Button(i).Attach GetDlgItem("Button" & Trim$(Str$(i + 1))) : Button(i).SetFontSize 14 Next '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var MyStr As String Var hMem As Long Var lpMem As Long Var Size As Long Var Ret As Long MyStr = Edit1.GetWindowText If Api_OpenClipboard(ByVal 0) Then 'クリップボードを空にする Ret = Api_EmptyClipboard 'Nullの分を追加(+1) Size = Len(MyStr) + 1 hMem = Api_GlobalAlloc(GMEM_MOVEABLE, Size) 'メモリをロック lpMem = Api_GlobalLock(hMem) MoveMemory lpMem, StrAdr(MyStr), Size 'ロックを解除 Ret = Api_GlobalUnlock(hMem) 'クリップボードにコピー Ret = Api_SetClipboardData(CF_TEXT, hMem) 'メモリブロックのロックを解放 Ret = Api_GlobalFree(hMem) 'クリップボードを閉じる Ret = Api_CloseClipboard() End If End Sub '================================================================ '= F-Basicでクリップボードへコピー '================================================================ Declare Sub Button2_on edecl () Sub Button2_on() Var MyStr As String SetMapMode 0 ClearCB SetCBFormat "CF_TEXT" Edit1.SetSelText 0, -1 Edit1.Copy Edit1.SetSelText -1, -1 End Sub '================================================================ '= クリップボードデータ(TEXT)を取り出す '================================================================ Declare Sub Button3_on edecl () Sub Button3_on() Var hMem As Long Var lpMem As Long Var MyStr As String Var Ret As Long If Api_OpenClipboard(0) = 0 Then A% = MessageBox("", "クリップボードが開きません", 0, 0) Exit Sub End If Text1.SetWindowText "" 'テキストを参照しているグローバルメモリのブロックへのハンドルを取得 hMem = Api_GetClipboardData(CF_TEXT) 'クリップボードのメモリをロックし、実際の文字列を参照 lpMem = Api_GlobalLock(hMem) If lpMem <> 0 Then MyStr = Space$(MAXSIZE) Ret = Api_lstrcpy(MyStr, lpMem) Ret = Api_GlobalUnlock(hMem) 'nullを削除 MyStr = Left$(MyStr, InStr(MyStr, Chr$(0)) - 1) Text1.SetWindowText MyStr Else A% = MessageBox("", "文字列を参照できません!", 0, 0) End If Ret = Api_CloseClipboard() End Sub '================================================================ '= '================================================================ Declare Sub Edit1_SetFocus edecl () Sub Edit1_SetFocus() Text1.SetWindowText "" End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End