アプリ終了後もクリップボードに保持したい

タグの編集
投稿者 wanta  (社会人) 投稿日時 2009/5/22 03:49:01
はじめまして。

2008を使用しています。

フォームにボタンを1つ置いて、クリックすると文字をクリップボード経由で
他のアプリに貼り付けを行っていますが、既にクリップボードにデータが
ある場合は一端変数に保存しておき、貼り付け後にまた戻しておくように
したいのですが、下記コードでテストすると、テキストデータの場合は
保存されるのに、それ以外(ファイル等)のデータの場合は、アプリを終了させると
クリップボードのデータが消えてしまいます。

クリップボードにデータを戻す際に
「My.Computer.Clipboard.SetDataObject(iData, True)」
とすると「引数が多すぎます」と出てしまいます。

なにか解決方法はあるでしょうか?
宜しくお願いします。


    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim AddStr As String = "aaa"

            If My.Computer.Clipboard.ContainsText() = True Then
                Dim tData As String = My.Computer.Clipboard.GetText

                My.Computer.Clipboard.SetText(AddStr)
                SendKeys.Send("%({TAB})")
                Sleep(100)
                SendKeys.Send("^(v)")
                My.Computer.Clipboard.SetText(tData)
            Else
                Dim iData As IDataObject = My.Computer.Clipboard.GetDataObject()

                My.Computer.Clipboard.SetText(AddStr)
                SendKeys.Send("%({TAB})")
                Sleep(100)
                SendKeys.Send("^(v)")
                My.Computer.Clipboard.SetDataObject(iData)
            End If
    End Sub
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/5/22 05:28:21
> Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
System.Threading.Thread.Sleep メソッドが用意されているため、API に頼る必要はありません。

ただし、API にしろメソッドにしろ、UI スレッドから Sleep(100) を呼びだす事は避けて下さい。
(下記の解説を参照)
http://msdn.microsoft.com/ja-jp/library/cc429358.aspx

> クリップボードにデータを戻す際に
> 「My.Computer.Clipboard.SetDataObject(iData, True)」
> とすると「引数が多すぎます」と出てしまいます。

Clipboard.SetDataObject(iData, True) と記述してください。

なお、My.Computer.Clipboard と System.Windows.Forms.Clipboard は別のクラスです。
投稿者 wanta  (社会人) 投稿日時 2009/5/23 00:34:31
こんにちは。

丁寧に教えていただき有難うございます。

>System.Threading.Thread.Sleep メソッドが用意されているため、API に頼る必要はありません。
このような便利なものがあったんですね。
特にAPIは間違った使い方をすると大変な事になるので、出来るだけ使わないようにしたいと
思っていたので助かりました。

>Clipboard.SetDataObject(iData, True) と記述してください。
うまく保持できました。

有難うございました。