当前位置:首页 > 科技  > 软件

WPF 和 WinForms 关于句柄使用的区别

来源: 责编: 时间:2024-04-11 09:05:52 253观看
导读窗口句柄获取方式:WPF(Windows Presentation Foundation)WPF 是一种用于创建现代化用户界面的框架,是.NET的一部分。在 WPF 中,UI 元素以XML形式定义,并使用 XAML(eXtensible Application Markup Language)作为标记语言。WPF

SqA28资讯网——每日最新资讯28at.com

窗口句柄获取方式:

WPF(Windows Presentation Foundation)

WPF 是一种用于创建现代化用户界面的框架,是.NET的一部分。在 WPF 中,UI 元素以XML形式定义,并使用 XAML(eXtensible Application Markup Language)作为标记语言。WPF 使用 DirectX 渲染引擎,具有强大的图形渲染能力和可扩展性。SqA28资讯网——每日最新资讯28at.com

WPF 中的 UI 元素不直接依赖于底层操作系统的窗口句柄(handle),而是通过一个称为 HWNDSource 的包装类间接管理句柄。这样做的好处是,WPF 可以将多个 UI 元素绘制到单个窗口句柄上,从而提高性能和效率。WPF将整个窗口作为单个句柄,而不是每个UI元素一个句柄。这种设计使WPF能够更好地利用现代图形硬件进行渲染,并提供更高的性能和可扩展性。SqA28资讯网——每日最新资讯28at.com

WPF使用DirectX渲染引擎来绘制图形,而不是传统的GDI+。这使得WPF能够在屏幕上呈现出更丰富、更吸引人的用户界面,支持3D效果、动画和混合模式等功能。SqA28资讯网——每日最新资讯28at.com

在WPF中,如果需要与操作系统的句柄交互,可以通过WindowInteropHelper类获取窗口句柄。这允许在WPF的ViewModel或其他代码中使用句柄,以便调用Win32 API或执行与句柄相关的操作。SqA28资讯网——每日最新资讯28at.com

WinForms(Windows Forms)

WinForms 是一种基于传统的 Windows 应用程序开发框架,也是.NET的一部分。它采用了基于消息循环的模型,使用 GDI+(Graphics Device Interface)进行图形渲染。通过处理窗口消息来更新和呈现UI控件。每个UI控件都有自己的句柄,可以使用句柄来操作和控制该控件。在WinForms中,每个UI控件都对应一个操作系统的窗口句柄。当创建一个WinForms窗体时,会同时创建一个窗口句柄,并将其与该窗体关联。SqA28资讯网——每日最新资讯28at.com

在WinForms中,可以直接在窗体类或控件类中使用句柄,无需额外的封装或包装。这使得WinForms更容易与底层的Win32 API进行交互,并执行与句柄相关的操作。SqA28资讯网——每日最新资讯28at.com

句柄使用方式:

WPF ViewModel 中使用 Win32 API

在WPF中,可以使用WindowInteropHelper类来获取窗口句柄,并在ViewModel或其他代码中使用该句柄进行Win32 API调用或执行与句柄相关的操作。进而可以实现一些与底层窗口交互的功能,例如:SqA28资讯网——每日最新资讯28at.com

  • 在WPF窗口上显示Win32控件:可以将Win32控件嵌入到WPF窗口中。
  • 调用Win32 API函数:可以使用窗口句柄调用各种Win32 API函数,来实现一些特定的功能,例如修改窗口样式、发送窗口消息等。

下面是一个示例代码,演示如何使用WindowInteropHelper获取窗口句柄以及如何使用句柄调用Win32 API函数来修改窗口样式。SqA28资讯网——每日最新资讯28at.com

