首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从c#注册自定义win32窗口类

从您的问题中,我了解到您想要了解如何在C#中注册自定义Win32窗口类。以下是一个简单的示例,说明如何在C#中注册自定义Win32窗口类:

代码语言:csharp
复制
using System;
using System.Runtime.InteropServices;

public class CustomWindow : IDisposable
{
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern ushort RegisterClass(ref WNDCLASS lpWndClass);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr CreateWindowEx(uint dwExStyle, string lpClassName, string lpWindowName, uint dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool DestroyWindow(IntPtr hwnd);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool UnregisterClass(string lpClassName, IntPtr hInstance);

    private const int CS_HREDRAW = 0x0002;
    private const int CS_VREDRAW = 0x0001;
    private const int CW_USEDEFAULT = unchecked((int)0x80000000);
    private const uint WS_OVERLAPPEDWINDOW = 0x00CF0000;
    private const uint WS_EX_APPWINDOW = 0x00040000;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    private struct WNDCLASS
    {
        public uint style;
        public WndProcDelegate lpfnWndProc;
        public int cbClsExtra;
        public int cbWndExtra;
        public IntPtr hInstance;
        public IntPtr hIcon;
        public IntPtr hCursor;
        public IntPtr hbrBackground;
        public string lpszMenuName;
        public string lpszClassName;
    }

    private delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

    private readonly WNDCLASS _wndClass;
    private readonly WndProcDelegate _wndProc;
    private readonly IntPtr _hInstance;
    private readonly IntPtr _hwnd;

    public CustomWindow()
    {
        _wndProc = WndProc;
        _hInstance = Marshal.GetHINSTANCE(typeof(CustomWindow).Module);

        _wndClass = new WNDCLASS
        {
            style = CS_HREDRAW | CS_VREDRAW,
            lpfnWndProc = _wndProc,
            hInstance = _hInstance,
            lpszClassName = "CustomWindowClass",
        };

        ushort classAtom = RegisterClass(ref _wndClass);
        if (classAtom == 0)
        {
            throw new Exception("Failed to register window class.");
        }

        _hwnd = CreateWindowEx(
            WS_EX_APPWINDOW,
            "CustomWindowClass",
            "Custom Window",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            IntPtr.Zero,
            IntPtr.Zero,
            _hInstance,
            IntPtr.Zero);

        if (_hwnd == IntPtr.Zero)
        {
            throw new Exception("Failed to create window.");
        }
    }

    public void Show()
    {
        ShowWindow(_hwnd, 1);
        UpdateWindow(_hwnd);
    }

    public void Dispose()
    {
        DestroyWindow(_hwnd);
        UnregisterClass(_wndClass.lpszClassName, _hInstance);
    }

    private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
    {
        switch (msg)
        {
            case 0x0010: // WM_CLOSE
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, msg, wParam, lParam);
        }

        return IntPtr.Zero;
    }

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool UpdateWindow(IntPtr hWnd);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr DefWindowProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
}

这个示例创建了一个名为“CustomWindowClass”的自定义窗口类,并使用该类创建了一个名为“Custom Window”的窗口。您可以根据需要修改此示例以满足您的需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WIN32 API —— 最简单的Windows窗口封装

1 开发语言抉择 1.1 关于开发Win32 程序的语言选择 C还是C++ 在决定抛弃MFC,而使用纯Win32 API 开发Window桌面程序之后,还存在一个语言的选择,这就是是否使用C++...2 Windows窗口对象的封装 对Windows桌面程序而言,Window和Message的概念是核心。首先需要封装的就是窗口,例如MFC就是用CWnd封装了窗口对象。...= registeredClassArray.end(); it++) // 判断对象的是否注册过 { if ((*it) == _vPtr) break; }...if (it == registeredClassArray.end()) // 如果没注册过,则进行注册 { //注册窗口 WNDCLASSEX...如果没有,则注册窗口,并把虚表指针存放到vptrArray链表中;如果存在,则直接使用该虚表指针对应的窗口

1.7K10

