C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■103012 / 3階層)  クリップボードの内容をリアルタイムに取得する方法
□投稿者/ KOZ (439回)-(2024/03/13(Wed) 19:11:54)
2024/03/13(Wed) 19:14:44 編集(投稿者)
No103010 (こここ さん) に返信

イベントはメッセージキューを介して通知されるので Invoke や BeginInvoke は必要ないです。

> もしかして、書き換えたことで
> 再度クリップボードの取得プログラムが呼ばれているということがあり得るのでしょうか?

呼ばれます。
書き換える前にフックを解除し、書き換えた後にフックを再開すればOKです。

下にサンプルを書きますが、クリップボードを他のプログラムが開いていると、Clipboard のメソッドは普通に失敗することがあるので、間隔を置いてリトライするなどしてください。


Imports System.Runtime.InteropServices

Public Class Form1

    Protected Overrides Sub OnHandleCreated(e As EventArgs)
        MyBase.OnHandleCreated(e)
        AddClipboardFormatListener(Handle)
    End Sub

    Protected Overrides Sub WndProc(ByRef m As Message)
        Select Case m.Msg
            Case WM_NCDESTROY
                MyBase.WndProc(m)
                RemoveClipboardFormatListener(Handle)

            Case WM_CLIPBOARDUPDATE
                RemoveClipboardFormatListener(Handle)
                If Clipboard.ContainsText() Then
                    Dim clipboardText As String = Clipboard.GetText()
                    Dim replaceString = YourTask(clipboardText)
                    If clipboardText <> replaceString Then
                        Clipboard.Clear()
                        Clipboard.SetText(replaceString)
                    End If
                End If
                AddClipboardFormatListener(Handle)

            Case Else
                MyBase.WndProc(m)
        End Select
    End Sub

    Private Function YourTask(clipboardText As String) As String
        Return clipboardText & "A"
    End Function

    Private Const WM_NCDESTROY As Integer = &H82
    Private Const WM_CLIPBOARDUPDATE As Integer = &H31D

    <DllImport("user32.dll", SetLastError:=True)>
    Private Shared Function AddClipboardFormatListener(hwnd As IntPtr) As Boolean
    End Function

    <DllImport("user32.dll", SetLastError:=True)>
    Private Shared Function RemoveClipboardFormatListener(hwnd As IntPtr) As Boolean
    End Function

End Class

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[2]: クリップボードの内容をリアルタイムに取得する方法 /こここ →Re[4]: クリップボードの内容をリアルタイムに取得する方法 /こここ
 
上記関連ツリー

クリップボードの内容をリアルタイムに取得する方法 / こここ (24/03/12(Tue) 20:22) #103004
Re[1]: クリップボードの内容をリアルタイムに取得する方法 / KOZ (24/03/13(Wed) 00:21) #103005
  └ Re[2]: クリップボードの内容をリアルタイムに取得する方法 / こここ (24/03/13(Wed) 16:09) #103010
    └ クリップボードの内容をリアルタイムに取得する方法 / KOZ (24/03/13(Wed) 19:11) #103012 ←Now
      └ Re[4]: クリップボードの内容をリアルタイムに取得する方法 / こここ (24/03/22(Fri) 11:58) #103024 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信