私は問題があります。ウィンドウの読み込み時にウィンドウを非表示にする必要があります。だが
private void Form1_Load(object sender, EventArgs e)
{
this.Visible = false;
}
動かない。また、プロパティVisible
はtrueのままです。何か不足していますか?
はい、VisibleプロパティはWindowsフォームでは非常に重要です。これにより、実際にハンドルが作成され、OnLoad()が実行されます。つまり、ウィンドウは表示されるまで存在しません。そして、これを元に戻す試みは無視されます。
NotifyIconを使用する場合は、ハンドルを作成してもウィンドウを表示しないようにするのが一般的です。これは、SetVisibleCoreをオーバーライドすることで実現できます。
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
value = false;
CreateHandle();
}
base.SetVisibleCore(value);
}
OnLoadは、ウィンドウが実際に表示されるまで実行されないことに注意してください。必要に応じて、コードをコンストラクターに移動してください。 NotifyIconのコンテキストメニューイベントハンドラーでShow()を呼び出すだけで、ウィンドウが表示されます。
以下を使用できるようです:
private void Form1_Load(object sender, EventArgs e)
{
this.Opacity = 0;
this.ShowInTaskbar = false;
}
Winformsアプリでテストしたところ、機能しました。
(これも見つかりました: 起動時に単一フォーム非表示
フォームのLoadイベントから可視性を設定することは良い考えではないと思います。代わりに、パブリックメソッドを追加して実行します。
public void LoadForm(...)
{
// do the all the initializations
}
メソッドを呼び出してフォームをロードします。明示的に表示しない限り、フォームは表示されないはずです。
MyForm instance = new MyForm();
instance.LoadForm(...);
// instance.Show(); or ShowDialog() for dialog form not sure exactly the syntax.
次のように、呼び出しをWindowsイベントループに入れます。
_WindowsFormsSynchronizationContext.Current.Post((obj) => this.Hide(), null);
_
したがって、Hide()
は後で呼び出されるので、問題を修正します。
これは、このイベントが終わるまで窓が実際には存在しないためだと思います。これを行うのに最適な場所は、フォームの外です。
if (x == 1)
{
form1.ShowForm();
}
else
{
// Don't show the form
}
フォーム自体の中で本当にそれを行う必要がある場合は、Activatedイベントを使用する必要があると思います。
編集:
次のようなことも試すことができます。
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 myform = new Form1();
if (myform.CheckStuff())
{
Application.Run(myform);
}
}
使用する this.Opacity = 0;