アプリ終了後もクリップボードに保持したい への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
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 は別のクラスです。
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/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
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
丁寧に教えていただき有難うございます。
>System.Threading.Thread.Sleep メソッドが用意されているため、API に頼る必要はありません。
このような便利なものがあったんですね。
特にAPIは間違った使い方をすると大変な事になるので、出来るだけ使わないようにしたいと
思っていたので助かりました。
>Clipboard.SetDataObject(iData, True) と記述してください。
うまく保持できました。
有難うございました。