アプリ版:「スタンプのみでお礼する」機能のリリースについて

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を使用しろとかなんとか。。。)

正しい動作をするコードを教えていただけないでしょうか。
よろしくお願い致します。

A 回答 (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チェックが必要です。
    • good
    • 0
この回答へのお礼

ありがとうございます!
無事に希望通りの動きを実現できました。
大変助かりました。

お礼日時:2009/10/04 18:46

> どんな文字をコピーしてもすぐ空になってしまう



あらかじめ「反応あり」という単語がクリップボードに入っていないと
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() としてフォームを閉じて終了してください。


> 正しい動作をするコードを教えていただけないでしょうか。

厳しいことを言いますが、ここはコードの代筆を依頼する場所ではありません。問題点と改善法は示しましたので、まずはご自分で考えてみてください。その上で、分からない部分があればもう少し範囲を絞って再度質問を出してください。
    • good
    • 0
この回答へのお礼

丁寧な解説ありがとうございました。
回答のコードそのものを寄越せというのは失礼だと重々承知しておりました。
ちょっと急いでいたのと、あまり難しい動作ではない(っと思った)ので正解をみて勉強したいという思いがあったのですが、回答する方には自力でやる気がないと取られてしまっても仕方がないですね。
失礼致しました。

お礼日時:2009/10/04 18:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!