そんなわけで、VBでクリップボードを監視してみる。
vistaより前は、なにやら不都合のある関数を使っていたらしいのだが、
vista以降は、AddClipboardFormatListenerなるAPI関数が用意されているらしい。
そんなわけで、vistaより前のPCでは動かないハズなプログラム。
そのうちXPで試してみよう。
- Public Class MainForm
- 'API宣言
- Private Declare Function AddClipboardFormatListener Lib "user32" (ByVal hWnd As IntPtr) As Boolean
- Private Declare Function RemoveClipboardFormatListener Lib "user32" (ByVal hWnd As IntPtr) As Boolean
- 'クリップボードに書かれたWnnProc定数:WM_DRAWCLIPBOARD = &H031D
- Private Const WM_DRAWCLIPBOARD As Integer = &H31D
- Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- AddClipboardFormatListener(Me.Handle)
- End Sub
- Private Sub MainForm_Closed(sender As Object, e As EventArgs) Handles Me.Closed
- RemoveClipboardFormatListener(Me.Handle)
- End Sub
- Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
- Dim iData As IDataObject = Clipboard.GetDataObject()
- If m.Msg = WM_DRAWCLIPBOARD Then
- Debug.Print("")
- If iData.GetDataPresent(DataFormats.Text) Then
- Debug.Print(CType(iData.GetData(DataFormats.Text), String))
- End If
- End If
- MyBase.WndProc(m)
- End Sub
- End Class
AddClipboardFormatListenerで、
Windowメッセージでクリップボードの更新を受け取れるようにし、
内容の型をチェックしtextならDebug.Printする。
フォームを閉じるときRemoveClipboardFormatListenerしてるけど、いらない処理だよな( ゚-゚)~゚
ちなみにWndProc()は、ひっきりなしに呼ばれる関数なため、
Ifの外にはよけーな動作をさせないように。
てゆか、クリップボード関連のモノだけをHOOKするよーな方法がありそうなモンだが…
なんかすげーオーバーヘッド食ってる気がして(Debugger見る限り気のせい)なんかイヤ(ぉぃ
追記:XPで動かしてみた。
Debugだけじゃなく、RichTextBoxとかゆーなんか贅沢そーなヤツに吐いてみた。
とりあえず開発環境のWin10。
うんうん、想定通りの動作。
ふつーに怒られた( ゚-゚)~゚
なんかもうちょっと異常な動作を期待したのに(*゚-゚)
…UserID?気にしない気にしない(ぉぃ
0 件のコメント:
コメントを投稿