使用VB.NET删除另一个程序的框架/窗口/边框(Aero位)

前端之家收集整理的这篇文章主要介绍了使用VB.NET删除另一个程序的框架/窗口/边框(Aero位)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法从VB.NET程序中删除另一个应用程序窗口(比如记事本)的边框/框架(Aero位)?
你可以使用P-Invoke来做到这一点.下面是一些使用 SetWindowLong(在User32.dll中)更改记事本主窗口边框的代码. (此代码假定您有一个记事本运行实例.)您可以尝试不同的窗口样式以获得所需的结果.

GWL_STYLE用于基本窗口样式.你可以阅读他们here.

GWL_EXSTYLE用于扩展窗口样式.你可以阅读他们here.

  1. Imports System.Diagnostics
  2. Imports System.Runtime.InteropServices
  3.  
  4. Module Module1
  5.  
  6. Sub Main()
  7. Dim notepad As Process = Process.GetProcessesByName("notepad")(0)
  8.  
  9. Dim GWL_STYLE As Int32 = -16
  10. Dim GWL_EXSTYLE As Int32 = -20
  11.  
  12. ' MainWindowHandle happens to be the handle of the window you want for notepad.
  13.  
  14. ' It may not be the handle you want if you try this on a different process.
  15.  
  16. Dim hWnd As IntPtr = notepad.MainWindowHandle
  17.  
  18. ' You can examine the current styles using GetWindowLong.
  19. Dim styles As WindowStyles = GetWindowLong(hWnd,GWL_STYLE)
  20. Dim exStyles As WindowStyles = GetWindowLong(hWnd,GWL_EXSTYLE)
  21.  
  22. ' WS_VISIBLE must be used for the window to be selectable.
  23. Dim newStyles As WindowStyles = WindowStyles.WS_VISIBLE Or WindowStyles.WS_BORDER
  24.  
  25. SetWindowLong(hWnd,GWL_STYLE,newStyles)
  26.  
  27. ' If you want to modify the extended styles,use GWL_EXSTYLE
  28.  
  29. SetWindowLong(hWnd,GWL_EXSTYLE,exStyles)
  30.  
  31.  
  32. End Sub
  33.  
  34. _
  35. Private Function GetWindowLong( _
  36. ByVal hWnd As IntPtr,_
  37. ByVal nIndex As Integer) As Integer
  38. End Function
  39.  
  40. _
  41. Private Function SetWindowLong( _
  42. ByVal hWnd As IntPtr,_
  43. ByVal nIndex As Integer,_
  44. ByVal dwNewLong As IntPtr) As Integer
  45. End Function
  46.  
  47. End Module
  48.  
  49. _
  50. Public Enum WindowStyles As Long
  51.  
  52. WS_OVERLAPPED = 0
  53. WS_POPUP = 2147483648
  54. WS_CHILD = 1073741824
  55. WS_MINIMIZE = 536870912
  56. WS_VISIBLE = 268435456
  57. WS_DISABLED = 134217728
  58. WS_CLIPSIBLINGS = 67108864
  59. WS_CLIPCHILDREN = 33554432
  60. WS_MAXIMIZE = 16777216
  61. WS_BORDER = 8388608
  62. WS_DLGFRAME = 4194304
  63. WS_VSCROLL = 2097152
  64. WS_HSCROLL = 1048576
  65. WS_SYSMENU = 524288
  66. WS_THICKFRAME = 262144
  67. WS_GROUP = 131072
  68. WS_TABSTOP = 65536
  69.  
  70. WS_MINIMIZEBox = 131072
  71. WS_MAXIMIZEBox = 65536
  72.  
  73. WS_CAPTION = WS_BORDER Or WS_DLGFRAME
  74. WS_TILED = WS_OVERLAPPED
  75. WS_ICONIC = WS_MINIMIZE
  76. WS_SIZEBox = WS_THICKFRAME
  77. WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW
  78.  
  79. WS_OVERLAPPEDWINDOW = WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or _
  80. WS_THICKFRAME Or WS_MINIMIZEBox Or WS_MAXIMIZEBox
  81. WS_POPUPWINDOW = WS_POPUP Or WS_BORDER Or WS_SYSMENU
  82. WS_CHILDWINDOW = WS_CHILD
  83.  
  84. WS_EX_DLGMODALFRAME = 1
  85. WS_EX_NOPARENTNOTIFY = 4
  86. WS_EX_TOPMOST = 8
  87. WS_EX_ACCEPTFILES = 16
  88. WS_EX_TRANSPARENT = 32
  89.  
  90. '#If (WINVER >= 400) Then
  91. WS_EX_MDICHILD = 64
  92. WS_EX_TOOLWINDOW = 128
  93. WS_EX_WINDOWEDGE = 256
  94. WS_EX_CLIENTEDGE = 512
  95. WS_EX_CONTEXTHELP = 1024
  96.  
  97. WS_EX_RIGHT = 4096
  98. WS_EX_LEFT = 0
  99. WS_EX_RTLREADING = 8192
  100. WS_EX_LTRREADING = 0
  101. WS_EX_LEFTSCROLLBAR = 16384
  102. WS_EX_RIGHTSCROLLBAR = 0
  103.  
  104. WS_EX_CONTROLPARENT = 65536
  105. WS_EX_STATICEDGE = 131072
  106. WS_EX_APPWINDOW = 262144
  107.  
  108. WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE
  109. WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST
  110. '#End If
  111.  
  112. '#If (WIN32WINNT >= 500) Then
  113. WS_EX_LAYERED = 524288
  114. '#End If
  115.  
  116. '#If (WINVER >= 500) Then
  117. WS_EX_NOINHERITLAYOUT = 1048576 ' Disable inheritence of mirroring by children
  118. WS_EX_LAYOUTRTL = 4194304 ' Right to left mirroring
  119. '#End If
  120.  
  121. '#If (WIN32WINNT >= 500) Then
  122. WS_EX_COMPOSITED = 33554432
  123. WS_EX_NOACTIVATE = 67108864
  124. '#End If
  125.  
  126. End Enum

