> コピーを繰り返すと新たにコピーした文字列が上書きされてしまうのですが、"追加"でどんどんと言う風にはならないでしょうか?^^;
そうですね。文字列を
設定してしまうので追加って感じじゃないですね。
文字列を設定せずに追加するような処理に替えます。
関数の定義 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード:
'----------------------------------------------------------------------
' エディットボックスに文字列を追加
' hWnd : エディットボックスのハンドル
' lpString : 追加したい文字列
' bUndo : UNDOを有効にするか(TRUE=する)
' 戻り値 : 成功した場合、1。失敗した場合、0。
'----------------------------------------------------------------------
Function EditBox_AddText(ByVal hWnd As HWND,ByVal lpString As BytePtr,ByVal bUndo As BOOL)
SendMessage(hWnd,EM_SETSEL,-1,-1)
EditBox_AddText=SendMessage(hWnd,EM_REPLACESEL,bUndo As WPARAM,lpString As LPARAM)
End Function
> 又、ボタン1を押せばクリップボード監視を停止としたい場合どうしたら良いのでしょうか?
すいません。実装しようとしたら全体的にコードが変わってしまいました。新しく載せます。
ちなみに、クリップボードの監視を始めるには、SetClipboardViewer()関数、終了するには、ChangeClipboardChain()関数を使います。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード:
'----------------------------------------------------------------------
' エディットボックスに文字列を追加
' hWnd : エディットボックスのハンドル
' lpString : 追加したい文字列
' bUndo : UNDOを有効にするか(TRUE=する)
' 戻り値 : 成功した場合、1。失敗した場合、0。
'----------------------------------------------------------------------
Function EditBox_AddText(ByVal hWnd As HWND,ByVal lpString As BytePtr,ByVal bUndo As BOOL)
SendMessage(hWnd,EM_SETSEL,-1,-1)
EditBox_AddText=SendMessage(hWnd,EM_REPLACESEL,bUndo As WPARAM,lpString As LPARAM)
End Function
Dim hNextWnd As HWND ' チェイン内の次のウィンドウハンドルを持つ
Dim isCBView As BOOL ' クリップボードの監視状態を持つ
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Select Case dwMsg
Case WM_DRAWCLIPBOARD ' クリップボードの内容が変更された場合、実行される。
Dim hMem As HGLOBAL
Dim lpStr As BytePtr
' クリップボード内の文字列を取得
If OpenClipboard(hMainWnd) Then
hMem=GetClipboardData(CF_TEXT)
CloseClipboard()
If hMem Then
lpStr=GlobalLock(hMem)
' エディットボックスに文字列を追加
EditBox_AddText(GetDlgItem(hMainWnd,EditBox1),MakeStr(lpStr)+Ex"\r\n",TRUE)
GlobalUnlock(hMem)
Else
SetDlgItemText(hMainWnd,EditBox1,"テキストデータがありません。")
End If
End If
If hNextWnd Then
SendMessage(hNextWnd,dwMsg,wParam,lParam)
End If
Case WM_CHANGECBCHAIN
If wParam=hNextWnd Then
hNextWnd=lParam As HWND
ElseIf hNextWnd Then
SendMessage(hNextWnd,dwMsg,wParam,lParam)
End If
End Select
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
' ウィンドウ破棄時
Sub MainWnd_Destroy()
ChangeClipboardChain(hMainWnd,hNextWnd)
CBView_DestroyObjects()
PostQuitMessage(0)
End Sub
' ウィンドウ作成時
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
hNextWnd=SetClipboardViewer(hMainWnd)
isCBView=TRUE
End Sub
' コマンドボタン1を押した時
Sub MainWnd_CommandButton1_Click()
' 監視していないなら
If isCBView=FALSE Then
hNextWnd=SetClipboardViewer(hMainWnd)
isCBView=TRUE
End If
End Sub
' コマンドボタン2を押した時
Sub MainWnd_CommandButton2_Click()
' 監視しているなら
If isCBView Then
ChangeClipboardChain(hMainWnd,hNextWnd)
isCBView=FALSE
End If
End Sub
別にクリップボードの監視に詳しい訳じゃないので、動いてるんですけどなんか問題あるかもしれません...。
> If hMem Then ってどんな条件分岐なんですか?
> もしもグローバルオブジェクトメモリ ハンドルが?!
言葉に直すなら「グローバルオブジェクトメモリハンドルが FALSE じゃないなら」って感じでしょうか。
「グローバルオブジェクトメモリハンドルが TRUE なら」とは違うので注意が必要です。
そういえば自分もプログラミングを始めた頃、同じように意味が分からなくて困ったことがありました!