2018年5月15日火曜日

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

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

そんなわけで、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。
 うんうん、想定通りの動作。

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

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


0 件のコメント:

コメントを投稿