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