天天看点

C# Windows API 去掉窗口标题栏 以及边框

写这篇博客的目的,就是防止忘记找不到。

实际项目中使用,测试有效。

调用:

IntPtr CurrentAppHandle = GetForegroundWindow();
HandleRef ParentHandle = new HandleRef(this, CurrentAppHandle);

// 初始化窗口风格
IntPtr Style = GetWindowLongPtr(CurrentAppHandle, GWL_STYLE);
uint tempStyle = (uint)Style.ToInt32() & ~WS_CAPTION & ~WS_SYSMENU & ~WS_SIZEBOX;
WinAPI.SetWindowLongPtr(ParentHandle, GWL_STYLE, new IntPtr(tempStyle));
           

WindowsAPI:

/// <summary>
    /// 检索有关指定窗口的信息。该函数还将以指定的偏移量将值检索到额外的窗口内存中。
    /// </summary>
    /// <param name="hWnd"></param>
    /// <param name="nIndex"></param>
    /// <returns></returns>
    public static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
    {
        if (IntPtr.Size == 8)
            return GetWindowLongPtr64(hWnd, nIndex);
        else
            return GetWindowLongPtr32(hWnd, nIndex);
    }
    [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
    private static extern IntPtr GetWindowLongPtr32(IntPtr hWnd, int nIndex);

    [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
    private static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);

    /// <summary>
    /// 这种静态方法是必需的,因为早期操作系统不支持
    /// </summary>
    /// <param name="hWnd"></param>
    /// <param name="nIndex"></param>
    /// <param name="dwNewLong"></param>
    /// <returns></returns>
    public static IntPtr SetWindowLongPtr(HandleRef hWnd, int nIndex, IntPtr dwNewLong)
    {
        if (IntPtr.Size == 8)
            return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
        else
            return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
    }

    [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
    private static extern int SetWindowLong32(HandleRef hWnd, int nIndex, int dwNewLong);

    [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
    private static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, IntPtr dwNewLong);

    /// <summary>
    /// 获取置顶窗口
    /// </summary>
    /// <returns></returns>

    [DllImport("user32", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr GetForegroundWindow();
           

 

 

参数:

/// <summary>
    /// 设置一个新的窗口样式
    /// </summary>
    public const int GWL_STYLE = -16;

    /// <summary>
    /// 标题
    /// </summary>
    public const uint WS_CAPTION = 0x00C00000;     /* WS_BORDER | WS_DLGFRAME  */

    /// <summary>
    /// 系统菜单
    /// </summary>
    public const uint WS_SYSMENU = 0x00080000;


    /// <summary>
    /// 设置调整窗口大小的厚的结构的窗口。
    /// </summary>
    public const uint WS_THICKFRAME = 0x00040000;

    /// <summary>
    /// 创建一个可调边框的窗口,与 WS_THICKFRAME 风格相同
    /// </summary>
    public const uint WS_SIZEBOX = WS_THICKFRAME;
           

Â