1つのフォームを持つアプリケーションがあり、Loadメソッドでフォームを非表示にする必要があります。
フォームは、Outlook 2003スタイルのポップアップの行に沿って考える必要があるときに表示されますが、ロード中に面倒なことなくフォームを非表示にする方法がわかります。
助言がありますか?
私はC#からこれに来ていますが、vb.netでも非常に似ているはずです。
メインプログラムファイルのMainメソッドには、次のようなものがあります。
_Application.Run(new MainForm());
_
これにより、新しいメインフォームが作成され、アプリケーションの有効期間がメインフォームの有効期間に制限されます。
ただし、Application.Run()のパラメーターを削除すると、フォームは表示されずにアプリケーションが起動し、好きなだけフォームを表示したり非表示にしたりできます。
Loadメソッドでフォームを非表示にするのではなく、Application.Run()を呼び出す前にフォームを初期化します。フォームには、タスクバーにアイコンを表示するためのNotifyIconがあると想定しています-これは、フォーム自体がまだ表示されていなくても表示できます。 NotifyIconイベントのハンドラーからForm.Show()
またはForm.Hide()
を呼び出すと、それぞれフォームの表示と非表示が切り替わります。
通常、トレイアイコンまたは他の方法を使用して後でフォームを表示する場合にのみこれを行いますが、メインフォームを表示しない場合でもうまく機能します。
デフォルトで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;
}
}
私はこれを使用します:
private void MainForm_Load(object sender, EventArgs e)
{
if (Settings.Instance.HideAtStartup)
{
BeginInvoke(new MethodInvoker(delegate
{
Hide();
}));
}
}
明らかに、if条件を変更する必要があります。
protected override void OnLoad(EventArgs e)
{
Visible = false; // Hide form window.
ShowInTaskbar = false; // Remove from taskbar.
Opacity = 0;
base.OnLoad(e);
}
フォームの構築時に(目標に応じて、デザイナー、メインプログラム、またはフォームコンストラクター)、
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メソッドをより簡単に使用できます。
タスクバーからアプリを非表示にしてみてください。
これを行うには、このコードを使用してください。
protected override void OnLoad(EventArgs e)
{
Visible = false; // Hide form window.
ShowInTaskbar = false; // Remove from taskbar.
Opacity = 0;
base.OnLoad(e);
}
ありがとう。ルール
私はこの問題に非常に苦労しましたが、解決策は私よりもはるかに簡単です。最初にここですべての提案を試みましたが、結果に満足できず、もう少し調べました。私が追加した場合:
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;
}
ウィンドウの状態を最小化に設定し、タスクバーに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;
}
これを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();
フォームで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);
}
...
}
これは私にとって完璧に機能します:
[STAThread]
static void Main()
{
try
{
frmBase frm = new frmBase();
Application.Run();
}
プロジェクトを起動すると、表示する必要がない限り、タスクバーを含むすべてが非表示になりました。
フォームなしでアプリを起動すると、自分でアプリケーションの起動/シャットダウンを管理する必要があります。
非表示のフォームから開始する方が良いオプションです。
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainUIForm mainUiForm = new MainUIForm();
mainUiForm.Visible = false;
Application.Run();
}
簡単なアプローチを次に示します。
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;
}
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イベントに簡単に入れられることがわかりました。
とにかく、いくつかのことをチェックする同じコードを移動し、不要なときにフォームを非表示にすると(シングルサインオンが失敗したときのログインフォーム)、期待どおりに機能しました。
この例では、システムトレイ内のNotifyIconだけでなく、クリックなども完全に非表示になっています。
Grokyの応答 (これは実際には私の観点でははるかに最良の応答です)を補完するものとして、 ApplicationContext クラスも言及できます。記事のサンプル)アプリケーションの起動時に2つ(またはそれ以上)のフォームを開き、それらすべてでアプリケーションの有効期間を制御する機能。