Ẩn biểu mẫu đơn khi khởi động


75

Tôi có một ứng dụng với một biểu mẫu trong đó và trên phương thức Tải, tôi cần ẩn biểu mẫu.

Biểu mẫu sẽ tự hiển thị khi nó cần (suy nghĩ dọc theo các dòng của cửa sổ bật lên kiểu outlook 2003), nhưng tôi có thể tìm ra cách ẩn biểu mẫu khi tải mà không có gì đó lộn xộn.

Bất kỳ đề xuất?

Câu trả lời:


110

Tôi đến đây từ C #, nhưng sẽ rất giống trong vb.net.

Trong tệp chương trình chính của bạn, trong phương thức Chính, bạn sẽ có một cái gì đó như:

Application.Run(new MainForm());

Điều này tạo ra một biểu mẫu chính mới và giới hạn thời gian tồn tại của ứng dụng trong thời gian tồn tại của biểu mẫu chính.

Tuy nhiên, nếu bạn loại bỏ tham số đến Application.Run (), thì ứng dụng sẽ được khởi động mà không có biểu mẫu nào được hiển thị và bạn có thể tự do hiển thị và ẩn biểu mẫu tùy thích.

Thay vì ẩn biểu mẫu trong phương thức Load, hãy khởi tạo biểu mẫu trước khi gọi Application.Run (). Tôi giả sử rằng biểu mẫu sẽ có NotifyIcon trên đó để hiển thị biểu tượng trong thanh tác vụ - biểu tượng này có thể được hiển thị ngay cả khi bản thân biểu mẫu chưa hiển thị. Gọi Form.Show()hoặc Form.Hide()từ trình xử lý sự kiện NotifyIcon sẽ hiển thị và ẩn biểu mẫu tương ứng.


13
Cho đến nay, giải pháp tốt nhất (và một trong những giải pháp đơn giản nhất) mà tôi đã thấy. Tất cả những thứ rác rưởi về việc đặt độ mờ thành 0, có các phiên bản Timer riêng biệt để ẩn biểu mẫu, v.v. có mùi mã trong nhiều ngày.
nathanchere

13
Nhà thiết kế không có thuộc tính Hiển thị theo như tôi thấy.
Dan W

5
Visual Studio 2015 và .NET 4.5 tại đây ... Nhà thiết kế không có thuộc visibletính cho biểu mẫu. Tôi có đang nhìn ra cái gì đó không?
Ben Philipp

1
Hãy sửa cho tôi nếu tôi sai, Application.Run cung cấp quy trình với một vòng lặp thông báo cần thiết cho các biểu mẫu windows. Nếu không có nó, mã của bạn bên trong biểu mẫu của bạn sau đó sẽ sụp đổ.
manit

1
Lưu ý rằng trong trường hợp Form_Loadnày sẽ không được gọi cho đến khi biểu mẫu được hiển thị ở lần đầu tiên. Và có thể là không bao giờ. Ngoài ra, việc đóng biểu mẫu chính sẽ không đóng ứng dụng. Bạn phải sử dụng Application.Exit.
'19

104

Thông thường, bạn sẽ chỉ làm điều này khi bạn đang sử dụng biểu tượng khay hoặc một số phương pháp khác để hiển thị biểu mẫu sau này, nhưng nó sẽ hoạt động tốt ngay cả khi bạn không bao giờ hiển thị biểu mẫu chính của mình.

Tạo bool trong lớp Biểu mẫu của bạn được mặc định là false:

private bool allowshowdisplay = false;

Sau đó ghi đè phương thức SetVibleCore

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

Bởi vì Application.Run () đặt các dạng .Vible = true sau khi nó tải biểu mẫu, điều này sẽ chặn điều đó và đặt nó thành false. Trong trường hợp trên, nó sẽ luôn đặt nó thành false cho đến khi bạn bật nó bằng cách đặt allowhowdisplay thành true.

Bây giờ điều đó sẽ giữ cho biểu mẫu không hiển thị khi khởi động, bây giờ bạn cần kích hoạt lại SetVnableCore để hoạt động bình thường bằng cách đặt allowhowdisplay = true. Bạn sẽ muốn làm điều này trên bất kỳ chức năng giao diện người dùng nào hiển thị biểu mẫu. Trong ví dụ của tôi, đó là sự kiện nhấp chuột trái trong đối tượng notiyicon của tôi:

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

2
Cảm ơn! Không giống như gần như tất cả các đề xuất khác ở đây, đề xuất này KHÔNG hiển thị chớp nhoáng của cửa sổ chính.
Andy

