• 締切済み

Visual C#にてフォーム非表示時のタイマー

Visual C# 2010でGUIプログラムを作っています。 フォームを最小化した時にタスクトレイにのみアイコンを表示する機能がついています。 タイマーで1分ごとに処理する必要があるのですが、最小化時(Form.visible = false)にだけ処理を実行してくれません。 最小化していない通常のフォーム表示の時はタイマーが正常に動作し、1分ごとに一定の処理をしてくれます。 目的は最小化時にタスクトレイにのみアイコンを表示し、1分ごとに処理をし、 特定の条件に当てはまった場合はアイコンの上にバルーン表示する事です。 タスクトレイにのみ表示している時でもタイマーで一定時間ごとに処理することはできた気がするのですが、 何が原因かわかりませんがいつの間にか出来なくなっていました。 どういった対策をすればよいでしょうか? private void Form1_Resize(object sender, EventArgs e) { if (OptionData.TaskTray == true) { if (this.WindowState == FormWindowState.Minimized) { //フォームを非表示にする this.Visible = false; //タスクトレイにアイコンを表示する notifyIcon1.Visible = true; } } } private void timer1_Tick(object sender, EventArgs e) { DataUpdateButton.PerformClick(); } private void notifyIcon1_DoubleClick(object sender, EventArgs e) { //フォームを表示する this.Visible = true; if (this.WindowState == FormWindowState.Minimized) { //ノーマルウィンドウに戻す this.WindowState = FormWindowState.Normal; //アクティブにする this.Activate(); if (OptionData.NoTaskTrayIcon == true) { //タスクトレイからアイコンを削除する notifyIcon1.Visible = false; } } }

みんなの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

んー、「何故にわざわざクリックイベントを経由するのか」がわからないのですが。 回りくどいことをせずに直接処理を呼んでしまえばいいのでは? #表示されてないボタンは押せないのが普通だろうと思いますし なおSystem.Timers.Timerによるイベントはフォームのオーナースレッドとは別のところで動作するため、フォームへの更新を行う場合にはデリゲートを経由してフォームのオーナースレッドに処理を委譲しなければなりません。

xkuonx
質問者

お礼

回答ありがとうございます。 ボタンクリック時の処理、を関数のように扱ってプログラミングしていたため、関数を呼ぶ感覚で「ボタンクリック時の処理」を実行するような設計になっていました。 ご指摘のとおり直接処理を呼ぶ(ボタンクリック時も処理する関数を呼ぶようにする)ようにすれば良いのかなと思います。 いろいろ試してみたところ、原因がわかりました。 ウィンドウの最小化時にタスクバーから消す部分を 「//フォームを非表示にする this.Visible = false;」 にて実装していたのですが、どうやらこれが原因のようです…。 この部分をVisibleではなく「this.ShowInTaskbar = false;」に変更しただけで、希望通りの動作をすることができるようになりました。 ですので自己完結致しましたので、質問は締め切らせて頂きます。 ありがとうございました。

  • happycup
  • ベストアンサー率42% (9/21)
回答No.1

タイマーは System.Windows.Forms.Timer を使っているのかな? 試していないので定かでは無いですが、フォーム様に最適化されたタイマーらしいのでウインドウの最小化時には働かない仕様なのかもね? System.Timers.Timer で処理してみてはどうですか? 詳細は URL を参照願います。

参考URL:
http://msdn.microsoft.com/ja-jp/library/system.timers.timer(v=VS.90).aspx
xkuonx
質問者

お礼

補足ですが、System.Timers.Timerを試してみましたがエラーとなりました。 「InvalidOperationExceptionはユーザーコードによってハンドルされませんでした。 有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'DataUpdateButton' がアクセスされました。」 と表示されます。詳しくはわかりませんが、スレッド間通信の記述が必要になるのでしょうか…。

xkuonx
質問者

補足

回答ありがとうございます。 使用しているタイマーはご指摘のとおりツールボックスにもある「System.Windows.Forms.Timer」です。 現在のままいろいろ試してみたところ、最小化時にMessageBox.Showが正常に表示されたり、自作の関数を正常に叩けたりしたのですが、どうやらPerformClick()メソッドを呼び出す事が最小化時にはできないようです。 これは「System.Windows.Forms.Timer」では出来ないのでしょうか? できれば「System.Windows.Forms.Timer」を使いたいと考えています。 PerformClick()が使えないのなら、タイマーで自作関数を呼び出し、そこの中にPerformClick先の処理を記述する形で対応しようと考えています。

