VBにて、非アクティブでフォームを表示する方法

このQ&Aのポイント
  • form1でボタンを押してしばらくするとform2が表示されるようなツールを作っています。
  • form2が表示される際にフォーカスがform2にとられず、作業が中断されないように、form2は非アクティブ状態で表示したいと考えています。
  • しかし、現在上手くいっておらず、フォームをnewする時に非アクティブにする方法を模索しています。VB2010, FW2.0で作成しているため、代替案も含めて教えていただければ幸いです。
回答を見る
  • ベストアンサー

VBにて、非アクティブでフォームを表示する方法

長文で大変申し訳ございません。 form1でボタンを押してしばらくするとform2が表示されるようなツールを作っています。 form1のボタンを押した後の「しばらく」というのは1~60分の間でランダムで、 表示されるform2の数も決まっていない状態です。 よって、他の作業をしながらform2が表示されるのを待つということを想定しています。 ですので、いちいちform2が表示されるたびにフォーカスがform2にとられて 作業が中断するのはNGなので、form2は非アクティブ状態で表示したいと考えています。 (メッセンジャーでよくある右下のポップアップのようなイメージです) が、現在上手くいっておりません。 他で「ShowWindow(Me.Handle, 4)」とやっていたのをみて、showに書いてみましたが、 上手くいきませんでした。 どこでアクティブになるのかみたところ、newの直後で既にforcusedがtrueになっており、 これが原因ではないかと思っております。 以下のサンプルを見てみましたが、これは事前に表示するフォームをnewしており、 同じようにはできないのが現状です。 http://www.codeproject.com/KB/miscctrl/taskbarnotifier.aspx formをnewする時に非アクティブにする方法はあるのでしょうか。 また代替案等ございましたら、ご教授の程、宜しくお願いいたします。 (VB2010, FW2.0:元々2008で作っていたものであるため)

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

  • ベストアンサー
  • mindatg
  • ベストアンサー率48% (110/227)
回答No.1

Protected Overrides ReadOnly Property ShowWithoutActivation() As Boolean Get Return True End Get End Property ShowWithoutActivationをオーバーライドさせ、Trueを与えるとshowされた時に アクティブになるのを忘れてくれます。

itpn98
質問者

お礼

ご回答ありがとうございます。 form2に上記ソースを入れてみましたが、だめでした。 「Return True」にブレークポイントをかけてみましたが、 ブレークしませんでした。 以下にある「TaskBarNotifier.vb」をform2として 使ってみましたが、同じく「Return True」に ブレークをかけても、引っ掛かりませんでした。 http://www.codeproject.com/KB/miscctrl/taskbarnotifier.aspx

その他の回答 (1)

回答No.2

タスクトレイを使用したアプリケーションなどはどうでしょうか? Form2が表示されるタイミングでバルーンでメッセージを出すなど・・。

itpn98
質問者

お礼

ご回答ありがとうございます。 バルーンでメッセージを出すことで、フォーカスがスティールされないということでしょうか。試していないのですが、バルーンの表示は不可とされてしまいました。 もしくは、form2の代替としてバルーンを使うということでしょうか。form2の仕様には制約がありバルーンでの代替は不可とされてしまいました。

