从主function最大化窗口?

我已经使用了一个互斥体来运行一个单一的实例程序,现在我希望窗口变得最大化,如果当用户重新打开应用程序时,这个窗口最小化。

这是我目前在我的Program.cs文件中的代码:

static class Program { [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { bool Ok = true; string ProductName = Application.ProductName; Mutex m = new Mutex(true, ProductName, out Ok); if (!Ok) { System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName(ProductName); SetForegroundWindow(p[0].MainWindowHandle); } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } 

Solutions Collecting From Web of "从主function最大化窗口?"

您正在寻找ShowWindow函数和SW_MAXIMIZE标志。

在C#中,P / Invoke声明如下所示:

 [DllImport("user32.dll", CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); private const int SW_MAXIMIZE = 3; 

把它添加到你的代码在这里:

 if (!Ok) { Process[] p = Process.GetProcessesByName(ProductName); SetForegroundWindow(p[0].MainWindowHandle); ShowWindow(p[0].MainWindowHandle, SW_MAXIMIZE); } 

如果您真的想在最大化之前测试窗口是否最小化,可以使用旧式的IsIconic函数 :

 [DllImport("user32.dll", CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool IsIconic(IntPtr hWnd); // [...] if (!Ok) { Process[] p = Process.GetProcessesByName(ProductName); IntPtr hwndMain= p[0].MainWindowHandle; SetForegroundWindow(hwndMain); if (IsIconic(hwndMain)) { ShowWindow(hwndMain, SW_MAXIMIZE); } } 

如果您只想激活窗口(而不是最大化),请使用SW_SHOW值( 5 )而不是SW_MAXIMIZE 。 这将在最小化之前将其恢复到之前的状态。

我想建议一个纯粹的.NET解决方案(即没有操作系统依赖)。

Program.cs中

 static class Program { private static volatile bool _exitProcess; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { bool createdNew; var showMeEventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, "MyApp.ShowMe", out createdNew); if (createdNew) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var form = new Form1(); new Thread(() => { while (!_exitProcess) { showMeEventHandle.WaitOne(-1); if (!_exitProcess) { if (form.InvokeRequired) { form.BeginInvoke((MethodInvoker)form.BringFormToFront); } else { form.BringFormToFront(); } } } }).Start(); Application.Run(form); } _exitProcess = true; showMeEventHandle.Set(); showMeEventHandle.Close(); } } 

ExtMethods.cs

 public static class ExtMethods { public static void BringFormToFront(this Form form) { form.WindowState = FormWindowState.Normal; form.ShowInTaskbar = true; form.Show(); form.Activate(); } } 

Form1.cs的

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { this.BringFormToFront(); } private void button1_Click(object sender, EventArgs e) { WindowState = FormWindowState.Minimized; ShowInTaskbar = false; Hide(); } }