2018年5月15日火曜日

クリップボードを監視してみる。

作業がペンディングになり開発?が止まるとブログの更新も止まってしまう。こまった。

そんなわけで、VBでクリップボードを監視してみる。
vistaより前は、なにやら不都合のある関数を使っていたらしいのだが、
vista以降は、AddClipboardFormatListenerなるAPI関数が用意されているらしい。
そんなわけで、vistaより前のPCでは動かないハズなプログラム。
そのうちXPで試してみよう。


  1. Public Class MainForm
  2. 'API宣言
  3. Private Declare Function AddClipboardFormatListener Lib "user32" (ByVal hWnd As IntPtr) As Boolean
  4. Private Declare Function RemoveClipboardFormatListener Lib "user32" (ByVal hWnd As IntPtr) As Boolean
  5. 'クリップボードに書かれたWnnProc定数:WM_DRAWCLIPBOARD = &H031D
  6. Private Const WM_DRAWCLIPBOARD As Integer = &H31D
  7.  
  8. Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  9. AddClipboardFormatListener(Me.Handle)
  10. End Sub
  11.  
  12. Private Sub MainForm_Closed(sender As Object, e As EventArgs) Handles Me.Closed
  13. RemoveClipboardFormatListener(Me.Handle)
  14. End Sub
  15.  
  16. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  17. Dim iData As IDataObject = Clipboard.GetDataObject()
  18.  
  19. If m.Msg = WM_DRAWCLIPBOARD Then
  20. Debug.Print("")
  21. If iData.GetDataPresent(DataFormats.Text) Then
  22. Debug.Print(CType(iData.GetData(DataFormats.Text), String))
  23. End If
  24. End If
  25.  
  26. MyBase.WndProc(m)
  27. End Sub
  28. End Class

AddClipboardFormatListenerで、
Windowメッセージでクリップボードの更新を受け取れるようにし、
内容の型をチェックしtextならDebug.Printする。
フォームを閉じるときRemoveClipboardFormatListenerしてるけど、いらない処理だよな( ゚-゚)~゚
ちなみにWndProc()は、ひっきりなしに呼ばれる関数なため、
Ifの外にはよけーな動作をさせないように。
てゆか、クリップボード関連のモノだけをHOOKするよーな方法がありそうなモンだが…
なんかすげーオーバーヘッド食ってる気がして(Debugger見る限り気のせい)なんかイヤ(ぉぃ

追記:XPで動かしてみた。
 Debugだけじゃなく、RichTextBoxとかゆーなんか贅沢そーなヤツに吐いてみた。
 とりあえず開発環境のWin10。
 うんうん、想定通りの動作。

  そしてXPくん。
ふつーに怒られた( ゚-゚)~゚
なんかもうちょっと異常な動作を期待したのに(*゚-゚)

…UserID?気にしない気にしない(ぉぃ


0 件のコメント:

コメントを投稿