Removing the Title bar of external application using c#

后端 未结 7 1178
眼角桃花
眼角桃花 2020-12-10 12:42

My application starts up another external application.

I want to remove the title bar of this external application once it has started.

Is this feasible, and

相关标签:
7条回答
  • 2020-12-10 13:03

    Well, Alex never elaborated with the code, well at least it wasn't a plug-n-play solution, but still the main credit for this goes to him... It IS kind of buggy unless you use "SetParent" to put it in some kind of container(such as a form or panel) Just thought I would share the result.

    Visual Basic:

    Option Strict On
    Public Class Form1
        Const WS_BORDER As Integer = 8388608
        Const WS_DLGFRAME As Integer = 4194304
        Const WS_CAPTION As Integer = WS_BORDER Or WS_DLGFRAME
        Const WS_SYSMENU As Integer = 524288
        Const WS_THICKFRAME As Integer = 262144
        Const WS_MINIMIZE As Integer = 536870912
        Const WS_MAXIMIZEBOX As Integer = 65536
        Const GWL_STYLE As Integer = -16&
        Const GWL_EXSTYLE As Integer = -20&
        Const WS_EX_DLGMODALFRAME As Integer = &H1L
        Const SWP_NOMOVE As Integer = &H2
        Const SWP_NOSIZE As Integer = &H1
        Const SWP_FRAMECHANGED As Integer = &H20
        Const MF_BYPOSITION As UInteger = &H400
        Const MF_REMOVE As UInteger = &H1000
        Declare Auto Function GetWindowLong Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
        Declare Auto Function SetWindowLong Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
        Declare Auto Function SetWindowPos Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
        Public Sub MakeExternalWindowBorderless(ByVal MainWindowHandle As IntPtr)
            Dim Style As Integer
            Style = GetWindowLong(MainWindowHandle, GWL_STYLE)
            Style = Style And Not WS_CAPTION
            Style = Style And Not WS_SYSMENU
            Style = Style And Not WS_THICKFRAME
            Style = Style And Not WS_MINIMIZE
            Style = Style And Not WS_MAXIMIZEBOX
            SetWindowLong(MainWindowHandle, GWL_STYLE, Style)
            Style = GetWindowLong(MainWindowHandle, GWL_EXSTYLE)
            SetWindowLong(MainWindowHandle, GWL_EXSTYLE, Style Or WS_EX_DLGMODALFRAME)
            SetWindowPos(MainWindowHandle, New IntPtr(0), 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_FRAMECHANGED)
        End Sub
    End Class
    

    C Sharp(C#)

    using System.Runtime.InteropServices;
    public class Form1
    {
        const int WS_BORDER = 8388608;
        const int WS_DLGFRAME = 4194304;
        const int WS_CAPTION = WS_BORDER | WS_DLGFRAME;
        const int WS_SYSMENU = 524288;
        const int WS_THICKFRAME = 262144;
        const int WS_MINIMIZE = 536870912;
        const int WS_MAXIMIZEBOX = 65536;
        const int GWL_STYLE = -16L;
        const int GWL_EXSTYLE = -20L;
        const int WS_EX_DLGMODALFRAME = 0x1L;
        const int SWP_NOMOVE = 0x2;
        const int SWP_NOSIZE = 0x1;
        const int SWP_FRAMECHANGED = 0x20;
        const uint MF_BYPOSITION = 0x400;
        const uint MF_REMOVE = 0x1000;
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
        public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
        public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
        public void MakeExternalWindowBorderless(IntPtr MainWindowHandle)
        {
            int Style = 0;
            Style = GetWindowLong(MainWindowHandle, GWL_STYLE);
            Style = Style & ~WS_CAPTION;
            Style = Style & ~WS_SYSMENU;
            Style = Style & ~WS_THICKFRAME;
            Style = Style & ~WS_MINIMIZE;
            Style = Style & ~WS_MAXIMIZEBOX;
            SetWindowLong(MainWindowHandle, GWL_STYLE, Style);
            Style = GetWindowLong(MainWindowHandle, GWL_EXSTYLE);
            SetWindowLong(MainWindowHandle, GWL_EXSTYLE, Style | WS_EX_DLGMODALFRAME);
            SetWindowPos(MainWindowHandle, new IntPtr(0), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
        }
    }
    

    Again, Thank you Alex

    0 讨论(0)
  • 2020-12-10 13:05

    Python version of Alex's answer if someone else needs:

    import win32gui
    
    #  get a handle to the window
    windowHandle = win32gui.FindWindowEx(None, None, None, "Untitled - Notepad")
    
    GWL_STYLE = -16  #  see https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlonga
    
    #  get current window style
    currentStyle = win32gui.GetWindowLong(windowHandle, GWL_STYLE)
    
    #  remove titlebar elements
    currentStyle = currentStyle & ~(0x00C00000)  #  WS_CAPTION
    currentStyle = currentStyle & ~(0x00080000)  #  WS_SYSMENU
    currentStyle = currentStyle & ~(0x00040000)  #  WS_THICKFRAME
    currentStyle = currentStyle & ~(0x20000000)  #  WS_MINIMIZE
    currentStyle = currentStyle & ~(0x00010000)  #  WS_MAXIMIZEBOX
    
    #  apply new style
    win32gui.SetWindowLong(windowHandle, GWL_STYLE, currentStyle)
    
    0 讨论(0)
  • 2020-12-10 13:06

    This is very similar to a previously asked question, and I'm pretty sure that the answer is you can't do it. (or, if you can, you need to dig into the Windows API, which can be challenging, depending on your experience.)

    How to add button to other apps window title bar (XP/Vista)

    0 讨论(0)
  • 2020-12-10 13:07

    If Syncfusion, no. If not, yes.

    VB:

    Const WS_BORDER As Integer = 8388608
    Const WS_DLGFRAME As Integer = 4194304
    Const WS_CAPTION As Integer = WS_BORDER Or WS_DLGFRAME
    Const WS_SYSMENU As Integer = 524288
    Const WS_THICKFRAME As Integer = 262144
    Const WS_MINIMIZE As Integer = 536870912
    Const WS_MAXIMIZEBOX As Integer = 65536
    Const GWL_STYLE As Integer = -16&
    Const GWL_EXSTYLE As Integer = -20&
    Const WS_EX_DLGMODALFRAME As Integer = &H1L
    Const SWP_NOMOVE As Integer = &H2
    Const SWP_NOSIZE As Integer = &H1
    Const SWP_FRAMECHANGED As Integer = &H20
    Const MF_BYPOSITION As UInteger = &H400
    Const MF_REMOVE As UInteger = &H1000
    Declare Auto Function GetWindowLong Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
    Declare Auto Function SetWindowLong Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
    Declare Auto Function SetWindowPos Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
    Public Sub MakeExternalWindowBorderless(ByVal MainWindowHandle As IntPtr)
        Dim Style As Integer
        Style = GetWindowLong(MainWindowHandle, GWL_STYLE)
        Style = Style And Not WS_CAPTION
        Style = Style And Not WS_SYSMENU
        Style = Style And Not WS_THICKFRAME
        Style = Style And Not WS_MINIMIZE
        Style = Style And Not WS_MAXIMIZEBOX
        SetWindowLong(MainWindowHandle, GWL_STYLE, Style)
        Style = GetWindowLong(MainWindowHandle, GWL_EXSTYLE)
        SetWindowLong(MainWindowHandle, GWL_EXSTYLE, Style Or WS_EX_DLGMODALFRAME)
        SetWindowPos(MainWindowHandle, New IntPtr(0), 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_FRAMECHANGED)
    End Sub
    

    C#:

    const int WS_BORDER = 8388608;
    const int WS_DLGFRAME = 4194304;
    const int WS_CAPTION = WS_BORDER | WS_DLGFRAME;
    const int WS_SYSMENU = 524288;
    const int WS_THICKFRAME = 262144;
    const int WS_MINIMIZE = 536870912;
    const int WS_MAXIMIZEBOX = 65536;
    const int GWL_STYLE = -16L;
    const int GWL_EXSTYLE = -20L;
    const int WS_EX_DLGMODALFRAME = 0x1L;
    const int SWP_NOMOVE = 0x2;
    const int SWP_NOSIZE = 0x1;
    const int SWP_FRAMECHANGED = 0x20;
    const uint MF_BYPOSITION = 0x400;
    const uint MF_REMOVE = 0x1000;
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
    public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
    public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
    public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
    public void MakeExternalWindowBorderless(IntPtr MainWindowHandle)
    {
        int Style = 0;
        Style = GetWindowLong(MainWindowHandle, GWL_STYLE);
        Style = Style & ~WS_CAPTION;
        Style = Style & ~WS_SYSMENU;
        Style = Style & ~WS_THICKFRAME;
        Style = Style & ~WS_MINIMIZE;
        Style = Style & ~WS_MAXIMIZEBOX;
        SetWindowLong(MainWindowHandle, GWL_STYLE, Style);
        Style = GetWindowLong(MainWindowHandle, GWL_EXSTYLE);
        SetWindowLong(MainWindowHandle, GWL_EXSTYLE, Style | WS_EX_DLGMODALFRAME);
        SetWindowPos(MainWindowHandle, new IntPtr(0), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
    }
    
    0 讨论(0)
  • 2020-12-10 13:13

    No need to inject anything, you can just modify the windows style bits as using the API, e.g. this works for Notepad, however YMMV depending on the app your playing with.

    //Get current style
    lCurStyle = GetWindowLong(hwnd, GWL_STYLE)
    
    //remove titlebar elements
    lCurStyle = lCurStyle And Not WS_CAPTION
    lCurStyle = lCurStyle And Not WS_SYSMENU
    lCurStyle = lCurStyle And Not WS_THICKFRAME
    lCurStyle = lCurStyle And Not WS_MINIMIZE
    lCurStyle = lCurStyle And Not WS_MAXIMIZEBOX
    
    //apply new style
    SetWindowLong hwnd, GWL_STYLE, lCurStyle
    
    //reapply a 3d border
    lCurStyle = GetWindowLong(hwnd, GWL_EXSTYLE)
    
    SetWindowLong hwnd, GWL_EXSTYLE, lCurStyle Or WS_EX_DLGMODALFRAME
    
    //redraw
    SetWindowPos hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_FRAMECHANGED
    
    0 讨论(0)
  • 2020-12-10 13:18

    In general, you can't do that unless there is direct support for in by the application you are starting (for example, if it takes a command line switch for removal of the title bar).

    You can only control the things that are already present on the ProcessStartInfo class (i.e. open a new window, start minimized/maximized etc...).

    0 讨论(0)
提交回复
热议问题