.NET GUI 中是不是仍在使用本机 Windows 控件?
Posted
技术标签:
【中文标题】.NET GUI 中是不是仍在使用本机 Windows 控件?【英文标题】:Are native Windows Controls still used in .NET GUIs?.NET GUI 中是否仍在使用本机 Windows 控件? 【发布时间】:2013-04-21 12:38:45 【问题描述】:当您使用 WinForms 或 WPF 创建 GUI 时显示的内容是否仍然基于本机控件,例如 Common Controls 或任何 system provided Window Classes,或者显示的所有内容都是由框架绘制的“自定义”?
注意:我说的不是文件对话框之类的东西,而是实际使用 WinForms 或 WPF 实现的 GUI。
是的,这纯粹是出于兴趣。
【问题讨论】:
WPF 对Window
对象使用“HWND”,但窗口内的所有其他对象(控件)都是与 Win32 没有任何关系的 WPF 对象,因为 AFAIK,winforms 使用单独的每个 UI 元素的 HWND。
【参考方案1】:
Windows 窗体对某些 UI 元素使用本机控件。 WPF 自己绘制所有内容。
【讨论】:
【参考方案2】:用户 HighCore 评论:
WPF 对 Window 对象使用“HWND”,然后对所有其他对象使用 Window里面的(Controls)是WPF对象,跟Win32无关 无论如何,在 AFAIK 中,winforms 为每个 UI 使用单独的 HWND 元素。
事实上,使用 Spy++,当我们创建一个带有简单对话框/窗口和按钮的测试应用程序时,我们可以观察到以下情况:
MFC/本机:
应用程序窗口是一个窗口 (HWND),其窗口类为#32770 (Dialog)
(我使用了“基于对话框”的应用程序。)
按钮是一个单独的窗口(类:Button
)
Windows 窗体:
应用程序窗口有窗口类WindowsForms10.Window.8.app.0.2bf8098_r20_ad1
(哦,我的)
按钮是一个单独的窗口(类:WindowsForms10.BUTTON.app.0.2bf8098_r20_ad1
)
WPF
只有 一个 ***窗口,尽管我在 UI 设计器中为该窗口添加了一个组合框、一个列表框和一个菜单。 唯一窗口的类是:HwndWrapper[WpfApplication1.exe;;9b1aec0f-1b88-419c-8730-858906314cd9]
Window 类的名称实际上非常有趣:使用 MFC/native 类,您可以获得多年来已知并记录在 MSDN 上的类。对于 Windows 窗体,它似乎总是使用相同的类名。使用 WPF,窗口类的名称似乎也包含可执行文件/进程名称。
显然,MS 认为不再需要每个窗口使用多个窗口。我想我需要为此提出第二个问题。
【讨论】:
Spy++ 不是逆向工程的好工具,你不能轻易看到各种弹出窗口。像工具提示、上下文菜单、组合框下拉菜单。也很容易错过遗留的,比如 shell 对话框和网络浏览器。以上是关于.NET GUI 中是不是仍在使用本机 Windows 控件?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 Net::Telnet 会话是不是仍在 Perl 中?