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

如何在C#中调用winapi更改窗口图标

在C#中调用WinAPI更改窗口图标,可以通过以下步骤实现:

  1. 首先,需要引入System.Runtime.InteropServices命名空间,以便使用DllImport特性来调用WinAPI函数。
  2. 使用DllImport特性声明user32.dll库中的SetClassLongPtr函数,该函数用于设置窗口类的属性。
代码语言:txt
复制
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SetClassLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
  1. 定义SetClassLongPtr函数的常量参数。
代码语言:txt
复制
private const int GCLP_HICON = -14;
private const int ICON_SMALL = 0;
private const int ICON_BIG = 1;
  1. 创建一个Icon对象,用于表示要设置的窗口图标。
代码语言:txt
复制
Icon icon = new Icon("path_to_icon_file.ico");
  1. 获取窗口句柄。
代码语言:txt
复制
IntPtr hWnd = Process.GetCurrentProcess().MainWindowHandle;
  1. 调用SetClassLongPtr函数来设置窗口类的属性,将图标应用到窗口。
代码语言:txt
复制
SetClassLongPtr(hWnd, GCLP_HICON + ICON_SMALL, icon.Handle);
SetClassLongPtr(hWnd, GCLP_HICON + ICON_BIG, icon.Handle);

完整的代码示例:

代码语言:txt
复制
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Drawing;

public class Program
{
    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr SetClassLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

    private const int GCLP_HICON = -14;
    private const int ICON_SMALL = 0;
    private const int ICON_BIG = 1;

    public static void Main()
    {
        Icon icon = new Icon("path_to_icon_file.ico");
        IntPtr hWnd = Process.GetCurrentProcess().MainWindowHandle;

        SetClassLongPtr(hWnd, GCLP_HICON + ICON_SMALL, icon.Handle);
        SetClassLongPtr(hWnd, GCLP_HICON + ICON_BIG, icon.Handle);
    }
}

请注意,上述代码中的"path_to_icon_file.ico"应替换为实际的图标文件路径。此外,该代码仅适用于当前进程的主窗口,如果需要更改其他窗口的图标,需要获取相应窗口的句柄。

这是一个使用C#调用WinAPI更改窗口图标的基本示例。在实际应用中,可以根据具体需求进行扩展和优化。

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

相关·内容

MessageBox

MessageBox MessageBox指的是显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息,状态或错误的信息。...指定下列标志的一个来显示消息框的按钮以及图标。 uType参数 按钮 按钮参数 含义 MB_OK 默认值。有一个确认按钮在里面。 MB_YESNO 有是和否在里面。...MB_TASKMODAL 当调用应用程序或库没有一个可以得到的窗口句柄时,使用此标志。...MB_RIGHT 文本为右调整 MB_RTLREADING 用在Hebrew和Arabic系统从右到左的顺序显示消息和大写文本。 MB_SETFOREGROUND 消息框变为前景窗口。...在内部系统为消息个调用SetForegroundWindow函数。 MB_TOPMOST 消息框用WS_EX_TOPMOST窗口类型来创建MB_SERVICE_NOTIFICATION。