C#后台代码调转到窗口设计器,窗口ID,句柄,名区别

但是在当前窗口后台代码选中其它窗口名查看其它窗口设计时,使用shift+F7还是跳转到到当前窗口,所以我们需要先按F12转到定义,再按shift+F7转到窗口设计。...,应用程序通过窗口句柄对窗口进行操作。...除了窗口句柄之外,任何一种资源都有它自己的句柄,比如光标句柄、位图句柄等。窗口ID是窗口在应用程序中的唯一标识,通过窗口ID可以获取窗口句柄。...同一个命名空间下窗口ID是唯一的,如果引用别的命名空间窗口,格式为:命名空间.窗口ID。 窗口设计名(text属性): 前台显示名字,没有唯一性。...窗口文件名字(解决方案下窗口目录名): 该名是该窗口存在项目文件夹的名字,也具唯一性,它包含了许多子定义,但它和普通的自定义不一样,引用时是命名空间.窗口ID,而不是命名空间.窗口

69641

C#到TypeScript -

C#到TypeScript - 在ES6之前Javascript的都是用function定义的,ES6把关键字正式加进来,虽说其实也还是function,不过代码可读性上好了不少。...TypeScript同样支持class,并且和C#也非常相似,下面来看看: C#一样,由构造函数,属性,方法组成,属性和方法有三个级别的访问权限:private, protected, public...不过不同的是C#的成员默认是private,而TypeScript默认是public。 在里面所有成员都必须用this来访问。...,而且都是构造函数赋值的,也就是其实构造函数的参数就是的成员,这就是参数属性。...这点和C#一样,都可以用抽象来把有共同行为抽象出来,关键字都是abstract。

1K90

WPF自学入门(九)WPF自定义窗口

今天简单记录一个知识点:WPF自定义窗口,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名。...第一次尝试使用WPF直接修改后台代码继承自定义窗体SEWindow后就会报错如下: ?...经过一段时间查看WPF相关数据资料,可按如下方法创建继承自 Window 基自定义窗口。...步骤如下: 一、创建Window的基 添加一个名为 SEWindow 的,Window 引入System.Windows 命名空间,关闭事件,双击事件,最大化与还原事件可能存在重载版本的时间及方法需要用...二、使用Window的基 创建窗口,后台改为继承自定义的 窗体基

1.9K20

C# 基础精讲】自定义异常

自定义异常C#中异常处理的一种重要方式,它允许您创建具有自定义错误信息和处理逻辑的异常类型,以提高程序的可读性和可维护性。...通过自定义异常,您可以为特定的业务逻辑或应用场景创建更有意义的异常,使错误处理更加精确和有效。本文将详细介绍如何创建和使用自定义异常,并探讨自定义异常的最佳实践。 1....独立处理逻辑: 自定义异常可以重写基中的方法,提供特定的处理逻辑,使错误处理更加准确和灵活。 2. 创建自定义异常C#中,创建自定义异常非常简单,只需Exception派生即可。...使用自定义异常 使用自定义异常与使用系统内置异常类似。您可以在代码中引发和捕获自定义异常,以及根据异常类型提供不同的处理逻辑。...总结 自定义异常C#中异常处理的强大工具,它允许您为特定的业务逻辑或功能创建更具有意义的异常,提供更精确的错误信息和处理逻辑。

26630

【答疑解惑第十二讲】windows编程学习框架图

广义上说只要运行在下的窗口程序都可以作为目标,但是微软还是搞了好几种编程语言都可以编写窗口程序,比如C/C++、C#、VB;甚至还是非微软系列的,比如C++ 等等,但是不管这些表面怎么不同,始终是长在这个平台上...它不只是有编写Win32的指导,好包括MFC、C#、VB、COM、等下各种编程的说明文档,所以只要你是在环境下开发windows编程,都有很多值得参考的编程技术指导。   ...四,了解编程这里不涉及C#和VB这种其他语言的下的应用,而是特指C/C++编写。编写程序一般有两种,一种是MFC;一种是Win32编程,一般这种就是通常所说的编程,它跟下编程不是一个概念。...MFC全称是微软基础库( ),它是微软公司将的那些常用的API函数封装成了相关的,比如典型的窗口就封装了窗口的管理的各种方法和熟悉,各种控件都有窗口派生出来。...Win32编程是最“原始”的编程模式,只要有C语言基础就可以,这种编程模式就是采用C语言+ API调用的方式,MFC那些封装的成员函数,最后也都是调用了的API接口。