2
Đây là cách thực sự chính xác để làm điều này, vì vậy nó phải là câu trả lời được chấp nhận. Quay lại những ngày MFC, chúng tôi đã từng làm một điều tương tự, trong đó chúng tôi sẽ xử lý thông báo WM_WINDOWPOSCHANGING đầu tiên và ẩn biểu mẫu ở đó để ngăn "cửa sổ nhấp nháy".
enriquein

Cảm ơn Tôi đã thử câu trả lời được chấp nhận và nó không hoạt động vì tôi cần hiển thị Biểu tượng khay, tuy nhiên điều này hoạt động hoàn hảo.
Omar Kooheji

Điều này hoạt động, nhưng tôi nghĩ câu trả lời của @ Jeff tốt hơn vì nó không yêu cầu ghi đè với một số hack logic.
Mark Lakata

1
Thật không may, biểu tượng thông báo hoàn toàn không xuất hiện khi tôi thêm phương thức SetVnableCore () vào biểu mẫu, vì vậy tôi không thể hiển thị nó bằng một cú nhấp chuột sau đó.
Dan W

35

Tôi sử dụng cái này:

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

Rõ ràng là bạn phải thay đổi điều kiện if với của bạn.


2
Điều này khiến chương trình bật sáng và sau đó nhanh chóng ẩn khi khởi động.
Dan W

Tôi đoán tôi nên làm rất nhiều nếu tôi không thấy mã của bạn. Cảm ơn
M lúc

Để giải quyết flash lúc khởi động ứng dụng, thiết lập các Mẫu Opacity xuống 0 trong thiết kế, sau đó trong gọi lại, gọi Hide () thiết lập đầu tiên và sau đó Opacity trở lại 100.
Michael Bray

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

        base.OnLoad(e);
    }

1
Tôi muốn biểu mẫu của mình được ẩn NHƯNG vẫn được tải và chạy. Giải pháp này hoạt động hoàn hảo trong trường hợp như vậy. Ủng hộ bạn!
Joe Gayetty

Tôi nghĩ đây là giải pháp tốt nhất, THX :)
Soheyl

15

Tại thời điểm xây dựng biểu mẫu (Trình thiết kế, chương trình Chính hoặc Trình tạo biểu mẫu, tùy thuộc vào mục tiêu của bạn),

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

Khi bạn cần hiển thị biểu mẫu, có lẽ là trong sự kiện từ NotifyIcon của bạn, hãy đảo ngược nếu cần,

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

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

Các sự kiện hiển thị / ẩn kế tiếp có thể đơn giản hơn sử dụng thuộc tính Hiển thị của Biểu mẫu hoặc các phương pháp Hiển thị / Ẩn.


Điều này cũng hoạt động trong sự kiện Tải. Tôi nghĩ đây là cách nó được dự định.
Mark Lakata

5

Cố gắng ẩn ứng dụng khỏi thanh tác vụ.

Để làm điều đó, vui lòng sử dụng mã này.

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

   base.OnLoad(e);
   }

Cảm ơn. Ruhul


4

Mở rộng biểu mẫu chính của bạn với biểu mẫu này:

using System.Windows.Forms;

namespace HideWindows
{
    public class HideForm : Form
    {
        public HideForm()
        {
            Opacity = 0;
            ShowInTaskbar = false;
        }

        public new void Show()
        {
            Opacity = 100;
            ShowInTaskbar = true;

            Show(this);
        }
    }
}

Ví dụ:

namespace HideWindows
{
    public partial class Form1 : HideForm
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

Thông tin thêm trong bài viết này (tiếng Tây Ban Nha):

http://codelogik.net/2008/12/30/primer-form-oculto/


3

Tôi đã đấu tranh với vấn đề này rất nhiều và giải pháp đơn giản hơn nhiều so với tôi. Lần đầu tiên tôi đã thử tất cả các đề xuất ở đây nhưng sau đó tôi không hài lòng với kết quả và đã điều tra thêm một chút. Tôi thấy rằng nếu tôi thêm:

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

Nó đang hoạt động tốt. nhưng tôi muốn một giải pháp đơn giản hơn và hóa ra là nếu bạn thêm:

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

Bạn sẽ muốn đặt trạng thái cửa sổ thành thu nhỏ và hiển thị trên thanh tác vụ thành false. Sau đó, ở cuối biểu mẫu của bạn Tải đặt trạng thái cửa sổ thành tối đa và hiển thị trong thanh tác vụ thành 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

Đặt cái này vào Program.cs của bạn:

FormName FormName = new FormName ();

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

Sử dụng điều này khi bạn muốn hiển thị biểu mẫu:

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

1

Ghi đè OnVibleChanged trong Biểu mẫu

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

