web-dev-qa-db-ja.com

起動時の単一フォームの非表示

1つのフォームを持つアプリケーションがあり、Loadメソッドでフォームを非表示にする必要があります。

フォームは、Outlook 2003スタイルのポップアップの行に沿って考える必要があるときに表示されますが、ロード中に面倒なことなくフォームを非表示にする方法がわかります。

助言がありますか?

72
Pondidum

私はC#からこれに来ていますが、vb.netでも非常に似ているはずです。

メインプログラムファイルのMainメソッドには、次のようなものがあります。

_Application.Run(new MainForm());
_

これにより、新しいメインフォームが作成され、アプリケーションの有効期間がメインフォームの有効期間に制限されます。

ただし、Application.Run()のパラメーターを削除すると、フォームは表示されずにアプリケーションが起動し、好きなだけフォームを表示したり非表示にしたりできます。

Loadメソッドでフォームを非表示にするのではなく、Application.Run()を呼び出す前にフォームを初期化します。フォームには、タスクバーにアイコンを表示するためのNotifyIconがあると想定しています-これは、フォーム自体がまだ表示されていなくても表示できます。 NotifyIconイベントのハンドラーからForm.Show()またはForm.Hide()を呼び出すと、それぞれフォームの表示と非表示が切り替わります。

108
Grokys

通常、トレイアイコンまたは他の方法を使用して後でフォームを表示する場合にのみこれを行いますが、メインフォームを表示しない場合でもうまく機能します。

デフォルトでfalseに設定されているboolをFormクラスに作成します。

private bool allowshowdisplay = false;

次に、SetVisibleCoreメソッドをオーバーライドします

protected override void SetVisibleCore(bool value)
{            
    base.SetVisibleCore(allowshowdisplay ? value : allowshowdisplay);
}

Application.Run()はフォームをロードした後、フォーム.Visible = trueを設定するため、これをインターセプトしてfalseに設定します。上記の場合、allowshowdisplayをtrueに設定して有効にするまで、常にfalseに設定されます。

これで、起動時にフォームが表示されなくなります。allowshowdisplay= trueを設定して、SetVisibleCoreを適切に機能させるために再度有効にする必要があります。フォームを表示するユーザーインターフェイス関数でこれを実行する必要があります。私の例では、notiyiconオブジェクトの左クリックイベントです。

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        this.allowshowdisplay = true;
        this.Visible = !this.Visible;                
    }
}
94
Paul Aicher

私はこれを使用します:

private void MainForm_Load(object sender, EventArgs e)
{
    if (Settings.Instance.HideAtStartup)
    {
        BeginInvoke(new MethodInvoker(delegate
        {
            Hide();
        }));
    }
}

明らかに、if条件を変更する必要があります。

33
Matías
    protected override void OnLoad(EventArgs e)
    {
        Visible = false; // Hide form window.
        ShowInTaskbar = false; // Remove from taskbar.
        Opacity = 0;

        base.OnLoad(e);
    }
19
Chriz

フォームの構築時に(目標に応じて、デザイナー、メインプログラム、またはフォームコンストラクター)、

 this.WindowState = FormWindowState.Minimized;
 this.ShowInTaskbar = false;

おそらくNotifyIconからのイベントでフォームを表示する必要がある場合、必要に応じて逆に、

 if (!this.ShowInTaskbar)
    this.ShowInTaskbar = true;

 if (this.WindowState == FormWindowState.Minimized)
    this.WindowState = FormWindowState.Normal;

連続する表示/非表示イベントは、フォームのVisibleプロパティまたはShow/Hideメソッドをより簡単に使用できます。

14
Jeff

タスクバーからアプリを非表示にしてみてください。

これを行うには、このコードを使用してください。

  protected override void OnLoad(EventArgs e)
  {
   Visible = false; // Hide form window.
   ShowInTaskbar = false; // Remove from taskbar.
   Opacity = 0;

   base.OnLoad(e);
   }

ありがとう。ルール

5

私はこの問題に非常に苦労しましたが、解決策は私よりもはるかに簡単です。最初にここですべての提案を試みましたが、結果に満足できず、もう少し調べました。私が追加した場合:

 this.visible=false;
 /* to the InitializeComponent() code just before the */
 this.Load += new System.EventHandler(this.DebugOnOff_Load);