46520

源码角度学习JVM加载器及自定义加载器

B站搜索“乐哥聊编程“有本篇文章配套视频‍ https://www.bilibili.com/video/BV1cP4y117Qt 加载器分类 引导加载器(「Bootstrap ClassLoader...」) 负责加载支撑JVM运行的位于JRE的lib目录下的核心库,这个加载器是由C++写的,所以我们在java源码里面是找不到它的实现,如果尝试对它进行打印,输出将为空值。...扩展加载器(「Extension ClassLoader」) 负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR 包,也可以使用java.ext.dirs来指定路径,一般保持默认就好...应用程序加载器(「Application ClassLoader」) 负责加载路径下的jar包和class文件,我们自己写的代码都是通过这个加载加载的 自定义加载器 我们自己去实现的加载器,其父加载器为应用程序加载器...加载器之间的关系 验证加载器加载的路径 package com.lglbc.day1; import sun.misc.Launcher; import java.net.URL; /**

36720

【答疑解惑第十二讲】windows编程学习框架图

广义上说只要运行在Windows下的窗口程序都可以作为目标,但是微软还是搞了好几种编程语言都可以编写Windows窗口程序,比如C/C++、C#、VB;甚至还是非微软系列的,比如C++ builder...它不只是有编写Win32的指导,好包括MFC、C#、VB、COM、DirectX等Windows下各种编程的说明文档,所以只要你是在Windows环境下开发,都有很多值得参考的编程技术指导。...MFC全称是微软基础库(Microsoft Foundation Classes),它是微软公司将Windows的那些常用的API函数封装成了相关的,比如典型的窗口就封装了窗口的管理的各种方法和熟悉...,各种控件都有窗口派生出来。...Win32编程是Windows最“原始”的编程模式,只要有C语言基础就可以,这种编程模式就是采用C语言+Windows API调用的方式,MFC那些封装的成员函数,最后也都是调用了Windows的API

1.5K71

C#】分享基于Win32 API的服务操作(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)

这个我认为是托管方法中首选的方法,事实上它就是对上述两个安装的封装。...对于服务(ServiceBase)来说,用VS添加安装程序后,便会自动生成一个叫ProjectInstaller的,这个就标有RunInstallerAttribute特性。...ProjectInstaller本身会携带两个installer实例,分别属于ServiceProcessInstaller和ServiceInstaller,ProjectInstaller得到执行的时候会把这俩实例也加入上述...Marshal.PtrToStructure(ptr, structure); //根据指针拿到结构 dependentServices[i] = structure.serviceName; //结构中拿到服务名.../// /// Win32 API相关 /// private static class Win32Class

1.4K20

Win32C# 应用不依赖任何库使用纯 GDI+ 对窗口截图(BitBlt)

在 Windows 上有 GDI+ 来操作位图,不止能完成很多的位图操作,还提供了与 Win32 窗口的互操作,可以截到 Win32 窗口的图片。 如果你希望对窗口截图,那么可使用本文提供的方法。...如果你的项目可以使用 System.Drawing.Bitmap 的话,那更推荐直接使用 Bitmap,那样更简单。...请参考 Win32/C# 应用不依赖任何库使用纯 GDI+ 对窗口截图(BitBlt) - walterlv。...更多截窗口方法 Win32/C# 应用使用 GDI+ 对窗口截图(BitBlt) - walterlv (本文)Win32/C# 应用不依赖任何库使用纯 GDI+ 对窗口截图(BitBlt) - walterlv...Win32/C# 应用使用 PrintWindow 对窗口截图(PrintWindow) - walterlv 参考资料 Capturing an Image - Win32 apps - Microsoft

52020
领券