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

2024-02-09

有没有办法从 VB.NET 程序中删除另一个应用程序窗口(例如记事本)的边框/框架(Aero 位)?


您可以使用 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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 我应该将一个任务包装在另一个任务中还是应该返回创建的任务?

    我正在构建一个使用 ADO NET 的 NET 4 0 应用程序 因此我无法使用 async await 我不想要一个解决方案 但我确实想知道以下哪种实现是最好的以及为什么 我的单元测试通过了所有三个实现 但我想知道这三个之间的区别 1 嵌
  • 每个 System.ComponentModel.DataAnnotations 属性的用途是什么?

    我正在使用带有 POCO 的实体框架 4 制作 MVC 3 应用程序 我想尽可能多地注释我的所有实体 然而 我遇到一个问题 我无法找到有关每个属性含义的良好文档 有些非常简单 比如 Required or StringLength 具有像这
  • 是否可以防止 DataGridView 中出现多行 HeaderText?

    当长度为HeaderText属性达到一定的字符限制并且文本中有空格 WinForms 会自动在标题中插入链接中断 我想要的是 Measurement Value 我得到什么 Measurement Value 有足够的空间来显示所有标题单元
  • 将 .Net-Repeater 与 jquery 结合使用

    我有一个中继器 ASP Net
  • 如何使用 System.Json 进行漂亮的打印?

    使用新的System Json 从 4 5 开始 http msdn microsoft com en us library system json 28v vs 95 29 aspx或同等的来自 Nuget 的 4 0 的 System
  • 随着索引和文档数量恒定,elasticsearch 批量索引会随着时间的推移而变慢

    我遇到了使用 NET NEST 客户端和 ElasticSearch 进行批量索引的性能随着时间的推移 索引数量和文档数量恒定而降低的情况 我们正在奔跑ElasticSearch Version 0 19 11 JVM 23 5 b02在具
  • 提高UDP可靠性

    我正在构建一个基于 UDP 的小型服务器 服务器基于 Net并使用它自己的Socket类 我通过 ReceiveMessageFromAsync 和异步发送使用完成端口 我的问题是我失去了大约 5 10 的流量 现在我明白这是正常的 但是有
  • AutoCAD 插件开发示例

    我对开发 AutoCAD 插件感兴趣 并试图了解几种不同类型的 AutoCAD 插件文件之间的关系 随 AutoCAD 插件一起提供的托管 DLL ARX 文件 https fileinfo com extension arx附带 Auto
  • .Net 如何创建一个在进程的所有AppDomain之间共享的自定义ThreadPool?

    我制作了一个针对我的特定需求进行优化的自定义线程池 但是 当进程中有多个 AppDomain 时 CLR ThreadPool 能够在所有 AppDomain 之间共享 我希望能够重现这种行为 这可以使用 MarshalByRefObjec
  • Linq 警告

    Linq 是 NET 的一个很棒的补充 我发现它在很多情况下都对我很有帮助 尽管我才刚刚开始学习如何使用 Linq 然而 在阅读有关 Linq 的文章时 我发现开发人员需要留意一些微妙的事情 否则可能会导致麻烦 我已经添加了一个明确的警告
  • PostSharp AssemblyLoadException Autofac

    我正在设置一个新的解决方案 我想在其中使用最新的 Autofac 3 4 和 PostSharp 3 1 42 引用 NuGet 包后 出现以下错误 并且我无法弄清楚发生了什么 我从未选择 Autofac 3 3 0 包 包 config
  • VB.NET 中的 IndexOf 与字符串数组

    如何在以下代码中找到字符串数组中项目的索引 Dim arrayofitems as String Dim itemindex as UInteger itemindex arrayofitems IndexOf item test Dim
  • 基于 Netsuite 令牌的 API 调用中的身份验证不明确

    我正在尝试使用基于令牌的身份验证对 Netsuite API 进行 SOAP 调用 我有一个从 WDSL 生成的 C 客户端 它正在发送以下请求 已替换机密
  • LINQ to SQL 选择“按多列区分”并返回整个实体

    我正在使用第三方数据库 需要为我正在研究的特定市场选择一组不同的数据 每个市场的数据都是相同的 因此将其全部引入是多余的 并且我不想硬编码围绕它的任何逻辑 因为我们正在与供应商合作解决问题 但我们需要一个修复程序与供应商合作修复以及数据库当
  • 比较 .NET 中的两个字节数组

    我怎样才能快速做到这一点 当然我可以这样做 static bool ByteArrayCompare byte a1 byte a2 if a1 Length a2 Length return false for int i 0 i
  • 如何在插件场景中实现程序集绑定重定向?

    我有一个plugin P延伸和application A NET40 我无法控制 P 程序集 NET40 有一个shared dependency D NET35 P和D都依赖于FSharp Core 但版本不同 P是针对FSharp Co
  • 提高 ASP.NET/C# 编译速度的最佳方法是什么?

    更新 请将您的答案集中在硬件解决方案上 您使用什么硬件 工具 插件来提高 ASP NET 编译和首次执行速度 我们正在寻找固态硬盘来加快速度 但现在价格确实很高 我现在有两个 RAID 0 的 7200 rpm 硬盘 但我对性能不再满意 所
  • 无法在 TFS 中签入 UserControl.xaml 文件。接收错误:TF10169

    Visual Studio 2013 中的项目类型是桌面应用程序 我在该桌面应用程序中添加了 XAML 格式的用户控件 我使用了一些兼容性函数和库 以便 xaml 控件能够与简单的桌面应用程序集成 TFS 正在检查其他相关文件 但是当将 x
  • 如何像用户打字一样将输入发送到控制台?

    这是我的问题 我有一个程序必须在 TTY 中运行 cygwin 提供了这个 TTY 当我重定向 stdIn 时 程序失败 因为它没有 TTY 我无法修改该程序 并且需要某种方法使其自动化 如何抓取 cmd exe 窗口并向其发送数据并使其认
  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca

