そんなわけで、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 件のコメント:
コメントを投稿