45910
  • c#——IntPtr

    c#无法将类型“int”隐式转换为“System.IntPtr” 这个是我引用了一个api函数时出现的问题,我在声明把intptr换成了int还是不可以,这是为什么呢?要如何处理呢?...答: 您好,C#的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。...例如,在一个C#程序调用Win32API mciSendString函数控制光盘驱动器,这个函数的函数原型是: MCIERROR mciSendString( LPCTSTR lpszCommand..., LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback ); 首先在C#声明这个函数: [DllImport("winmm.dll...声明Win32API时,一定要按照WinAPI的原型来声明,不要改变它的数据类型; 二是尽量不要过多使用类型强制转换或构造函数的方式初始化一个IntPtr类型的变量,这样会使程序变得难于理解并容易出错

    95431

    dotnet 从入门到放弃的 500 篇文章合集

    C# 判断系统版本 C# 动态加载卸载 DLL C# 复制列表 C# 如何写 DEBUG 输出 C#何在项目引用x86 x64的非托管代码 C# 已知点和向量,求距离的点 C# 强转会不会抛出异常...C# 很少人知道的科技 C# 快速释放内存的大数组 C# 搜索算法 C# 获得设备usb信息 C# 转换类型和字符串 C# 遍历枚举 C# 金额转中文大写 C#将dll打包到程序 c-70 c-设计模式...UWP 和 WPF 对比 UWP 开发,需要知道的1000个问题 Visual studio C# 代码使用 NotNull visual Studio 无法调试,提示程序跟踪已退出 visual-studio...+Tab 隐藏窗口 WPF 好看的矢量图标 wpf 如何使用 Magick.NET 播放 gif 图片 WPF 如何在 WriteableBitmap 写文字 WPF 如何在应用程序调试启动 WPF 如何在绑定失败异常...,主窗口不在最前 WPF 设置纯软件渲染 WPF 设置输入只能英文 WPF 调试 获得追踪输出 WPF 资源冻结 WPF 高性能笔 WPF 鼠标移动到列表上 显示列表图标 wpf-DoEvents WPF

    10.4K20

    .NET 封装的Windows平台轻量DirectUI框架

    调用方式采用Win32风格API方式,支持生成lib静态库和dll动态库。生成的动态链接库支持被其它语言python、java、go、dephi、C#、VB、易语言等调用。...目前支持组件有按钮、开关、单选框、选择框、编辑框、富文本编辑框、列表框、报表列表、模板列表、分组框、组合框、菜单、树形框、滑块、单选框、选择框、选项卡、加载动画框、旋转图片框、页面、图片框、消息框、图标列表...窗口或组件都可以用以上格式图片做背景图。 支持34种缓动特效,用户可以自由编写窗口缓动或组件缓动特效。用户可以扩展缓动算法。 窗口支持异型窗口,图片形状窗口窗口和组件支持0到255透明度。...窗口或组件支持接收拖曳文件或文本。 支持模态窗口。 支持限制区域消息通知。.../.NET/.NET Core面试宝典(基础版) 【微信自动化】使用c#实现微信自动化 细聊C# AsyncLocal如何在异步间进行数据流转

    31441

    C语言基本的窗口开发

    ♂️必须要设置,不然在设置类配置回调函数不允许其命名为常字符,就会报错!!...CallBack(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);//声明回调函数 //WINAPI: 调用约定,调用约定,主要是参数的入栈顺序...,这个栈空间的清理者, // 在其他代码 __stdcall, APIENTRY都是一样,可以转到定义查看, // //句柄:一个数 ;作用:窗口的唯一标志 int WINAPI WinMain(...LoadCursor(NULL,IDC_HAND); wc.cbWndExtra = 0; //对窗口的额外空间 wc.hIcon = NULL;//图标 不需要可以设为NULL 可以将NULL换为系统默认图标...(&mSg); //翻译消息,将按键虚拟消息转化为字符消息并寄送到调用线程的信息队列里, DispatchMessage(&mSg); //分发消息到系统,系统去调用我们的回调函数callback

    1.2K10

    CC++常用控制台函数

    ,最后再设置回去 当然如果都想更改,可不调用GetConsoleCursorInfo函数.手动设置dwSize和bVisible然后传入SetConsoleCursorInfo函数 使用: #include...STD_OUTPUT_HANDLE); COORD coo; coo.X = 10; coo.Y = 10; SetConsoleCursorPosition(hOutput, coo); } 5.禁止更改窗口大小...LONG_PTR GetWindowLongPtrA( HWND hWnd, //窗口句柄 int nIndex //要获取的窗口属性类别,这里我们需要窗口样式GWL_STYLE ); LONG_PTR...[in] LONG_PTR dwNewLong //要设置的值 ); 逻辑: 先获取控制台窗口样式,然后去除掉可更改,可最大,可最小化的属性,然后再设置回去 代码: #include<Windows.h...; } 7.改变字体 NULL 8.改变背景颜色 官方文档,我没有找到可以改变整个窗口背景颜色的API,但是可以采用批处理命令实现 该方法可同时改变背景色和文字颜色 官方文档: 使用: #include

    70720

    CC++常用控制台函数

    ,最后再设置回去 当然如果都想更改,可不调用GetConsoleCursorInfo函数.手动设置dwSize和bVisible然后传入SetConsoleCursorInfo函数 使用: #include...STD_OUTPUT_HANDLE); COORD coo; coo.X = 10; coo.Y = 10; SetConsoleCursorPosition(hOutput, coo); } 5.禁止更改窗口大小...LONG_PTR GetWindowLongPtrA( HWND hWnd, //窗口句柄 int nIndex //要获取的窗口属性类别,这里我们需要窗口样式GWL_STYLE ); LONG_PTR...[in] LONG_PTR dwNewLong //要设置的值 ); 逻辑: 先获取控制台窗口样式,然后去除掉可更改,可最大,可最小化的属性,然后再设置回去 代码: #include<Windows.h...; } 7.改变字体 NULL 8.改变背景颜色 官方文档,我没有找到可以改变整个窗口背景颜色的API,但是可以采用批处理命令实现 该方法可同时改变背景色和文字颜色 官方文档: 使用: #include

    1.2K31

    Visual Studio 调试系列9 调试器提示和技巧

    02 编辑代码并继续调试 (C#,VB, C++) 在 Visual Studio 支持的大多数语言中,你都可以在调试会话的过程编辑代码,然后继续调试。...有关C++代码,可以执行相同的 using Natvis 可视化。 05 更改执行流 让调试器暂停在某行代码上,用鼠标抓住左侧的黄色箭头指针。 将黄色箭头指针移动到代码执行路径的其他点上。...通过更改执行流,你可以进行测试不同代码执行路径或重新运行代码等操作,而无需重启调试器。 06 跟踪范围外的对象 (C#、 Visual Basic) 通过调试器窗口监视窗口)可以轻松查看变量。...此外,还可以在监视和即时窗口中使用伪变量, $ReturnValue。 08 检查可视化工具的字符串 在使用字符串时,如果能看到完整的、带格式的字符串会很有帮助。...可使用源显示线程按钮轻松完成此操作。 ? 在源代码显示线程 调试时,单击源显示线程按钮 ? 调试工具栏。 查看窗口左侧的滚动条。 在这一行,你可以看到线程标记图标 ?

    3.2K10

    WINDOWS核心编程--Windows程序内部运行机制

    现代的桌面应用基本上很少使用原始的 Windows API 进行开发了,因为使用原始 API 堆砌出来的应用代码逻辑非常繁琐,特别是窗口消息的处理非常不方便,大多数直接使用 C# 或者 QT 这种跨平台的开发库...窗口通过句柄识别:HWND 创建各种资源的时候也会返回他们的句柄:图标句柄HICON,光标句柄HCURSOR 消息与队列 系统反过来调用用户进程---------这个调用通过–消息—实现 事件驱动设计程序...VC++开发,自定义菜单图标被命名为.rc----------资源脚本 VC++,资源是通过标识符ID来识别的 ID是在resource.h的宏 他的lpIconname是一个指针,指向资源 第七个...Windows所提供的函数 Windows.h中新的命名规范: 类型&定义描述 WINAPI 使用在API声明的FAR PASCAL位置,如果正在编写一个具有导出API人口点的DLL,则可以在自己的...API中使用该类型 CALLBACK 使用在应用程序回叫例程,窗口和对话框过程的FAR PASCAL的位置 LPCSTR 与LPSTR相同,只是LPCSTR用于只读串指针,其定义类似(const

    1.5K50

    【CC++】回调函数详解&注册窗口类&LRESULT & CALLBACK详解以及游戏中的应用

    按照这个回调函数的功能,该函数也被称为 窗口过程函数,表示窗口在运行过程 Windows 不断调用的函数。...hIcon 代表窗口类的图标句柄,这里使用默认的应用程序图标。 hCursor 代表窗口类的光标句柄,这里使用默认的箭头图标。...lpszClassName 是一个字符串,用来标识一个窗口类。 hIconSm 代表窗口类的小图标句柄,这里和 hIcon 指定相同的图标。...任何在更新区域之外的内容都会被裁剪掉,也就是说操作系统会忽略它们。 另一种是只绘更新区域的内容。...这个条消息是在窗口从屏幕移除之后,真正销毁窗口之前发送的。 在你的主应用程序,典型的响应 WM_DESTORY 消息的代码是调用 PostQuitMessage 函数。

    1.6K21

    .NETC# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑

    嗯,反正我们创建窗口监听消息都已经大量调用 user32.dll 的 API 了,这 dll 肯定已经加入到我们的进程中了,所以我们把这个传入到参数是可以通过验证的。....NET Framework 4.0 相比于之前的 CLR 发生了很大的更改,不再假装 JIT 代码存在一非托管模块,因此 Marshal.GetHINSTANCE 将不再起作用。...因此,要处理特定窗口的消息,只能先拿到此窗口所在的线程。 前面的 P/Invoke 我也预留了获取窗口所在线程的方法。因此,可以直接使用以下调用来获取 hWnd 句柄窗口所在的线程。...- CodeProject c# - SetWindowsHookEx fails with error 126 - Stack Overflow winapi - How to pass window...- Stack Overflow .net - SetWindowHookEx fails at runtime in C# application - Stack Overflow winapi -

    1.2K20

    使用 Visual Studio 创建 .NET 控制台应用程序

    本教程演示如何在 Visual Studio 2022 创建和运行 .NET 控制台应用程序。...代码位于 Program.cs 或 Program.vb 文件: Console.WriteLine("Hello, World!"); 如果未显示想要使用的语言,请更改页面顶部的语言选择器。...对于 C#,代码只是一行,用于调用 Console.WriteLine(String) 方法以在控制台窗口中显示“Hello World!”。...但它在 C# 10 可用,是否在程序中使用它是样式首选项的问题。 运行应用 按 Ctrl+F5 运行程序而不进行调试。 此时会打开一个控制台窗口,其中显示了文本“Hello World!”。...替代方法是在 C# 中使用 \n 和在 Visual Basic 中使用 vbCrLf。 字符串前面的美元符号 ($) 使你可以将表达式(变量名称)放入字符串的大括号内。

    4.4K20

    Visual Studio 调试系列3 断点

    调用堆栈的左边距的函数调用名称旁边会显示一个断点符号。 调用堆栈断点显示在断点窗口具有对应于在函数的下一步可执行指令的内存位置的地址。 调试器在指令处中断。 ? ?...在自动,监视,或局部变量窗口中,右键单击一个属性,然后选择值更改时中断的上下文菜单。 ?...有关有效表达式的详细信息,请参见调试器的表达式。 若要设置断点条件: 右键单击断点符号,然后选择条件。 或悬停在断点符号,选择设置图标,并选择条件中断点设置窗口。...或者,在断点设置窗口中,悬停在所需断点,选择设置图标,,然后选择操作。 输入的消息将消息记录到输出窗口字段。...若要禁用这些安全检查,请执行以下操作: 若要修改单个断点,请将鼠标悬停在编辑器的断点图标,然后单击设置 (齿轮) 图标。 查看窗口添加到在编辑器。 在查看窗口顶部,没有指示的断点的位置的超链接。

    5.4K20

    WPF 让窗口激活作为前台最上层窗口的方法

    在 WPF ,如果想要使用代码控制,让某个窗口作为当前用户的输入的逻辑焦点的窗口,也就是在当前用户活动的窗口的最上层窗口,默认使用 Activate 方法,通过这个方法在大部分设备都可以做到激活窗口...但是在一些特殊的设备上,使用下面代码调起窗口只是在任务栏闪烁图标,而没有让窗口放在最上层 window.Show(); window.Activate(); 在大部分设备上,通过 Show 和 Activate...组合可以让窗口作为当前用户活动的,即使窗口之前是最小化或隐藏,都可以通过 Show 的方法显示 但是某些设备窗口被盖在其他的窗口的下面,此时的窗口的 window.IsActive 还是 true 但是调用...(有些窗口被最小化/隐藏了)     4.更改窗口的Zorder,SetWindowPos使之最上,为了不影响后续窗口的Zorder,改完之后,再还原     5.最后SetForegroundWindow...在 WPF 对应的更改窗口的顺序使用的是 Topmost 属性,同时设置顺序需要做一点小的更改 在 WPF 通过 c# - Bring a window to the front in WPF

    3.2K11

    Visual Studio Code 使用技巧:C# 开发者的一分钟浅谈

    安装 C# 扩展在 VS Code ,安装 C# 扩展是必不可少的步骤。打开 VS Code,点击左侧活动栏的扩展图标,搜索 "C#" 并安装由 Microsoft 提供的 C# 扩展。...运行项目在终端运行以下命令来编译和运行项目:dotnet run3. 调试项目VS Code 提供了强大的调试功能。点击左侧活动栏的调试图标,然后点击“创建 launch.json 文件”。...解决方案确保项目文件( .csproj)存在于项目目录。检查项目文件是否有语法错误。尝试重新生成项目文件: dotnet restore dotnet build2....初始化仓库:在终端运行 git init。添加文件:在源代码管理视图中,点击“+”号添加文件。提交更改:在源代码管理视图中,输入提交信息并点击勾号提交。...五、总结通过本文的介绍,相信你已经对如何在 VS Code 中高效地进行 C# 开发有了更深入的了解。掌握这些基本技巧和进阶技巧,将帮助你在日常开发更加得心应手。希望本文对你有所帮助!

    9810

    Electron调用DLL

    fr=aladdin Edge.js 开源项目 edge 可以帮助我们实现 Node 和 .NET 之间的相互调用 我们最常见就是使用它来调用C#的代码方法或者C#生成的DLL文件的方法 C/C++生成的...类型,下文会详细说明 更多拓展可以去ref doc ffi.Library,既可以通过ref.types.xxx的方式申明类型,也可以通过文本(uint16)进行申明。...WINAPI winapi存在大量的自定义的变量类型,waitingsong大侠的轮子 node-win32-api完整翻译了全套windef.h的类型,而且这个项目采用TS来规定FFI的返回Interface...User32.dll的函数 C#代码 /// /// 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境绘图。...此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。

    11.6K41
    领券