如何在c#中禁用或隐藏其他应用程序中的最小化/最大化按钮?

时间:2010-11-28 09:59:07

标签: c#

我从c#打开一个Excel(2003)应用程序。我希望该用户无法更改其大小(它已打开最大化),因此系统菜单和最小化/最大化按钮将被禁用甚至隐藏。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:12)

以下是代码:

internal static class Utilities
{
    [DllImport("user32.dll")]
    internal extern static int SetWindowLong(IntPtr hwnd, int index, int value);

    [DllImport("user32.dll")]
    internal extern static int GetWindowLong(IntPtr hwnd, int index);

    internal static void HideMinimizeAndMaximizeButtons(IntPtr hwnd)
    {
        const int GWL_STYLE = -16;
        const long WS_MINIMIZEBOX = 0x00020000L;
        const long WS_MAXIMIZEBOX = 0x00010000L;

        long value = GetWindowLong(hwnd, GWL_STYLE);

        SetWindowLong(hwnd, GWL_STYLE, (int)(value & ~WS_MINIMIZEBOX & ~WS_MAXIMIZEBOX));
    }
}

Daniel Mošmondor's answer中所述,您需要找到Excel Windows句柄,然后以这种方式调用上面的代码:

Utilities.HideMinimizeAndMaximizeButtons(windowHandle);

N.B。
也许,根据您启动Excel流程的方式,您可能已经拥有流程或窗口句柄,因此只需使用它而无需调用Process.GetProcessesByName(...) / Process.GetProcesses()

修改

如果您使用以下命令启动Excel应用程序:

ApplicationClass _excel = new ApplicationClass();

只需使用以下代码:

IntPtr windowHandle = new IntPtr(_excel.Hwnd);
Utilities.HideMinimizeAndMaximizeButtons(windowHandle);

答案 1 :(得分:1)

  • 找到包含Excel的流程
  • 为它打开主窗口
  • 查找应该为窗口设置的标志(看看SetWindowStyle和SetWindowStyleEx,可能是SetClass长)
  • 使用流程中的PostMessage设置相应的标志值

为了进行测试,首先创建将用作Excel模拟的应用程序,以便从“其他”应用程序的角度看待您正在执行此操作。一切正常后,切换到真正的Excel。