windows 从 Main 函数最大化窗口?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5990118/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Maximize window from the Main function?
提问by Moslem7026
I have used a mutex to run a single instance program, and now I want the window to become maximized if it is currently minimized when the user reopens the application.
我已经使用互斥锁来运行单个实例程序,现在我希望窗口在用户重新打开应用程序时当前最小化时最大化。
Here is the code I currently have in my Program.cs file:
这是我目前在 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());
}
}
回答by Cody Gray
You're looking for the ShowWindow
functionand the SW_MAXIMIZE
flag.
您正在寻找ShowWindow
函数和SW_MAXIMIZE
标志。
In C#, the P/Invoke declaration would look like this:
在 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;
Add it to your code here:
将其添加到您的代码中:
if (!Ok)
{
Process[] p = Process.GetProcessesByName(ProductName);
SetForegroundWindow(p[0].MainWindowHandle);
ShowWindow(p[0].MainWindowHandle, SW_MAXIMIZE);
}
If you actually want to test whether the window is minimized first before you maximize it, you can use the old-school IsIconic
function:
如果您真的想在最大化之前先测试窗口是否被最小化,您可以使用老式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);
}
}
If you just want to activate the window (rather than maximize it), use the SW_SHOW
value (5
) instead of SW_MAXIMIZE
. This will restore it to its previous state, before it was minimized.
如果您只想激活窗口(而不是最大化它),请使用SW_SHOW
值 ( 5
) 而不是SW_MAXIMIZE
。这将把它恢复到之前的状态,在它被最小化之前。
回答by Randall Flagg
I would like to suggest a solution that is purely .NET (i.e. without OS dependency).
我想建议一个纯粹的 .NET 解决方案(即不依赖操作系统)。
Program.cs
程序.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
扩展方法.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
表格1.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();
}
}