Вы можете сделать это, используя P-Invoke. Ниже приведен код, который использует SetWindowLong (в User32.dll) для изменения границы главного окна блокнота. (Этот код предполагает, что у вас запущен экземпляр блокнота.) Вы можете поэкспериментировать с различными стилями окон, чтобы достичь желаемого результата.
GWL_STYLE - для основных стилей окна. Вы можете прочитать о них здесь .
GWL_EXSTYLE для расширенных стилей окна. Вы можете прочитать о них здесь .
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
Пояснение к коду
Я не уверен, сколько у вас опыта в разработке приложений с графическим интерфейсом, поэтому я немного расскажу о том, как работает окно. Окно имеет уникальный идентификационный номер, называемый дескриптором. С окном также связана оконная процедура, которая обрабатывает сообщения (целые числа, которые идентифицируют события и команды) для этого окна. Когда окно создано, вы указываете, какие стили вы хотите, чтобы окно имело, и т. Д. Для оконных приложений намного сложнее, но чтобы не увязнуть в деталях, мы будем двигаться дальше.
К счастью, .NET Winforms изолирует нас от необходимости взаимодействовать с Windows API и обрабатывать сообщения напрямую (по большей части) и упрощает создание функциональных приложений с графическим интерфейсом. В Windows API скрыто гораздо больше возможностей, о которых большинству разработчиков .NET обычно не нужно беспокоиться.
Теперь на этом фоне код должен быть немного легче для понимания.
Для начала нам нужно получить первый процесс с именем «блокнот».
Dim notepad As Process = Process.GetProcessesByName("notepad")(0)
Затем мы определяем два целых числа GWL_STYLE
и 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
После этого мы сталкиваемся с функцией GetWindowLong . Из MSDN:
Функция GetWindowLong извлекает информацию об указанном окне.
GetWindowLong
принимает дескриптор окна и значение, указывающее, какую информацию получить, и возвращает указанную информацию.
Dim styles As WindowStyles = GetWindowLong(hWnd, GWL_STYLE)
Dim exStyles As WindowStyles = GetWindowLong(hWnd, GWL_EXSTYLE)
Они были включены для того, чтобы вы могли видеть, какие стили были применены к окну, чтобы вы могли определить, какие стили пропустить.
Далее мы определяем, какие стили мы хотим применить к окну. Вы можете прочитать о различных стилях и их значениях здесь .
Dim newStyles As WindowStyles = WindowStyles.WS_VISIBLE Or WindowStyles.WS_BORDER
Затем мы применяем эти стили к окну, используя SetWindowLong . Из MSDN:
Функция SetWindowLong изменяет атрибут указанного окна.
SetWindowLong
берет дескриптор окна, значение, указывающее, какой атрибут изменить, и новое значение атрибута и изменяет атрибут.
SetWindowLong(hWnd, GWL_STYLE, newStyles)
Это в основном то, что делает код. Чтобы избежать повторения, я не буду переходить через GWL_EXSTYLE
, поскольку он используется точно так же, как и GWL_STYLE
. Остальная часть кода - это просто логистика, позволяющая нам использовать SetWindowLong
и GetWindowLong
.