- ベストアンサー
クリップボードの中身を判別
PHPなどは理解しておりますが、VBに関してはまったく素人で何もわからないものです。 今回、クリップボードの中身を常に監視して、ある文字列が含まれていたらそのまま、それ以外の文字列の場合は空にするアプリが必要になりました。 そこでネットでいろいろ探して次のように作りました。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'クリップボードの文字列データを取得する Dim ClipBoardValue As IDataObject Dim ClipBoardString As String Dim okng As Boolean Do 'クリップボードのデータを取得() ClipBoardValue = Clipboard.GetDataObject ClipBoardString = ClipBoardValue.GetData(DataFormats.Text).ToString okng = ClipBoardString.Contains("反応あり") If (okng) Then 'クリップボードに文字列をコピーする Clipboard.SetDataObject("反応あり") Else Clipboard.SetDataObject("") End If Loop End Sub End Class 一つのフォームにボタンを一つ設置し、起動したら監視開始、ボタンをクリックしたら終了という形にしています。 動作させると、以下の問題があります。 ・どんな文字をコピーしてもすぐ空になってしまう ・フォームが表示されない ・起動時にクリップボードの中身が空だとエラーが表示される (オブジェクトのインスタンスにはnewを使用しろとかなんとか。。。) 正しい動作をするコードを教えていただけないでしょうか。 よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
タイマーを配置し、EnabledをTrueにした上で、 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim target As String = "ある文字列" If Not String.IsNullOrEmpty(Clipboard.GetText) Then If Not Clipboard.GetText.Contains(target) Then Clipboard.Clear() End If End If End Sub これで動きます。 >どんな文字をコピーしてもすぐ空になってしまう 再現しないので原因不明ですが、Clipboard.SetDataObject("反応あり")は不要だと思います。 >フォームが表示されない Page_Loadが無限ループで終了しないからです。 >起動時にクリップボードの中身が空だとエラーが表示される 「ClipBoardValue.GetData(DataFormats.Text).ToString」のClipBoardValue.GetData(DataFormats.Text)がNothing(VBでのnull)を返しているためです。 ToStringを呼ぶ前にNullチェックが必要です。
その他の回答 (1)
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
> どんな文字をコピーしてもすぐ空になってしまう あらかじめ「反応あり」という単語がクリップボードに入っていないと Clipboard.SetDataObject("") で中身を空っぽにしているからです。目的のキーワードがクリップボードにないのなら、中身には手をつけない(SetDataやClearを呼び出さない)ことです。 > フォームが表示されない Form_Loadイベント内で無限ループしている(イベントを完了していない)からです。実行ラインがForm_Loadを完了しないと、フォームは表示されません。 > 起動時にクリップボードの中身が空だとエラーが表示される ClipBoardValue.GetData(DataFormats.Text) この時点でnull(VBではNothing)であり、 .ToString() がnullに対して実行されるのでNullReferenceExceptionが発生します。 テキストデータがクリップボードに格納されているかをチェックしてから取り出すようにしましょう。 <アドバイス> まず、.NETのようなイベント駆動のアプリケーションにおいてイベントハンドラ内で無限ループは使いません。ウィンドウメッセージをそこで止めることになり、OSが用意したコントロールやコンポーネントが正しく動作しなくなります。しかもこの方法では、CPU稼働率が100%になり、システムのパフォーマンスを大きく低下させます。クリップボードの監視にはタイマーを使うほうがよいでしょう。 アプリケーションの終了に Endステートメント を用いるのは推奨されていません。Me.Close() としてフォームを閉じて終了してください。 > 正しい動作をするコードを教えていただけないでしょうか。 厳しいことを言いますが、ここはコードの代筆を依頼する場所ではありません。問題点と改善法は示しましたので、まずはご自分で考えてみてください。その上で、分からない部分があればもう少し範囲を絞って再度質問を出してください。
お礼
丁寧な解説ありがとうございました。 回答のコードそのものを寄越せというのは失礼だと重々承知しておりました。 ちょっと急いでいたのと、あまり難しい動作ではない(っと思った)ので正解をみて勉強したいという思いがあったのですが、回答する方には自力でやる気がないと取られてしまっても仕方がないですね。 失礼致しました。
お礼
ありがとうございます! 無事に希望通りの動きを実現できました。 大変助かりました。