it-swarm-ko.tech

시작시 단일 양식 숨기기

하나의 양식이있는 응용 프로그램이 있으며 Load 메서드에서 양식을 숨겨야합니다.

양식은 필요할 때 (Outlook 2003 스타일 팝업 라인을 따라 생각할 때) 자체적으로 표시되지만 지저분하지 않고로드시 양식을 숨기는 방법을 알아낼 수 있습니다.

어떤 제안?

72
Pondidum

나는 C #에서 이것을오고 있지만 vb.net에서 매우 유사해야합니다.

메인 프로그램 파일의 메인 메소드에는 다음과 같은 것이 있습니다.

Application.Run(new MainForm());

이렇게하면 새로운 기본 양식이 만들어지고 응용 프로그램의 수명이 기본 양식의 수명으로 제한됩니다.

그러나 Application.Run ()에 대한 매개 변수를 제거하면 양식이 표시되지 않고 응용 프로그램이 시작되며 원하는만큼 양식을 표시하고 숨길 수 있습니다.

Load 메서드에서 폼을 숨기지 않고 Application.Run ()을 호출하기 전에 폼을 초기화하십시오. 작업 표시 줄에 아이콘을 표시하기 위해 양식에 NotifyIcon이 있다고 가정합니다. 양식 자체가 아직 표시되지 않은 경우에도 표시 할 수 있습니다. NotifyIcon 이벤트 핸들러에서 Form.Show() 또는 Form.Hide()을 호출하면 양식이 각각 표시되고 숨겨집니다.

108
Grokys

일반적으로 나중에 트레이 아이콘이나 다른 방법을 사용하여 양식을 표시 할 때만이 작업을 수행 할 수 있지만 기본 양식을 표시하지 않아도 잘 작동합니다.

Form 클래스에서 기본값이 false 인 bool을 작성하십시오.

private bool allowshowdisplay = false;

그런 다음 SetVisibleCore 메소드를 대체하십시오.

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

Application.Run ()은 폼을로드 한 후 폼을 .Visible = true로 설정하기 때문에이를 가로 채서 false로 설정합니다. 위의 경우 allowhowdisplay를 true로 설정하여 활성화 할 때까지 항상 false로 설정됩니다.

이제 시작시 폼이 표시되지 않게되었으므로 allowhowdisplay = 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;

연속적인 표시/숨기기 이벤트는 Form의 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
Metallic Skeleton

나는이 문제로 많은 어려움을 겪었고 해결책은 나보다 훨씬 간단합니다. 나는 먼저 여기에 모든 제안을 시도했지만 결과에 만족하지 않고 조금 더 조사했습니다. 내가 추가하면 다음을 발견했습니다.

 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();
        }
0

포스터와 비슷한 문제가 발생하여 폼이 완전히로드되기 전에 form_Load 이벤트에서 양식을 숨기는 코드가 실행되어 Hide () 메서드가 실패했습니다 (충돌하지 않고 예상대로 작동하지 않음).

다른 답변은 훌륭하고 효과적이지만 일반적으로 form_Load 이벤트에는 종종 이러한 문제가 있으며 거기에 넣고 싶은 것은 생성자 또는 form_Shown 이벤트로 쉽게 갈 수 있다는 것을 알았습니다.

어쨌든, 어떤 것을 확인하는 동일한 코드를 이동 한 다음 필요하지 않을 때 양식을 숨기면 (싱글 사인온이 실패 할 때의 로그인 양식) 예상대로 작동합니다.

0
blind Skwirl

이 예는 시스템 트레이의 NotifyIcon뿐만 아니라 전체 투명성을 지원하며 클릭 수는 없습니다.

여기 더 있습니다 : http://code.msdn.Microsoft.com/TheNotifyIconExample

0
TheUberOverLord

Groky 's response (실제로 내 관점에서 지금까지 가장 좋은 응답 임)의 보완으로 ApplicationContext 클래스를 언급 할 수 있습니다. 기사의 샘플) 응용 프로그램 시작시 두 개 이상의 양식을 열고 모든 양식으로 응용 프로그램 수명을 제어하는 ​​기능.

0
Eugenio Miró