代码说明

我不确定你在开发GUI应用程序方面有多少经验,所以我将给出窗口如何工作的一些背景知识.窗口具有唯一标识的数字,称为句柄.与窗口相关联的还有一个窗口过程,它处理该窗口的消息(标识事件和命令的整数).创建窗口时,您可以指定窗口所需的样式等等.对于Windows应用程序来说,复杂性要高得多,但为了避免陷入细节,我们将继续前进.

值得庆幸的是,.NET Winforms使我们不必与Windows API进行交互并直接处理消息(大多数情况下),并且可以非常轻松地创建功能性GUI应用程序. Windows API中有很多功能,大多数.NET开发人员通常不需要担心.

现在有了这样的背景,代码应该更容易理解.

首先,我们需要获得名为“notepad”的第一个进程.

  1. Dim notepad As Process = Process.GetProcessesByName("notepad")(0)

然后我们定义两个整数GWL_STYLE和GWL_EXSTYLE.这两个整数在SetWindowLong函数的上下文中具有特定含义.它们的值(以及许多其他常量的值)可以在Winuser.h和Windows SDK中的其余头文件中找到.

  1. Dim GWL_STYLE As Int32 = -16
  2. Dim GWL_EXSTYLE As Int32 = -20

接下来我们得到记事本主窗口的句柄.

  1. Dim hWnd As IntPtr = notepad.MainWindowHandle

之后我们遇到了GetWindowLong功能.来自MSDN:

The GetWindowLong function retrieves information about the specified window.

GetWindowLong获取窗口句柄和一个值,该值指示要检索的信息并返回指定的信息.

  1. Dim styles As WindowStyles = GetWindowLong(hWnd,GWL_STYLE)
  2. Dim exStyles As WindowStyles = GetWindowLong(hWnd,GWL_EXSTYLE)

这些都包括在内,因此您可以看到应用于窗口的样式,因此您可以确定要省略哪些样式.

接下来,我们定义要应用于窗口的样式.你可以阅读各种风格及其含义here.

  1. Dim newStyles As WindowStyles = WindowStyles.WS_VISIBLE Or WindowStyles.WS_BORDER

然后我们使用SetWindowLong将这些样式应用于窗口.来自MSDN:

The SetWindowLong function changes an attribute of the specified window.

SetWindowLong获取窗口句柄,指示要更改的属性的值以及属性的新值,并更改属性.

  1. SetWindowLong(hWnd,newStyles)

这基本上就是代码的作用.为了避免重复,我不会重复使用GWL_EXSTYLE,因为它的使用方式与GWL_STYLE完全相同.其余代码只是物流,允许我们使用SetWindowLong和GetWindowLong.

猜你在找的VB相关文章