Timerイベントからはクリップボードの取得をする方法は?

解決


GOUF  2005-05-05 12:02:21  No: 89693

Timerイベントからはクリップボードの取得をする方法は?
環境はVB.net2003です。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemthreadingtimerclasstopic.asp

ここを参考にTimerを利用して一定時間ごとに処理をしています。
これ単体ではうまくいっています。

http://dobon.net/vb/dotnet/string/clipboard.html

また、ここを参考にクリップボードの中身を取得するという処理を試しました。
単純な取得は成功しています。

しかしTimerを利用して一定時間ごとにクリップボードの中身を取得し、
表示しようと思ったのですが、必ずNothingになってしまいます。
その間もコピー&ペーストは正常に行えます。
ので、あくまでもTimerとクリップボードの組み合わせの処理のときがうまくいかないのです。

ご教授よろしくお願いします。

        ' ロード時メソッドの中に記述
        Dim s As New TimerExampleState
        ' Create the delegate that invokes methods for the timer.
        Dim timerDelegate As New TimerCallback(AddressOf showStatus)
        ' Create a timer that waits one second, then invokes every second.
        Dim timer As New timer(timerDelegate, s, 1000, 1000)

    Private Sub showStatus(ByVal state As Object)
        Dim tmpStr As String

        Dim iData As IDataObject = Clipboard.GetDataObject()

        If iData Is Nothing Then
            tmpStr = "Nothing"
        ElseIf iData.GetDataPresent(DataFormats.Text) = False Then
            tmpStr = "Not Text"
        Else
            tmpStr = CType(iData.GetData(DataFormats.Text), String)
        End If

        Console.WriteLin(tmpStr)

    End Sub

Class TimerExampleState
    Public counter As Integer = 0
    Public tmr As Timer
End Class 'TimerExampleState


ねろ  2005-05-06 20:12:44  No: 89694

これはどうしても、マルチスレッドで処理したいのですか?


GOUF  2005-05-06 23:02:27  No: 89695

ねろさんありがとうございます。

私の記述はマルチスレッド用になってるってことなんですか?
マルチスレッドである必要はまったくありません。
formを1つ表示してその上で動けば。

VB6の時代に単純にタイマーイベントで実現できたので
似たような感じでためしてみたのですが…

タイマーを使用するこだわりもありません。
クリップボードの中身がほぼリアルタイムで
テキストボックスなどに表示する事ができれば。

よろしくお願いします。


ねろ  2005-05-07 00:11:40  No: 89696

>私の記述はマルチスレッド用になってるってことなんですか?
はい、System.Threading はマルチスレッド用のインターフェースです

>VB6の時代に単純にタイマーイベントで実現できたので
>似たような感じでためしてみたのですが…
同じ方法で出来ます。ツールボックスからTimerをフォームの上にドロップして
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      Dim tmpStr As String
      Dim iData As IDataObject = Clipboard.GetDataObject()
      Static ClipData As String
      If iData Is Nothing Then
          tmpStr = "Nothing"
      ElseIf iData.GetDataPresent(DataFormats.Text) = False Then
          tmpStr = "Not Text"
      Else
          tmpStr = CType(iData.GetData(DataFormats.Text), String)
      End If
      If ClipData <> tmpStr Then
          Console.WriteLine(tmpStr)
          ClipData = tmpStr
      End If
End Sub
こんなことですか。


GOUF  2005-05-07 05:45:35  No: 89697

あら。お恥ずかしいです。

Timer_Tickは一度試したのですが、そのとき
他のエラーも複合して発生していたため、
だめだと思い込んであきらめてしまったのだと思います。

実現できました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加