2010-12-29 12 views
0

デスクトップアプリケーションを非表示にしたいのですが、一定時間が経過すると表示されます。ウィンドウロードイベントでVisible = falseを設定しようとしていますが、それでも表示されます。C#デスクトップアプリケーションでウィンドウを非表示にする方法は?

+0

消え、私はあなたが使用しているので、これはWinFormsのアプリケーションであることを前提としていVisible = False、これは正しいですか? –

答えて

2

は、WinFormsのアプリケーションでは、私はスタートアップ可視性を制御する最も簡単な方法は、SetVisbileCoreメソッドをオーバーライドすることであることを見出しました。ここで

は簡単な例で、フォームはApplication.Run()代わりのApplication.Run(new Form1())を使用して、5秒ごMain方法で

using System; 
using System.Windows.Forms; 

namespace DelayedShow 
{ 
    public partial class Form1 : Form 
    { 
    private bool _canShow = false; 
    private Timer _timer; 

    public Form1() 
    { 
     InitializeComponent(); 
     _timer = new Timer(); 
     _timer.Interval = 5000; 
     _timer.Tick += new EventHandler(timer_Tick); 
     _timer.Enabled = true; 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     _canShow = true; 
     Visible = true; 
    } 

    protected override void SetVisibleCore(bool value) 
    { 
     if (_canShow) 
     { 
     base.SetVisibleCore(value); 
     } 
     else 
     { 
     base.SetVisibleCore(false); 
     } 
    } 
    } 
} 
+0

Hide()を呼び出すと、すべてのHideがVisible = falseになります。 SetVsibileCoreはShow/Hide/Visibleが使用されるときに呼び出されるコア関数です。フレームワークは自動的に 'SetVisibleCore'をオーバーライドすることでフォームを表示しようとします。自動呼び出しを傍受してカスタム処理を提供することができます。 –

+0

ありがとうございます。私はSetVisibleCoreをオーバーライドしなければならなかった。それは@Hansによって言及される副作用があります –

0

後に表示されます。その後、しばらくしてnew Form1()form1.Show()を使用してください。

1

あなたはthis.Hide()代わりのVisible = falseを試してみましたか?

また、フォームオブジェクトを渡さずにアプリケーションを起動することもできます。

Application.Run(); 

しばらく待ってから(Timerを使用)、フォームを開きます。

+0

ありがとうございます。私はタイマーを使用しています。そして、私はHideメソッドを使ってうまく動作することを理解しました。乾杯 –

+0

これらのうちの1つに答えを記入するのはどうですか? – decyclone

+0

申し訳ありませんが、気付いたばかりのhideが動作しません。 –

7

VisibleプロパティはWinformsでは大したことですが、これをtrueに設定するとネイティブWindowsウィンドウが作成されます。その1つの副作用は、OnLoadメソッドまたはLoadイベントでfalseに設定することは機能しません。 Hide()について特別なことは何もないので、Visibleをfalseに設定するだけなので、どちらも機能しません。

SetVisibleCore()をオーバーライドする方法があります。ただし、ネイティブウィンドウを作成できるようにすることは重要です。他の場合はフォームを閉じることはできません。

protected override void SetVisibleCore(bool value) { 
     if (!IsHandleCreated && value) { 
      value = false; 
      CreateHandle(); 
     } 
     base.SetVisibleCore(value); 
    } 

Show()を呼び出すかVisible = trueに設定すると、いつでもウィンドウを表示することができます。そして、あなたがそれを見えるようにしていなくても、Close()を呼び出します。これはコンテキストメニューでのみ表示されるポップアップウィンドウでNotifyIconを実装するのに適しています。

これは副作用を持っていることに注意してください、読み込み時()メソッドとLoadイベントは、それが実際に見える取得する最初の時間までは実行されません。コードを移動する必要があるかもしれません。

0

システムトレイ

  1. にあなたのC#アプリケーションを配置すると、開始するには、既存のC#のWindowsフォームを開きます(または新規作成)。
  2. Visual Studioツールボックスを開きます。
  3. NotifyIconコントロールをフォームにドラッグします。コントロールは、フォーム自体に視覚的な表現がないため、デフォルトでnotifyIcon1という名前が付けられ、フォームの下に配置されます。
  4. NotifyIconコントロールのTextプロパティを、ユーザーがアプリケーションアイコン上でマウスを一時停止したときに表示する名前に設定します。たとえば、この値は「Kill​​erApp 1.0」です。
  5. コントロールのアイコンプロパティを、システムトレイに表示するアイコンに設定します。

ヒント:あなたがアイコンファイルに変換したい BMPファイルがある場合、私は非常に アイコン3.5アプリケーションにQTamビットマップをお勧めします 。

- アプリケーションが最小化されたときにアプリケーションを非表示にするフォームのResizeイベントのイベントハンドラを追加します。そうすれば、タスクバーには表示されません。

private void Form1_Resize(object sender, System.EventArgs e) 
    { 
    if (FormWindowState.Minimized == WindowState) 
     Hide(); 
    } 

- NotifyIcon.DoubleClickイベントのイベントハンドラを追加し、次のようにアイコンをダブルクリックすると、アプリケーションが復元されるようにコーディングします。

private void notifyIcon1_DoubleClick(object sender, 
             System.EventArgs e) 
    { 
     Show(); 
     WindowState = FormWindowState.Normal; 
    } 
3

あなたにもこれを試すことができます。..

public partial class Form1 : Form 
{ 
public delegate void myHidingDelegate(); 

    public Form1() 
    { 
     InitializeComponent(); 
     myHidingDelegate dlg = new myHidingDelegate(mymethodcall); 
     dlg.BeginInvoke(null, null); 
    } 

public void mymethodcall() 
    { 
     myHidingDelegate dlg1 = new myHidingDelegate(HideForm); 
     this.Invoke(dlg1); 
    } 

    public void HideForm() 
    { this.Hide(); } 
} 

これの唯一の問題:フォームが一瞬点滅し、

関連する問題