随机推荐

  • 在inno setup中如何设置unins000.exe的产品名称、产品版本和版权属性[重复]

    这个问题在这里已经有答案了 我已经使用 inno setup 创建了一个安装程序 一切正常 但安装后将生成 unins000 exe 该 exe 没有设置产品名称 产品版本和版权属性 任何人都可以解释一下如何构建安装程序 以便 unins0
  • 在 Swing 中,是否有一个属性可以设置 JList 禁用前景色?

    在 Swing 中 是否有一个属性可以设置 JList 禁用前景色 我正在使用 Netbeans GUI 构建器 并且想向资源属性文件添加一个属性 以便在禁用 JList 时将 JList 中的文本颜色设置为不同的默认颜色 使用 Nimbu
  • document.querySelector() 返回 null

    我正在创造一个聚合物元件 我已经制作了模板 现在正在编写脚本 由于某种原因 document querySelector 为类和 id 选择器返回 null 不确定这是否不适用于聚合物 没有理由它不应该 或者我没有导入某些东西或者还有什么问
  • NodeJS - setTimeout(fn,0) 与 setImmediate(fn)

    这两者之间有什么区别 什么时候我会使用其中一种而不是另一种 设置超时时间就像延迟完成后调用该函数一样 每当调用一个函数时 它不会立即执行 而是排队 以便在所有正在执行和当前排队的事件处理程序首先完成后执行 setTimeout 0 本质上意
  • pandas 中的 isin() 方法忽略重复值。我们怎样才能防止这种情况发生?

    我正在从数据框中获取所有值 我无法在此处显示它 但代码中提到的所有列名称都存在于该数据框中 因为 我使用 isin 方法从列中获取值 isin 方法不会给您重复的值 但我也想要重复的值 在上面的代码中 我展示了如何使用 isin 方法从多个
  • PDFBox:PDPageContentStream 的附加模式行为不当

    我正在 PDF 页面之一上绘制图像 当我使用PDPageContentStream stream new PDPageContentStream doc page 绘制图像 一切正常 见下图 但是当我使用构造函数时PDPageContent
  • J2ME网络服务

    我已经创建了 J2me 应用程序 原型 现在我必须向其中添加用 Net 编写的 Web 服务 怎么做 我正在寻找开发 j2me 客户端的过程 在其中我可以传递与 Net Web 服务中类似的参数 正如 sreehari 所解释的 首先您需要
  • NullPointEreException 与 getActionBar

    我的平板电脑界面 Android gt 3 有一个非常奇怪的行为 当我启动它时 它就像一个 Android 2 界面 标题位于底部 当然 当我调用 getActionBar 时 它会返回 null 我的 min sdk 和 target s
  • numpy.random.Generator 与 RandomState 有何不同?

    Generator听起来像是替代品RandomState 以及未来在 NumPy 中生成随机数的方式 什么功能或行为 当前或计划中 的作用Generator有那个RandomState没有吗 两者都可以参数化BitGenerator对象 他
  • SensorTag 2 CC2650 无限期广告固件

    我想使用 SensorTag 2 这样它就可以从打开到关闭时一直广播其数据 并且可以通过蓝牙进行关键连接 开箱即用时 标签设置为仅通过蓝牙进行几分钟的广告 这意味着当连接最终失败或连接到标签的设备启动等时 如果不物理访问标签并重置 您将无法
  • 为什么 void{} 不存在? [复制]

    这个问题在这里已经有答案了 我想知道为什么void 是一个纯右值void but void 不存在 请参阅以下答案 https stackoverflow com a 37708167 293195 https stackoverflow
  • 如何使用python处理.mdb访问文件

    有人能给我指出如何在 python 中打开 mdb 文件的正确方向吗 我通常喜欢包含一些代码来开始讨论 但我不知道从哪里开始 我使用 mysql 和 python 进行了相当多的工作 我想知道是否有一种方法可以以类似的方式处理 mdb 文件
  • MySQL/SQL:使用更新表本身的相关子查询进行更新

    我有一个通用问题 我将尝试用一个例子来解释 假设我有一个包含字段的表 id name category appearances 和 ratio 我的想法是 我有几个项目 每个项目都与一个类别相关 并且 出现 多次 比率字段应包括每个项目的出
  • 通过默认相机活动拍摄高质量图像并将其保存到 SD 卡上

    我正在通过默认相机活动拍摄高分辨率照片 使用intent put Extras 并将其保存到SD卡 Code public class CameraActivity extends Activity implements OnClickLi
  • 与 create-react-app 开玩笑 - 意外的令牌错误

    我正在开发一个应用程序 该应用程序最近从旧的 Webpack 版本转换为使用create react app 大部分过渡都很顺利 但我在之前的单元测试中遇到了一些重大问题 当我跑步时npm test其中有标准的 package json 测
  • jQuery UI:Safari (mac) 中的 Droppable('drop' 事件,容差:触摸)错误

    我无法解决以下问题 以下代码适用于所有浏览器mac和窗户一样 除了它部分适用于 macs safari 5 1 5 Note 它适用于 Windows Safari 5 1 5 这是基本结构 div2 droppable accept di
  • .NET SDK 不支持使用 Visual Studio 2022 定位 .NET 6.0

    我已在 Visual Studio 2022 中创建了 NET 6 项目 但收到此错误 当前的 NET SDK 不支持面向 NET 6 0 目标为 NET 5 0 或更低版本 或者使用支持 NET 6 0 的 NET SDK 版本 虽然do
  • 无法从 onActivityResult 更新 Fragment UI

    我正在开发一个应用程序 其中有一个扩展 FragmentActivity 的类 在 onResume 方法中 我正在调用一个类 我将为其发送此fragmentactivity 的引用 并且在该类中我将其替换为另一个片段 在该片段中 我动态添
  • 为什么 TypeTag 没有方法 runtimeClass 但 Manifest 和 ClassTag 有

    我有这段代码一般将 String 转换为 Dto 如果我使用 Manifest 和 ClassTag 我都可以使用方法运行时类获取运行时类 但是TypeTag没有这个方法 class ObjectMapper T def readValue
  • 使用 VB.NET 删除另一个程序的框架/窗口/边框(Aero 位)

    有没有办法从 VB NET 程序中删除另一个应用程序窗口 例如记事本 的边框 框架 Aero 位 您可以使用 P Invoke 来做到这一点 下面是一些使用的代码设置窗口长度 http msdn microsoft com en us li