関連するQ&A

  • VB6でフォームをリロードしたい

    プログラムを作っていて メニューFORMと処理FORMがあります。 処理ページでは色々な処理や表示を変えていき 処理が終わったあと 基本的にはメニューに戻るのですが。 連続して処理するときにいちいちメニューに戻るのが面倒なので 処理FORMを表示させたときと同じ状態にしようと思うのですが 色々なフレームやテキストなどを戻すソースを書くより いわゆるメニューからボタンを押して処理FORMを表示させたときのように やりたいのですが どのようにすればいいでしょうか? メニューFORMをSHOW して 処理FORM をアンロードして メニューFORMでタイマー処理か何かで自動的に 処理FORMを表示するコードを実行させる と言うようなことしか思いつきません。 これではどうもぱっとしないので リロードというかリフレッシュというか 色々見て なんかDim frm as New FormA と言うような物を使って やると良いようなことが書いてあったのですが、今ひとつその内容が 理解できず 困っています。 そう言った方法をご存じの方がいらっしゃいましたら教えてください よろしくお願いします。

  • VB2010でMDI親フォームから子フォームを表示

    VB2010でソフトを作っております。 MDI親フォームから子フォームを表示させたいのですが…。 過去に少しだけVB6を使っていたことがありますが、クラスという概念に苦労しております インスタンスや初期化といったところをうまく扱えばとは思うのですが、よろしくご指導お願いいたします。 1.MDI親フォーム(Form1)のボタンを押し、子フォーム(Form2)を表示させる 2.子フォームが表示されていなかったら表示させる 3.子フォームが表示されていたら何もしない これだけの事ですがずいぶん悩んでおります。 全コードがこれです。 Public Class Form1 Private f2 As New Form2 Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.IsMdiContainer = True End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fChild As Form() = Me.MdiChildren For Each f As Form In fChild If f.Text = "Form2" Then Exit Sub End If Next f2 = New Form2 f2.MdiParent = Me f2.Show() f2.Activate() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 f2.MdiParent = Me End If f2.Show() f2.Activate() End Sub End Class ボタン1でもボタン2でも、期待する動作はするのですが、 ボタン1ではアクティブになっているフォームの名前を力技で取得している気がして… ボタン2では子フォーム(Form2)をすでに表示している状態でもさらにShowをしているのが気に入らなくて… もっとスマートな方法がありましたら、ご指導お願いします。

  • VB2010で、2つめのフォームを表示させると、フォームを閉じるまで1

    VB2010で、2つめのフォームを表示させると、フォームを閉じるまで1つめのフォームの操作ができないのですが、どなたか解決方法を御存じないでしょうか。 よろしくお願いします。 Form1のピクチャーボックスに描いた折れ線グラフ上のカーソル(Form11)が、 マウスの動きに合わせてグラフ線上をたどっていくようにしようとしています。 【Form1のボタンを押すと2つめのフォームを呼び出す】 Dim Mark As New Form11 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 'グラフカーソル表示 Mark.Show() 【呼び出されたフォームのコード】 Imports System.Drawing Public Class Form11 Private Sub Form2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 'フォームのクライアント領域のサイズを設定 Me.ClientSize = New System.Drawing.Size(20, 20) 'カーソルを描く Dim MarkPen As New Pen(Color.Red, 1) Dim g As Graphics = e.Graphics g.DrawEllipse(MarkPen, 0, 0, 20, 20) '円の描画 Me.TopMost = True '最全面 Me.TransparencyKey = Me.BackColor '透明色の設定 Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None '枠なし End Sub End Class

  • フォームのアクティブと非アクティブ表示について

    Form1からForm2を表示するという処理を以下のようにコーディングしてみました。 **Form1.frm*** Private Sub Command1_Click() Form1.Hide Form1.vbModal Form1.Show End Sub **Form2.frm*** Private Sub Command1_Click() Unlaod Me End Sub 画面にエクスプローラ等のウィンドウが表示されているときに、Form2を表示させようとすると非アクティブ状態で表示されてしまいます。 また、Form2をUnloadするとForm1が表示されるのですが、その際に、Form1のタイトルと、タスクバーに表示されているボタンが反転した後非アクティブ状態になってしまいます。 フォームは常にアクティブで表示させたいのですが、どうすればよいのでしょうか?

  • VB6.0で複数フォームのグラフ描写ができません

    VB6.0でForm1にある描画ボタンを押すと、Form2が表示され、Form2のピクチャーボックスにグラフが描かれるコードを作っているところです。 ところが、Form2にはグラフが描かれません。 以下の簡単なコード(ピクチャーボックス2の背景を白色にする)も実行されません。 Form1にピクチャーボックスを作り、描画ボタンを押すとそこにグラフが表示されるようにしたところ、グラフが描かれました。 フォームは2つ表示させると問題があるのでしょうか? なにか考えられる原因を教えていただけないでしょうか。 Form1に記述しているコード Dim GraphForm As New Form2 GraphForm.Show Form2.Picture2.BackColor = vbWhite

  • VB DataRepeaterにて条件で表示

    環境:Visual Stadio 2008 XP データはAccessのmdb DataRepeaterに関しての本やサイトが少ないので誰かおしえて下さい。 DataRepeater(Form2)にてテーブルのデータを表示しています。さらにボタンを追加してクリックするとその行のデータについて表示し追加でその行のデータを追加できるようにしています(Form3)。 しかし追加して戻った際、DataRepeaterは変更前の状態で表示されています。ここにフィルターをかけたいのですがこのフォーム(Form2)が開く都度、フィルターがかかった状態で表示したいのですが、コーディング方法を教えて下さい。 【例えば】 テーブルdd a b c 1 あ 2 い ※aは自動でNoを振っている <<Form2>> (form3呼出ボタン)a 1 c (form3呼出ボタン)a 2 c ※cは空白です(まだ何も登録してないから) <<Form3>>  a 1 c か(←ここを入力)  (登録ボタン) ※「(登録ボタン)」にてcの「か」を登録してform2に 戻るのですが、以前、上のform2の状態のままです。 結果としては <<Form2>> (form3呼出ボタン)a 2 c のみ表示して欲しいです。フィルターはcかnullかどうか もしくは0かどうか? というコーディング方法をおしえて下さい。

  • フォームの生成と破棄

    C++Builder5.0の質問です。 フォーム(Form1)に複数のボタンを配置し、メニュー画面としました。 ボタンを押すと他の画面(Form2~5)に移れるようにしました。 ボタンには TForm2 *Form2 = new TForm2(this); Form2 -> Show(); Close(); ↑ Form2からForm5まであります。 と記述し、 Form2から5には「戻る」ボタンを設け、Form1(メニュー画面)に 戻れるようにしました。 Form2~5の「戻る」ボタンには TForm1 *Form1 = new TForm1(this); Form1 -> Show(); Close(); と記述しました。 また、全てのフォームのFormCloseイベントには自分のフォームを破棄するために delete Form2; 等と記述しました。 この状態でメニュー画面からForm2~5を開いたり閉じたりすることを 繰り返すと、不定期的に動作が固まってしまいます。 この原因はなんでしょうか。 Ver.はBCB5.0(Pro.)です。 御回答をよろしくお願いします。

  • (C#)フォームのキャンセルで計算を中断する方法

    VisualStudio(Standard)でC#の勉強をしている者です。よろしくお願いします。 エクスプローラでファイルをコピーすると、ファイルが飛ぶ絵が表示されて、そこのキャンセルボタンをクリックするとコピーが中断しますが、それと同じ事を行うにはどうしたらよいか、以下のようなコードで試してみました。 Form form = new Form(); form.Show(); for (int i = 0 ; i < 1000 ; ++i)   if (form.Stop)     break; //==================== class Form {   public bool Stop = false;   private void Cancel_Click() {     Stop = true;   } } ループに入る前にキャンセルボタンを配置したフォームをShow()しておいて、ループ中にキャンセルがおされてStop=trueになったらループを中断する、というようなことを考えました(上記コードは概要だけを表していて、実際には別のコードで試しました)。ただ、このコードではフォームのキャンセルボタンをクリックしても、クリックのイベント自体が発生していないのか、ループを止めることはできませんでした。 上記のような事をするにはどのようにすれば良いのでしょうか。ご存じの方がいらっしゃったらご教授をお願いいたします。

  • VB2005で、フォームを初期化したいのですが、教えてください。

    VB2005で、フォームを初期化したいのですが、教えてください。 VB2005で、フォームにデータベース内容(ORACLE)を表示するプログラムを作っています。その際、F8キーを押すと画面内容(テキストボックスやDatagridviewの編集内容)を初期ロード状態に戻すようにしたいと思い、F8キー押下時のイベントに、以下のようにプログラムしました。 dim frm as form frm = new form1 me.close frm.show() としてみましたが、me.closeで、プログラムが終了してしまうようです。 どうするのが適切かお教えください。

  • フォームボタンクリックでセル色表示

    作業中中断により日付を変更したのかどのボタンまでクリックしたのかがわからなくなります。 A2セルの日付を変更したらB5セルが赤表示、ボタン1をクリックしたらC5セルが青表示、ボタン2をクリックしたらD5セルが緑表示、ボタン3をクリックしたらE5セルが黄表示等どこの作業まで実施したのかわかるようにしたいのですがVBAのコードがお解りになる方よろしくお願いします。