• ベストアンサー

クリップボードの中身を判別

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を使用しろとかなんとか。。。) 正しい動作をするコードを教えていただけないでしょうか。 よろしくお願い致します。

  • umioyo
  • お礼率78% (172/220)

質問者が選んだベストアンサー

  • ベストアンサー
  • mdp36
  • ベストアンサー率72% (26/36)
回答No.1

タイマーを配置し、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チェックが必要です。

umioyo
質問者

お礼

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

その他の回答 (1)

回答No.2

> どんな文字をコピーしてもすぐ空になってしまう あらかじめ「反応あり」という単語がクリップボードに入っていないと 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() としてフォームを閉じて終了してください。 > 正しい動作をするコードを教えていただけないでしょうか。 厳しいことを言いますが、ここはコードの代筆を依頼する場所ではありません。問題点と改善法は示しましたので、まずはご自分で考えてみてください。その上で、分からない部分があればもう少し範囲を絞って再度質問を出してください。

umioyo
質問者

お礼

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

関連するQ&A

  • VB初心者です。コードの書き方が分かりません。

    VB初心者です。 VBで(zのn乗)-(xのn乗+yのn乗)の計算が出来るようにしたいのですが、答えが必ず-1になってしまいます。 Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) End Sub End Class 正しいコードの書き方を教えて下さい。 また特定の答えのときにメッセージを表示したいのですが、どうすればいいですか?

  • このコードはどこが間違っていますか?(至急)

    急ぎのため再度の質問失礼します。 (zのn乗)-(xのn乗+yのn乗)の計算をさせて、答えが0のときにメッセージを表示したいのですが、どのようなコードを書けばいいのでしょうか? Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click x = TextBox1.Text y = TextBox2.Text z = TextBox3.Text n = TextBox4.Text TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) If (TextBox5 .Text= 0) Then Label6.Visible = True End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub Label6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label6.Click End Sub End Class このコードだと答えが必ず-1になってしまうのですが、どこを直せばいいのでしょうか? 正しいコードを教えて下さい。 よろしくお願いします。

  • 重複した文字列をカウントして取り出したい

    初めて質問させていただきます。 VB初心者です。 ソートされた文字列の書き込まれたファイルを読み、 (文字列は、 ”000” ”001” ”001” ”001” ”002” ”002” ”003” といったように書き込まれています。) そこから、3つ連続して並んでいる文字列を探し出して、 その文字列と、3つ連続していた文字列がいくつあったのか表示するプログラムを作りたいのですが、 どうにも処理速度が遅く、さらに行数が1万を超えると、応答なしになってしまいます。 どなたか、上手い処理の方法があれば、ぜひともご教授の程をお願いします。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click OpenFileDialog1.FileName = "" OpenFileDialog1.InitialDirectory = "c:\" If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then TextBox1.Text = My.Computer.FileSystem.ReadAllText _ (OpenFileDialog1.FileName, System.Text.Encoding.Default) End If End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim x As Integer Dim xyz As Integer '行数を調べる。 Dim i As Integer = TextBox1.Lines.Length TextBox2.Text = (i - 1 & "行") MessageBox.Show("一時停止") For ix = 0 To i - 2 '1行目と2行目を比較 If TextBox1.Lines(x) = TextBox1.Lines(x + 1) Then '2行目と3行目を比較 If TextBox1.Lines(x + 1) = TextBox1.Lines(x + 2) Then '3つある番号を記入。 TextBox2.Text = TextBox2.Text + vbCrLf + TextBox1.Lines(x + 2) '3回重複したことをカウント。 'MessageBox.Show("3発見") xyz = xyz + 1 Else End If Else End If '調べる行を+1 x = x + 1 Next TextBox2.Text = TextBox2.Text + vbCrLf + ("3つ以上は、" & xyz & "個") End Sub Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub End Class

  • Elseifのコードが分かりません。(至急)

    急ぎのため再度の質問失礼します。 3つの数字すべてが7のとき、メッセージ1を出し、 どれか2つだけが7のときは、メッセージ2を出し、 どれか1つだけが7のときは、メッセージ3を出し、 どこにも7が含まれていないときは、メッセージ4を出すようにEndifを使って書きたいのですが、正しいコードを教えて下さい。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Randomize() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click PictureBox1.Visible = False Label4.Visible = False Label1.Text = CStr(Int(Rnd() * 10)) Label2.Text = CStr(Int(Rnd() * 10)) Label3.Text = CStr(Int(Rnd() * 10)) If End If End Sub Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click End Sub Private Sub Label3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label3.Click End Sub Private Sub Label5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label5.Click End Sub End Class よろしくお願いします。

  • クリップボードにアクティブウィンドウが貼り付けられません。

    Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Sub Command1_Click() Clipboard.Clear Form2.Picture1.AutoRedraw = True Form1.SetFocus keybd_event vbKeySnapshot, 0, 0, 0 Do While Clipboard.GetFormat(vbCFBitmap) = False DoEvents Loop Form2.Picture1.Picture = Clipboard.GetData() End Sub keybd_eventを使って、こんな感じでForm2のピクチャーにForm1を貼付けしたいのですが、画面全体がコピーされてしまいます。 アクティブウィンドウのみコピーするにはどうしたら良いですか?

  • JISコードにエンコードすると、半角カタカナが全角になってしまう

    VB2005を使っています。 本を参考に「JISコードに変換する」コードを 記述してみましたが、どうも半角カタカナが全角になってしまうようです。 以下のようなコードです、 ご存知の方、よろしくお願いいたします。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '元の文字列 TextBox1.Text = "コネコ" '←ここの「コネコ」は半角で。 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim TextFile As IO.StreamWriter Dim Data() As Byte 'JISコードに変換 Data = Encoding.GetEncoding("iso-2022-jp").GetBytes(TextBox1.Text) 'ファイルに文字列を書き込む TextFile = IO.File.AppendText("C:\TEST.TXT") TextFile.Write(ChgString(Data)) TextFile.Close() MsgBox("osimai") End Sub Private Function ChgString(ByVal bytString As Byte()) As String Dim intCnt As Integer ChgString = "" For intCnt = 0 To UBound(bytString) ChgString &= Chr(bytString(intCnt)) Next End Function

  • VB2005のピクチャーボックス内の図形の移動

    VB2005で、formにPictureBox一つと、Button三つをおいて、Button1で、PictureBoxに丸を書いて、Button2とButton3で、PictureBox内で、丸を右左に移動させようと考えています。で丸を書くことと、同じプロシジャー内では、移動させることはできました。が、別のプロシジャーから移動させるってことは出来るのでしょうか?VB2005をやり始めたばかりなのでてんでわかりません。どなたか詳しい方いらっしゃいましたら教えてください。よろしくお願いします。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = PictureBox1.CreateGraphics() g.Clear(PictureBox1.BackColor) Dim w As Integer = PictureBox1.ClientSize.Width / 3 Dim h As Integer = PictureBox1.ClientSize.Height / 3 g.ResetTransform() g.DrawEllipse(Pens.Black, 0, 0, w, h) g.TranslateTransform(80, 50) g.DrawEllipse(Pens.Black, 0, 0, w, h) g.ResetTransform() g.Dispose() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim g As Graphics = PictureBox1.CreateGraphics() g.TranslateTransform(80, 50) End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End Sub End Class

  • Visual Basic でスクリーンショット

    学生で、visual basic を勉強しているものです Button1をクリックするとスクリーンショットを1秒ごとに撮り、 "c:\iMonitoring"に保存するというプログラムを書いています (Button2をクリックすると止まる) 写真の名前を撮った時刻にしたいのですがエラーが出てうまくいきません どうしていいか分からばいので教えてください (コードです) ********************************************************************************* Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer1.Enabled = False System.IO.Directory.CreateDirectory("C:\iMonitoring") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Timer1.Enabled = False End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim x As String = Now().ToString() Dim a As String = "C:\iMonitoring\" Dim b As String = ".bmp" Dim y As String = (a & x & b) 'Imports System.Drawing 'Imports System.Windows.Forms 'Bitmapの作成 Dim bmp As New Bitmap(Screen.PrimaryScreen.Bounds.Width, _ Screen.PrimaryScreen.Bounds.Height) 'Graphicsの作成 Dim g As Graphics = Graphics.FromImage(bmp) '画面全体をコピーする g.CopyFromScreen(New Point(0, 0), New Point(0, 0), bmp.Size) '解放 g.Dispose() '保存 bmp.Save(y) End Sub End Class

  • VB2008改行できません

    VB2008改行できません お願いします。 メロンパン 3個 240円 コロッケパン 2個 … という風にしたいのですが、 一行目が表示され、2行目の「コロッケパン」を入れた瞬間、 1行目が消え、 コロッケパンのみが表示されます。 なぜでしょうか。 正しいコードと、どのような理屈でそうなるのか頂けると嬉しいです。 Public Class Form1 Dim cm, a As String Dim kosu, en As Integer Private Sub ShapeComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShapeComboBox.SelectedIndexChanged cm = ShapeComboBox.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click kosu = TextBox1.Text Select Case ShapeComboBox.SelectedIndex Case 0 en = kosu * 120 Case 1 en = kosu * 180 Case 2 en = kosu * 240 End Select txtKaimono.Text = cm + kosu.ToString(" ##個") + en.ToString(" #,###円") + vbCrLf End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Application.Exit() End Sub End Class

  • C#で画像をクリップボードへのコピーと貼り付けについて

    GraphicsオブジェクトのDrawImageメソッドを使って画像を表示させています。 この画像をクリップボードへコピーしてほかのところに貼り付けしたいのですが、クリップボードへはClipboard.SetDataObject()を使用すればよいと思っています。 しかし、どのように使ったらいいのかよくわかりません。現在のソースは以下のようになっています。 //Bitmapオブジェクトの作成(画像ファイルを読み込む) Bitmap bmap = new Bitmap(@"C:\test2.bmp"); //元の画像からの切り取り範囲の指定 RectangleF rectSrc = new RectangleF                 (pointX,pointY,WidthX,WidthY); //貼り付け先を指定範囲の指定 RectangleF rectDst = new RectangleF(0, 0, DstX,DstY); //PictureBox1のGraphicsオブジェクトの作成 Graphics g= pictureBox1.CreateGraphics(); //画像の描画 g.DrawImage(bmap, rectDst,rectSrc,GraphicsUnit.Pixel); //クリップボードへのコピー Clipboard.SetDataObject(g); よろしくおねがいいたします。

専門家に質問してみよう