リアルタイムにクリップボードの監視
Posted: 2006年5月15日(月) 21:52
(ソフトを起動してる間)リアルタイムにクリップボードを自動監視し、クリップボードの内容(ただの文字列)が変わる度にEditBox1に出力したいのですが、どうやったら良いのでしょう?
コード: 全て選択
'クリップボードを監視します。
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Declare Function ChangeClipboardChain Lib "user32" (
ByVal hWndRemove As HWND,
ByVal hWndNewNext As HWND) As BOOL
Declare Function SetClipboardViewer Lib "user32" (
ByVal hWndNewViewer As HWND) As HWND
Declare Function GetClipboardViewer Lib "user32" () As HWND
Dim hNextWnd As HWND
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Select Case dwMsg
Case WM_CREATE
hNextWnd=SetClipboardViewer(hWnd)
Case WM_DESTROY
ChangeClipboardChain(hWnd,hNextWnd)
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)
' エディットボックスに文字列を設定
SetDlgItemText(hMainWnd,EditBox1,lpStr)
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
コード: 全て選択
'----------------------------------------------------------------------
' エディットボックスに文字列を追加
' 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
コード: 全て選択
' エディットボックスに文字列を追加
EditBox_AddText(GetDlgItem(hMainWnd,EditBox1),MakeStr(lpStr)+Ex"\r\n",TRUE)
' エディットボックスに文字列を設定
' SetDlgItemText(hMainWnd,EditBox1,lpStr)
コード: 全て選択
'----------------------------------------------------------------------
' エディットボックスに文字列を追加
' 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