    base.OnVisibleChanged(e);
}

Bạn có thể thêm trình kích hoạt nếu bạn có thể cần hiển thị nó tại một số điểm

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);
    }
...
}

0

Khởi chạy ứng dụng không có biểu mẫu nghĩa là bạn sẽ phải tự quản lý việc khởi động / tắt ứng dụng.

Bắt đầu biểu mẫu tắt ẩn là một lựa chọn tốt hơn.



0

Để bổ sung cho phản hồi của Groky (thực sự là phản hồi tốt nhất cho đến nay theo quan điểm của tôi), chúng tôi cũng có thể đề cập đến lớp ApplicationContext , lớp này cũng cho phép (như được hiển thị trong mẫu của bài viết) khả năng mở hai (hoặc thậm chí nhiều hơn) Biểu mẫu khi khởi động ứng dụng và kiểm soát thời gian tồn tại của ứng dụng với tất cả chúng.


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

0

Điều này hoàn toàn phù hợp với tôi:

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

Khi tôi khởi chạy dự án, mọi thứ đều bị ẩn bao gồm cả trong thanh tác vụ trừ khi tôi cần hiển thị nó ..


0

Tôi đã gặp sự cố tương tự như người đăng khi mã ẩn biểu mẫu trong sự kiện form_Load được kích hoạt trước khi biểu mẫu được tải hoàn toàn, khiến phương thức Hide () không thành công (không gặp sự cố, chỉ là không hoạt động như mong đợi).

Các câu trả lời khác rất tuyệt và hiệu quả nhưng tôi thấy rằng nói chung, sự kiện form_Load thường có những vấn đề như vậy và những gì bạn muốn đưa vào đó có thể dễ dàng đi vào hàm tạo hoặc sự kiện form_Shown.

Tuy nhiên, khi tôi di chuyển cùng một mã kiểm tra một số thứ sau đó ẩn biểu mẫu khi không cần thiết (biểu mẫu đăng nhập khi đăng nhập một lần không thành công), nó đã hoạt động như mong đợi.


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

-1

Đây là một cách tiếp cận đơn giản:
Đó là trong C # (tôi không có trình biên dịch VB vào lúc này)

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;
}

nếu bạn không thêm Dòng hiển thị trong Form1_Load, biểu mẫu vẫn được hiển thị, ngay cả khi bạn đặt hiển thị thành sai ... -1
Eugenio Miró

1
-1 Điều này không hoạt động. Application.Run () âm mưu chống lại bạn để hiển thị biểu mẫu bất kể điều gì.
Mark Lakata

-2

Trong trình thiết kế, hãy đặt thuộc tính Hiển thị của biểu mẫu thành false. Sau đó, tránh gọi Show () cho đến khi bạn cần.

Một mô hình tốt hơn là không tạo một phiên bản của biểu mẫu cho đến khi bạn cần.


-2

Dựa trên nhiều gợi ý khác nhau, tất cả những gì tôi phải làm là:

Để ẩn biểu mẫu:

Me.Opacity = 0
Me.ShowInTaskbar = false

Để hiển thị biểu mẫu:

Me.Opacity = 100
Me.ShowInTaskbar = true

Điều gì sẽ xảy ra nếu người dùng vô tình nhấn phím Enter hoặc gõ vào vùng trong suốt? Tôi nghĩ bạn cũng nên làm Me.Enable = false;
Angshuman Agarwal

-3

Tại sao nó lại như vậy?

Tại sao không chỉ bắt đầu như một ứng dụng bảng điều khiển và hiển thị biểu mẫu khi cần thiết? Không có gì ngoài một vài tham chiếu tách ứng dụng bảng điều khiển khỏi ứng dụng biểu mẫu.

Không cần phải tham lam và lấy bộ nhớ cần thiết cho biểu mẫu khi bạn thậm chí có thể không cần nó.


-3

Tôi làm như thế này - theo quan điểm của tôi, cách dễ nhất:

đặt 'StartPosition' của biểu mẫu thành 'Thủ công' và thêm nó vào trình thiết kế của biểu mẫu:

Private Sub InitializeComponent()
.
.
.
Me.Location=New Point(-2000,-2000)
.
.
.
End Sub

Đảm bảo rằng vị trí được đặt thành thứ gì đó cao hơn hoặc thấp hơn kích thước của màn hình. Sau đó, khi bạn muốn hiển thị biểu mẫu, hãy đặt Vị trí thành một thứ trong kích thước của màn hình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.