using System;using System.Runtime.InteropServices;using System.Windows;using System.Windows.Interop;namespace WpfInteropExample{    public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();        }        protected override void OnSourceInitialized(EventArgs e)        {            base.OnSourceInitialized(e);            // 获取窗口句柄            IntPtr hwnd = new WindowInteropHelper(this).Handle;            // 修改窗口样式为无边框窗口            const int WS_BORDER = 0x00800000;            const int WS_CAPTION = 0x00C00000;            const int WS_SYSMENU = 0x00080000;            const int WS_MAXIMIZEBOX = 0x00010000;            const int WS_MINIMIZEBOX = 0x00020000;            const int GWL_STYLE = -16;            int style = GetWindowLong(hwnd, GWL_STYLE);            SetWindowLong(hwnd, GWL_STYLE, style & ~(WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX));            // 重新应用窗口样式            SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, 0x0001 | 0x0002 | 0x0004);            // 设置窗口位置和大小            SetWindowPos(hwnd, IntPtr.Zero, 100, 100, 400, 300, 0x0001 | 0x0002);            // 设置窗口标题            SetWindowText(hwnd, "Modified Window Title");        }        // 导入需要使用的Win32 API函数        [DllImport("user32.dll", SetLastError = true)]        private static extern int GetWindowLong(IntPtr hWnd, int nIndex);        [DllImport("user32.dll")]        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);        [DllImport("user32.dll")]        private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);        [DllImport("user32.dll", CharSet = CharSet.Auto)]        private static extern int SetWindowText(IntPtr hwnd, string lpString);    }}

仅演示了如何获取窗口句柄并修改窗口样式。SqA28资讯网——每日最新资讯28at.com

WinForms 中使用 Win32 API

在WinForms中,通过获取窗口句柄你可以实现一些底层的窗口交互功能,例如:SqA28资讯网——每日最新资讯28at.com

  • 调用Win32 API函数:可以使用窗口句柄调用各种Win32 API函数,来实现一些特定的功能,比如修改窗口样式、发送窗口消息等。
  • 使用原生窗口控件:可以将原生的Win32控件嵌入到WinForms窗口中。

下面是一个示例代码,演示了如何在WinForms中获取窗口句柄,并使用句柄调用Win32 API函数来修改窗口样式。SqA28资讯网——每日最新资讯28at.com

using System;using System.Runtime.InteropServices;using System.Windows.Forms;namespace WinFormsInteropExample{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        protected override void OnHandleCreated(EventArgs e)        {            base.OnHandleCreated(e);            // 获取窗口句柄            IntPtr hwnd = this.Handle;            // 修改窗口样式为无边框窗口            const int WS_BORDER = 0x00800000;            const int WS_CAPTION = 0x00C00000;            const int WS_SYSMENU = 0x00080000;            const int WS_MAXIMIZEBOX = 0x00010000;            const int WS_MINIMIZEBOX = 0x00020000;            const int GWL_STYLE = -16;            int style = GetWindowLong(hwnd, GWL_STYLE);            SetWindowLong(hwnd, GWL_STYLE, style & ~(WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX));            // 重新应用窗口样式            SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, 0x0001 | 0x0002 | 0x0004);            // 设置窗口位置和大小            SetWindowPos(hwnd, IntPtr.Zero, 100, 100, 400, 300, 0x0001 | 0x0002);            // 设置窗口标题            SetWindowText(hwnd, "Modified Window Title");        }        // 导入需要使用的Win32 API函数        [DllImport("user32.dll", SetLastError = true)]        private static extern int GetWindowLong(IntPtr hWnd, int nIndex);        [DllImport("user32.dll")]        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);        [DllImport("user32.dll")]        private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);        [DllImport("user32.dll", CharSet = CharSet.Auto)]        private static extern int SetWindowText(IntPtr hwnd, string lpString);    }}

这个示例代码演示了如何在WinForms中获取窗口句柄并修改窗口样式SqA28资讯网——每日最新资讯28at.com

均可以通过句柄与第三方组件交互

WPF和WinForms都是Windows桌面应用程序开发框架,它们可以通过窗口句柄与第三方程序交互。SqA28资讯网——每日最新资讯28at.com

在WPF中,可以使用WindowInteropHelper类获取窗口句柄,然后调用Win32 API函数来与第三方程序进行交互。例如,可以使用FindWindow函数查找第三方程序的窗口句柄,然后使用SendMessage函数向该窗口发送消息,或者使用SetWindowPos函数控制该窗口的位置和大小等。SqA28资讯网——每日最新资讯28at.com

在WinForms中,可以使用Control.Handle属性获取窗口句柄,然后调用Win32 API函数来与第三方程序进行交互。例如,可以使用FindWindow函数查找第三方程序的窗口句柄,然后使用SendMessage函数向该窗口发送消息,或者使用SetWindowPos函数控制该窗口的位置和大小等。SqA28资讯网——每日最新资讯28at.com

这种基于窗口句柄的交互方式,可以让WPF和WinForms应用程序与其他Windows应用程序无缝地集成,实现各种功能的互通和共享。但需要注意的是,由于涉及到与外部程序的交互,因此需要谨慎处理,避免出现安全和稳定性问题。SqA28资讯网——每日最新资讯28at.com

通过句柄与第三方程序交互的好处有以下几点:

  • 可以实现与其他Windows应用程序的无缝集成。通过窗口句柄,WPF和WinForms应用程序可以直接访问和控制其他Windows应用程序的窗口、消息、位置、大小等属性和方法,从而实现各种功能的互通和共享。
  • 可以扩展应用程序的功能。通过与其他Windows应用程序交互,WPF和WinForms应用程序可以获取一些原生应用程序无法提供的功能和数据,从而使应用程序更加丰富和强大。
  • 可以提高应用程序的用户体验。通过与其他Windows应用程序交互,WPF和WinForms应用程序可以让用户更加方便地完成一些任务,例如在文本编辑器中插入图片、在浏览器中打开链接等,从而提高用户的满意度和忠诚度。

本文链接:http://www.28at.com/showinfo-26-82758-0.htmlWPF 和 WinForms 关于句柄使用的区别

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Rust中的Eq和PartialEq详解与实践

下一篇: Python新手必读:掌握Bytearray对象的使用技巧

标签:
  • 热门焦点
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之“想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!”曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • Android 14发布:首批适配机型公布

    5月11日消息,谷歌在今天凌晨举行了I/O大会,本次发布会谷歌带来了自家的AI语言模型PaLM 2、谷歌Pixel Fold折叠屏、谷歌Pixel 7a手机,同时发布了Androi
  • OPPO K11搭载高性能石墨散热系统:旗舰同款 性能凉爽释放

    日前OPPO官方宣布,将于7月25日14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
Top