それはうまく機能しています。しかし、私はもっと簡単な解決策が欲しかったので、以下を追加すると、

this.visible=false;
/* to the start of the load event, you get a
simple perfect working solution :) */ 
private void
DebugOnOff_Load(object sender, EventArgs e)
{
this.Visible = false;
}
3
echoen

ウィンドウの状態を最小化に設定し、タスクバーにfalseを表示します。次に、フォームの最後に、ウィンドウの状態を最大化に設定し、タスクバーにtrueを表示します。

    public frmMain()
    {
        Program.MainForm = this;
        InitializeComponent();

        this.WindowState = FormWindowState.Minimized;
        this.ShowInTaskbar = false;
    }

private void frmMain_Load(object sender, EventArgs e)
    {
        //Do heavy things here

        //At the end do this
        this.WindowState = FormWindowState.Maximized;
        this.ShowInTaskbar = true;
    }
3
George

これをProgram.csに入れます。

FormName FormName = new FormName ();

FormName.ShowInTaskbar = false;
FormName.Opacity = 0;
FormName.Show();
FormName.Hide();

フォームを表示するときにこれを使用します。

var principalForm = Application.OpenForms.OfType<FormName>().Single();
principalForm.ShowInTaskbar = true;
principalForm.Opacity = 100;
principalForm.Show();
3
Ben Yousaf

フォームでOnVisibleChangedをオーバーライドする

protected override void OnVisibleChanged(EventArgs e)
{
    this.Visible = false;

    base.OnVisibleChanged(e);
}

ある時点でトリガーを表示する必要がある場合は、トリガーを追加できます

public partial class MainForm : Form
{
public bool hideForm = true;
...
public MainForm (bool hideForm)
    {
        this.hideForm = hideForm;
        InitializeComponent();
    }
...
protected override void OnVisibleChanged(EventArgs e)
    {
        if (this.hideForm)
            this.Visible = false;

        base.OnVisibleChanged(e);
    }
...
}
1
LKane

これは私にとって完璧に機能します:

[STAThread]
    static void Main()
    {
        try
        {
            frmBase frm = new frmBase();               
            Application.Run();
        }

プロジェクトを起動すると、表示する必要がない限り、タスクバーを含むすべてが非表示になりました。

0
Willy David Jr

フォームなしでアプリを起動すると、自分でアプリケーションの起動/シャットダウンを管理する必要があります。

非表示のフォームから開始する方が良いオプションです。

0
Roger Willcocks
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    MainUIForm mainUiForm = new MainUIForm();
    mainUiForm.Visible = false;
    Application.Run();
}
0
kilsek

簡単なアプローチを次に示します。
C#にあります(現時点ではVBコンパイラはありません)

public Form1()
{
    InitializeComponent();
    Hide(); // Also Visible = false can be used
}

private void Form1_Load(object sender, EventArgs e)
{
    Thread.Sleep(10000);
    Show(); // Or visible = true;
}
0
aku
    static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form1 = new Form1();
            form1.Visible = false;
            Application.Run();

        }
 private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
            Application.Exit();
        }

フォームの読み込みが完了する前にform_Loadイベントでフォームを非表示にするコードが起動し、Hide()メソッドが失敗する(クラッシュせず、期待どおりに動作しなかった)というポスターのような問題がありました。

他の答えは素晴らしく、うまくいきますが、一般に、form_Loadイベントにはしばしばこのような問題があり、そこに入れたいものはコンストラクターまたはform_Shownイベントに簡単に入れられることがわかりました。

とにかく、いくつかのことをチェックする同じコードを移動し、不要なときにフォームを非表示にすると(シングルサインオンが失敗したときのログインフォーム)、期待どおりに機能しました。

0
blind Skwirl

この例では、システムトレイ内のNotifyIconだけでなく、クリックなども完全に非表示になっています。

詳細: http://code.msdn.Microsoft.com/TheNotifyIconExample

0
TheUberOverLord

Grokyの応答 (これは実際には私の観点でははるかに最良の応答です)を補完するものとして、 ApplicationContext クラスも言及できます。記事のサンプル)アプリケーションの起動時に2つ(またはそれ以上)のフォームを開き、それらすべてでアプリケーションの有効期間を制御する機能。

0
Eugenio Miró