您可以使用 P-Invoke 来做到这一点。下面是一些使用的代码设置窗口长度 http://msdn.microsoft.com/en-us/library/ms633591%28VS.85%29.aspx(在User32.dll中)更改记事本主窗口的边框。 (此代码假定您有一个正在运行的记事本实例。)您可以尝试不同的窗口样式以获得您想要的结果。
GWL_STYLE 用于基本窗口样式。您可以阅读有关他们的信息here http://msdn.microsoft.com/en-us/library/ms632600%28VS.85%29.aspx.
GWL_EXSTYLE 用于扩展窗口样式。您可以阅读有关他们的信息here http://msdn.microsoft.com/en-us/library/61fe4bte%28VS.100%29.aspx.
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Module Module1
Sub Main()
Dim notepad As Process = Process.GetProcessesByName("notepad")(0)
Dim GWL_STYLE As Int32 = -16
Dim GWL_EXSTYLE As Int32 = -20
' MainWindowHandle happens to be the handle of the window you want for notepad.
' It may not be the handle you want if you try this on a different process.
Dim hWnd As IntPtr = notepad.MainWindowHandle
' You can examine the current styles using GetWindowLong.
Dim styles As WindowStyles = GetWindowLong(hWnd, GWL_STYLE)
Dim exStyles As WindowStyles = GetWindowLong(hWnd, GWL_EXSTYLE)
' WS_VISIBLE must be used for the window to be selectable.
Dim newStyles As WindowStyles = WindowStyles.WS_VISIBLE Or WindowStyles.WS_BORDER
SetWindowLong(hWnd, GWL_STYLE, newStyles)
' If you want to modify the extended styles, use GWL_EXSTYLE
SetWindowLong(hWnd, GWL_EXSTYLE, exStyles)
End Sub
_
Private Function GetWindowLong( _
ByVal hWnd As IntPtr, _
ByVal nIndex As Integer) As Integer
End Function
_
Private Function SetWindowLong( _
ByVal hWnd As IntPtr, _
ByVal nIndex As Integer, _
ByVal dwNewLong As IntPtr) As Integer
End Function
End Module
_
Public Enum WindowStyles As Long
WS_OVERLAPPED = 0
WS_POPUP = 2147483648
WS_CHILD = 1073741824
WS_MINIMIZE = 536870912
WS_VISIBLE = 268435456
WS_DISABLED = 134217728
WS_CLIPSIBLINGS = 67108864
WS_CLIPCHILDREN = 33554432
WS_MAXIMIZE = 16777216
WS_BORDER = 8388608
WS_DLGFRAME = 4194304
WS_VSCROLL = 2097152
WS_HSCROLL = 1048576
WS_SYSMENU = 524288
WS_THICKFRAME = 262144
WS_GROUP = 131072
WS_TABSTOP = 65536
WS_MINIMIZEBOX = 131072
WS_MAXIMIZEBOX = 65536
WS_CAPTION = WS_BORDER Or WS_DLGFRAME
WS_TILED = WS_OVERLAPPED
WS_ICONIC = WS_MINIMIZE
WS_SIZEBOX = WS_THICKFRAME
WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or _
WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
WS_POPUPWINDOW = WS_POPUP Or WS_BORDER Or WS_SYSMENU
WS_CHILDWINDOW = WS_CHILD
WS_EX_DLGMODALFRAME = 1
WS_EX_NOPARENTNOTIFY = 4
WS_EX_TOPMOST = 8
WS_EX_ACCEPTFILES = 16
WS_EX_TRANSPARENT = 32
'#If (WINVER >= 400) Then
WS_EX_MDICHILD = 64
WS_EX_TOOLWINDOW = 128
WS_EX_WINDOWEDGE = 256
WS_EX_CLIENTEDGE = 512
WS_EX_CONTEXTHELP = 1024
WS_EX_RIGHT = 4096
WS_EX_LEFT = 0
WS_EX_RTLREADING = 8192
WS_EX_LTRREADING = 0
WS_EX_LEFTSCROLLBAR = 16384
WS_EX_RIGHTSCROLLBAR = 0
WS_EX_CONTROLPARENT = 65536
WS_EX_STATICEDGE = 131072
WS_EX_APPWINDOW = 262144
WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE
WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST
'#End If
'#If (WIN32WINNT >= 500) Then
WS_EX_LAYERED = 524288
'#End If
'#If (WINVER >= 500) Then
WS_EX_NOINHERITLAYOUT = 1048576 ' Disable inheritence of mirroring by children
WS_EX_LAYOUTRTL = 4194304 ' Right to left mirroring
'#End If
'#If (WIN32WINNT >= 500) Then
WS_EX_COMPOSITED = 33554432
WS_EX_NOACTIVATE = 67108864
'#End If
End Enum
代码解释
我不确定您在开发 GUI 应用程序方面有多少经验,因此我将提供一些有关窗口如何工作的背景知识。窗口有一个唯一的标识号,称为句柄。与窗口相关联的还有一个窗口过程,它处理该窗口的消息(标识事件和命令的整数)。创建窗口时,您可以指定希望窗口具有什么样式等。Windows 应用程序要复杂得多,但为了避免陷入细节,我们将继续讨论。
值得庆幸的是,.NET Winforms 使我们不必与 Windows API 交互并直接处理消息(在大多数情况下),并且使创建功能性 GUI 应用程序变得非常容易。大多数 .NET 开发人员通常不需要担心 Windows API 的底层功能。
现在有了这个背景,代码应该更容易理解了。
首先,我们需要获得第一个名为“notepad”的进程。
Dim notepad As Process = Process.GetProcessesByName("notepad")(0)
然后我们定义两个整数GWL_STYLE
and GWL_EXSTYLE
。这两个整数在上下文中具有特定含义SetWindowLong
功能。它们的值(以及许多其他常量的值)可以在 Winuser.h 和 Windows SDK 中的其余头文件中找到。
Dim GWL_STYLE As Int32 = -16
Dim GWL_EXSTYLE As Int32 = -20
接下来我们获取记事本主窗口的句柄。
Dim hWnd As IntPtr = notepad.MainWindowHandle
之后我们遇到了获取窗口长 http://msdn.microsoft.com/en-us/library/ms633584%28VS.85%29.aspx功能。来自 MSDN:
GetWindowLong 函数检索有关指定窗口的信息。
GetWindowLong
获取窗口句柄和一个指示要检索哪些信息的值并返回指定的信息。
Dim styles As WindowStyles = GetWindowLong(hWnd, GWL_STYLE)
Dim exStyles As WindowStyles = GetWindowLong(hWnd, GWL_EXSTYLE)
包含这些样式是为了让您可以看到哪些样式应用到了窗口,从而可以确定要省略哪些样式。
接下来,我们定义要应用于窗口的样式。您可以阅读有关各种样式及其含义的信息here http://msdn.microsoft.com/en-us/library/ms632600%28VS.85%29.aspx.
Dim newStyles As WindowStyles = WindowStyles.WS_VISIBLE Or WindowStyles.WS_BORDER
然后我们使用这些样式应用到窗口设置窗口长度 http://msdn.microsoft.com/en-us/library/ms633591%28VS.85%29.aspx。来自 MSDN:
SetWindowLong 函数更改指定窗口的属性。
SetWindowLong
获取窗口句柄、指示要更改哪个属性的值以及该属性的新值,然后更改该属性。
SetWindowLong(hWnd, GWL_STYLE, newStyles)
这基本上就是代码的作用。为了避免重复,我就不赘述了GWL_EXSTYLE
因为它的使用方式与GWL_STYLE
。其余的代码只是让我们使用的逻辑SetWindowLong
and GetWindowLong
.