我已经使用互斥锁来运行单个实例程序,现在我希望窗口在用户重新打开应用程序时最大化(如果它当前处于最小化状态)。
这是我目前在 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());
}
}
最佳答案
您正在寻找 ShowWindow
function和 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
function :
[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
。这会将其恢复到最小化之前的状态。
关于c# - 从 Main 函数最大化窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5990118/