百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

ccwgpt 2024-09-27 07:13 32 浏览 0 评论

窗口句柄获取方式:

WPF(Windows Presentation Foundation)

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

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

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

在WPF中,如果需要与操作系统的句柄交互,可以通过WindowInteropHelper类获取窗口句柄。这允许在WPF的ViewModel或其他代码中使用句柄,以便调用Win32 API或执行与句柄相关的操作。

WinForms(Windows Forms)

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

在WinForms中,可以直接在窗体类或控件类中使用句柄,无需额外的封装或包装。这使得WinForms更容易与底层的Win32 API进行交互,并执行与句柄相关的操作。

句柄使用方式:

WPF ViewModel 中使用 Win32 API

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

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

下面是一个示例代码,演示如何使用WindowInteropHelper获取窗口句柄以及如何使用句柄调用Win32 API函数来修改窗口样式。

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);
    }
}

仅演示了如何获取窗口句柄并修改窗口样式。

WinForms 中使用 Win32 API

在WinForms中,通过获取窗口句柄你可以实现一些底层的窗口交互功能,例如:

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

下面是一个示例代码,演示了如何在WinForms中获取窗口句柄,并使用句柄调用Win32 API函数来修改窗口样式。

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中获取窗口句柄并修改窗口样式

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

WPF和WinForms都是Windows桌面应用程序开发框架,它们可以通过窗口句柄与第三方程序交互。

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

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

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

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

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

#挑战30天在头条写日记#

#自律学习计划#

#实话实说#

相关推荐

一个基于.Net Core遵循Clean Architecture原则开源架构

今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...

AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%

写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...

OneCode低代码平台的事件驱动设计:架构解析与实践

引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...

国内大厂AI插件评测:根据UI图生成Vue前端代码

在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...

AI+低代码技术揭秘(二):核心架构

本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...

GitDiagram用AI把代码库变成可视化架构图

这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...

30天自制操作系统:第六天:代码架构整理与中断处理

1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...

AI写代码越帮越忙?2025年研究揭露惊人真相

近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...

一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具

一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...

5分钟掌握 c# 网络通讯架构及代码示例

以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...

从复杂到优雅:用建造者和责任链重塑代码架构

引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...

低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈

专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...

框架设计并不是简单粗暴地写代码,而是要先弄清逻辑

3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...

大佬用 Avalonia 框架开发的 C# 代码 IDE

AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...

轻量级框架Lagent 仅需20行代码即可构建自己的智能代理

站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...

取消回复欢迎 发表评论: