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