c# - 从 Main 函数最大化窗口?

标签 c# .net windows winapi maximize

我已经使用互斥锁来运行单个实例程序,现在我希望窗口在用户重新打开应用程序时最大化(如果它当前处于最小化状态)。

这是我目前在 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 functionSW_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/

相关文章:

windows - 在 VBScript 中获取命令行输出(不写入文件)

python - platform.win32_ver() 报告错误的 Windows 版本

windows - 如何使用 Go 在 Windows 上请求管理员权限

C# WriteAttributeString - 多元素

c# - 如何控制面板内文本框的焦点顺序?

c# - 为特定用户更新数据库

c# - asp.net 中的用户控件为子控件添加前缀字符串,导致在 javascript 中引用它们时出现问题

c# - 流畅的断言 - 如何在类型检查后正确链接

c# - 从存储帐户 blob 读取和解析 Azure IoT 中心遥测

.net - 我可以在 Mono/Linux 上使用 Visual Studio 附带的 FSharp.Core 吗