使用c#删除外部应用程序的标题栏

我的应用程序启动了另一个外部应用

我想在启动后删除此外部应用程序的标题栏。

这是可行的,如果是这样的话怎么办?

根据评论,我使用下面的工作代码

//Finds a window by class name [DllImport("USER32.DLL")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); //Sets a window to be a child window of another window [DllImport("USER32.DLL")] public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); //Sets window attributes [DllImport("USER32.DLL")] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); //Gets window attributes [DllImport("USER32.DLL")] public static extern int GetWindowLong(IntPtr hWnd, int nIndex); [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); //assorted constants needed public static int GWL_STYLE = -16; public static int WS_CHILD = 0x40000000; //child window public static int WS_BORDER = 0x00800000; //window with border public static int WS_DLGFRAME = 0x00400000; //window with double border but no title public static int WS_CAPTION = WS_BORDER | WS_DLGFRAME; //window with a title bar public void WindowsReStyle() { Process[] Procs = Process.GetProcesses(); foreach (Process proc in Procs) { if (proc.ProcessName.StartsWith("notepad")) { IntPtr pFoundWindow = proc.MainWindowHandle; int style = GetWindowLong(pFoundWindow, GWL_STYLE); SetWindowLong(pFoundWindow, GWL_STYLE, (style & ~WS_CAPTION)); } } } 

无需注入任何东西,您只需使用API​​修改窗口样式位,例如,这适用于记事本,但YMMV取决于您正在玩的应用程序。

alt text http://img297.imageshack.us/img297/8580/40498359.png

 //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 
 Process[] processes = Process.GetProcessesByName("notepad"); IntPtr windowHandle = processes[0].MainWindowHandle; const int GWL_STYLE = (-16); const UInt32 WS_VISIBLE = 0x10000000; SetWindowLong(windowHandle, GWL_STYLE, (WS_VISIBLE));` 

通常,除非您正在启动的应用程序直接支持in(例如,如果需要命令行开关来删除标题栏),则不能这样做。

您只能控制ProcessStartInfo类中已存在的内容(即打开一个新窗口,启动最小化/最大化等…)。

嗯,亚历克斯从来没有详细说明代码,至少它不是一个即插即用的解决方案,但仍然主要归功于他……除非你使用“SetParent”把它放在一边它在某种容器中(例如表单或面板)只是想我会分享结果。

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夏普(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); } } 

再次,谢谢Alex

这与之前提出的问题非常相似,我很确定答案是你不能这样做。 (或者,如果可以,您需要深入了解Windows API,这可能具有挑战性,具体取决于您的经验。)

如何将按钮添加到其他应用程序窗口标题栏(XP / Vista)