関連するQ&A

  • VB.NET:モーダルで表示したフォームを最小化

    Form2をForm1の所有として、モーダルで表示しました。 '------------------------ Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdChildMdl.Click  'Form2を開く  Dim frmN As New Form2  frmN.ShowDialog(Me) 'MeはForm1 End Sub '------------------------ Form2が最小化された時に、親フォームであるForm1も最小化させたいと思い、 Form2のResizeメソッドに以下のようなコードを書きました。 '------------------------ Private Sub Form2_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize  Select Case Me.WindowState   Case FormWindowState.Minimized    '親フォームも最小化((1))    Me.Owner.WindowState = FormWindowState.Minimized   Case FormWindowState.Maximized    '親フォームも最大化((2))    Me.Owner.WindowState = FormWindowState.Maximized   Case FormWindowState.Normal    '親フォームも通常サイズ((3))    Me.Owner.WindowState = FormWindowState.Normal  End Select End Sub '------------------------ しかし、(2)、(3)は問題なく実行できるのですが、 (1)を実行すると、自フォーム(Form2)が閉じてしまうのです。 そういう仕様なのでしょうか? ご存知の方、教えてください。よろしくお願いします。

  • C# 2010 PrintPreViewDialogの連続表示について

    C# 2010 PrintPreViewDialogの連続表示について NotifyIconからPrintPreViewDialogを表示して印刷します 印刷が完了してもDialogは表示されています この表示中にNotifyIconを再度押すと(1)で下記のエラーとなります 『既に表示されているフォームをモーダルダイアログボックスとして表示できません showDialogを呼び出す前にフォームのvisibleプロパティをfalseにしてください』 となりますが、Form1、printPreviewDialogのプロパティにはVisibleが見当たりません 何処をどうすれば良いのでしょうか? また印刷が完了した後にDialogを消去して、NotifyIconを押すと同じく(1)でエラーが発生します 『破棄されたオブジェクトにアクセスできません』 じゃあ、全体的にどのようにすれば良いのですか? この件に連休前からハマリ込んでおります、お助けください!!! private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { this.printPreviewDialog1.Document = this.printDocument1; printPreviewDialog1.ShowDialog(); -----(1) printPreviewDialog1.Close(); -----(2) } 追伸】(2)はDisposeのほうが良いのですか? それとも不要なのですか?

  • Visual C++ 2008 EEでメッセージ表示

    Visual C++ 2008 EEを使用し、以下のコードを組みました。これは1つのフォーム(仮に質問フォームとする)に3つのボタンを作成し、ボタンを押すとそれぞれの3種類の質問項目フォームにいって、質問回答が終わったら再び質問フォームに戻ります。このとき、一度回答した質問項目のボタンは選べないようにしていて、全部の質問に答えた場合(全てのボタンが選べなくなった場合)に「これで質問は終わりです」というようなメッセージを表示したいのですが、方法が分からないのでご教授願います。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { this->Hide(); Sai500^ cSai500 = gcnew Sai500(); cSai500->gvflnm(this->flnm); cSai500->ShowDialog(); this->button1->Visible = false; this->Show(); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { this->Hide(); Sai030^ cSai030 = gcnew Sai030(); cSai030->gvflnm(this->flnm); cSai030->ShowDialog(); this->button2->Visible = false; this->Show(); } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { this->Hide(); Sai040^ cSai040 = gcnew Sai040(); cSai040->gvflnm(this->flnm); cSai040->ShowDialog(); this->button3->Visible = false; this->Show(); }

  • C# 2010 PrintPreviewDialogからの印刷でバルー

    C# 2010 PrintPreviewDialogからの印刷でバルーンを表示する方法? ContextMenuStripを作り、上に『印刷』下には『印刷プレビュー』としました 印刷を選択するとnotifyIconにバルーンを表示するようにしました ところでPrintPreviewDialogには印刷釦があります この印刷釦を押下した時にも同様にバルーンを表示するには、如何なる方法があるのでしょうか? 全く見当も着きません、教えてください、お願いします!!! private void 印刷ToolStripMenuItem_Click(object sender, EventArgs e) { BalloonShow(); //notifyIconにバルーンを表示; this.printDocument1.Print(); } private void 印刷プレビューToolStripMenuItem_Click(object sender, EventArgs e) { PrintPreviewDialog ObjectPrintPreviewDialog = new PrintPreviewDialog(); ObjectPrintPreviewDialog.Document = this.printDocument1; ObjectPrintPreviewDialog.ShowDialog(); } private void BalloonShow() //バルーンを表示 { notifyIcon1.BalloonTipText = "どうしたらバルーンが出ますか?"; }

  • C# イベント動作について(スレッド使用時)

    現在、VS2005 Pro C#を使用してWindowsアプリケーションを作成しております。 Form1, Form2を作成し、それぞれの最大化最小化の動作を連動させる(Form1が最大(小)化したらForm2も最大(小)化する)ため以下のようなコードを作成しました。 ・Form1 //Form2の作成とResizeイベントの追加 Form2 fm2; public Form1() { InitializeComponent(); fm2 = new Form2(); fm2.Show(this); } private void Form1_Resize(object sender, EventArgs e) { fm2.WindowState = this.WindowState; } ・Form2側      //Resizeイベントの追加 private void Form2_Resize(object sender, EventArgs e) { this.Owner.WindowState = this.WindowState; } シングルスレッドのプログラムの場合これで問題なく動作します。 しかし、現在作成しているプログラムで、Form2にForm1で作成した別スレッドで計算した結果を表示させるという事をしているのですが、この場合片側のResizeイベントがうまくいかず最大最小化の動作が連動しない時があります。 デバッグで確認すると、シングルスレッドの場合、Form1,Form2のどちらかの最大最小ボタンを押せば、お互いのResizeイベントが交互に動作します。 しかし、作成しているプログラムの場合、押した側でしかResizeイベントが発生しない時がありこれが原因だと考えています。 (具体的にいうと >fm2.WindowState = this.WindowState; または >this.Owner.WindowState = this.WindowState; ↑を通っているが、別のForm側でも起こるはずのResizeイベントが発生しません。 ) シングルスレッドの場合は問題なく動作していることから、おそらく、計算に使っている別スレッドが原因かと考えていますが、スレッドを使う上での注意点がありましたらアドバイスいただけないでしょうか?

  • 最小化したフォームを元に戻す

    VB2005Expressにて開発を行っています。 最小化したフォームを元に戻せなくて困っています。 どなたかご存知の方がいらっしゃいましたらご教授願います。 下記の動作を実現したいと思っています。 ・Form1でボタンが押されたらForm2を表示する ・この際にForm1を最小化する ・Form2を閉じる ・この際にForm1を元に戻す(手前に表示する) 以下が作成したプログラムです。 ---モジュールにて下記を宣言 Module Module1 'オブジェクトの宣言 Public f1 As New Form1 Public f2 As New Form2 End Module ---Form1でForm2を開くボタンを押した場合の処理 Private Sub Button1_Click(ByVal sender~ 'Form2を表示 If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 End If f2.Show() 'Form1を最小化する Me.WindowState = FormWindowState.Minimized End Sub ---Form2にて閉じるボタンを押した場合 Private Sub Button4_Click(ByVal sender~ f1.WindowState = FormWindowState.Normal ↑コレで実現できるかと思ったのですが、最小化されたままです・・・ End Sub

  • C# 2010 printPreviewDialogの消去法

    C# 2010 printPreviewDialogの消去法 印刷プレビューのダイアログを表示して左上のプリンタ釦を押下して印刷します 印刷が完了してもダイアログは表示され続けています この状態でもう一度ボタン1を押すと(1)のところで下記のエラーが起こります 『既に表示されているフォームをモーダルダイアログボックスとして表示出来ません。showDialogを呼び出す前に、フォームのVisibleプロパティをfalse にしてください』 素直な私は(1)の前に this.printPreviewDialog1.Visible = false; を加筆して再度実行したのですが 『既にモーダルに表示されているフォームはモーダル ダイアログ ボックスとして表示できません。showDialog を呼び出す前に、フォームを閉じてください。』 とのエラーになりました フォームを閉じろといわれても printPreviewDialog1.ShowDialog(); から戻ってきません。(2)が表示されないのです。 private void button1_Click(object sender, EventArgs e) { this.printPreviewDialog1.Document = this.printDocument1; printPreviewDialog1.ShowDialog(); -----(1) MessageBox.Show("printPreviewDialog End"); ----(2) } A どうしたら戻ってくるのでしょうか? B もし戻って来ないならどのようにすれば良いのでしょうか? 更に一般的にはどのように処理しているのですか? 基礎学力の欠如している私をお助けください

  • タスクトレイアイコンの非表示

    下記問題の対応で困っております。 開発環境はVB.net 2003 です。 <問題> タスクトレイのアイコンを右クリックしてメニューを表示した状態でキーボードのAlt+F4キーを押下すると、メニューと併せてタスクトレイのアイコンまでが消えてしまいます(この時、実行ファイル自体は終了していません)。また、デバッグでアイコンが消えた後にicon.visibleの状態を見るとTrueのままでいます。但し、一度、icon.visibleをFalseにした後に再度Trueにするとアイコンは表示されるようになります。 できれば、Alt+F4キーを押されてもアイコンが消えないようにしたいのですが、逃げ道として、アイコンの表示、非表示をVisible以外で判断して非表示なら表示するような処理もありかなと考えております。 良い解決策があれば、教えてください。

  • C# フォーム追加後、旧フォームを閉じたい

    前略 ・C#で教えてください。 ・Form1 からshowDiag()メソッドでForm2をつくります。Form2が表示されたら非アクティブとなったForm1を閉じたいのですが どのようにしたらよいのかおしえてください。  下記は、Close() メソッドで Form2側から閉じようとしたプログラムですがFrom1を閉じることができません。 よろしくお願いします。 //----------------------------------------------- namespace formClose { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.ShowDialog(); } }   public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { Form1 form1 = new Form1(); form1.Close(); //Form1が閉じない!! } private void button1_Click(object sender, EventArgs e) { this.Close(); //Form2を閉じる }    } } 以上

  • 3フォームの重なり順を変えない方法+同時最小化

     今晩は、質問させていただきます。どうぞよろしくお願いいたします。 Form1(メインフォーム)の下にForm2を、 Form2の下にForm3を表示し、これらの順番が変わらないように致したく、 次のようにコーディングいたしました。 【Form1のコード】  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load    Dim form2o As New Form2    Dim form3o As New Form3    Me.Owner = form2o    form2o.Show()  End Sub 【Form2のコード】  Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load    Dim form3o As New Form3    Me.Owner = form3o    form3o.Show()  End Sub  この状態のまま、タスクバー上のアプリケーション名をクリックした際の 最小化⇔普通化を(3フォームとも一緒に)させたいのですがうまくいきません。。  Form1に、下の【コード1】のようにコーディングいたしましたら、 タスクバーのForm1クリック(最小化) →3つとも最小化(成功)いたしますが、 Form1とForm2がタスクバー上から消えてしまい、Form1クリックによる最大化ができなくなります。  またForm3に、下の【コード2】のようにコーディングいたしましたら、 タスクバーのForm3をクリックしてもForm1が一回ちらつくだけで、最小化すらできません。。  まったく違うイベントを取る方法や、Owner指定方法自体を行わない方法でも結構でございますので、 何かこの動作をうまくできる方法はないでございましょうか?  ずっと悩んでおりますが、解決致しません。もしお詳しい方がいらっしゃいましたら, 是非ともアドバイスいただきたく、どうぞよろしくお願いいたします。 【コード1】   Public Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize     Dim form2o As New Form2     If Me.WindowState = FormWindowState.Minimized Then       Owner.WindowState = FormWindowState.Minimized       Owner.Owner.WindowState = FormWindowState.Minimized     ElseIf Me.WindowState = FormWindowState.Normal Then       Owner.WindowState = FormWindowState.Normal       Owner.Owner.WindowState = FormWindowState.Normal     End If   End Sub 【コード2】   Public Sub Form3_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize     If Me.WindowState = FormWindowState.Minimized Then       Form1.WindowState = FormWindowState.Minimized       Form2.WindowState = FormWindowState.Minimized     ElseIf Me.WindowState = FormWindowState.Normal Then       Form2.WindowState = FormWindowState.Normal       Form1.WindowState = FormWindowState.Normal     End If   End Sub  何卒お願いいたします。

専門家に質問してみよう