思路:

通过SetWindowsHookEx函数,获取所有的Form对象,修改其Icon属性。

实现:

class WindowHooker
{public class HookControlEventArgs:EventArgs{public Control Control;public HookControlEventArgs(Control c){this.Control = c;}}#region win32 apiinternal delegate IntPtr HOOKPROC(int nCode, IntPtr wParam, IntPtr lParam);[DllImport("User32.dll", CharSet = CharSet.Auto)]internal static extern IntPtr SetWindowsHookEx(int idHook, HOOKPROC lpfn, int hMod, int dwThreadId);[DllImport("User32.dll", CharSet = CharSet.Auto)]internal static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); #endregioninternal IntPtr PHook = IntPtr.Zero;internal HOOKPROC PHookProc = null;public event EventHandler<HookControlEventArgs> OnHookControl;public void Hook(){PHookProc = new HOOKPROC(FnHookProc);// 如果代码改为:SetWindowsHookEx(5, FnHookProc, 0, AppDomain.GetCurrentThreadId());// 则会报如下错误:// ”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。”PHook = SetWindowsHookEx(5, PHookProc, 0, AppDomain.GetCurrentThreadId());}private IntPtr FnHookProc(int nCode, IntPtr wParam, IntPtr lParam){switch (nCode){case 5:{var control = Control.FromHandle(wParam);if (control != null){var frm = control as Form;if (frm != null){if(OnHookControl!=null){OnHookControl(this, new HookControlEventArgs(frm));}}}break;}}return CallNextHookEx(PHook, nCode, wParam, lParam);}
}

调用:

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);WindowHooker hooker = new WindowHooker();hooker.OnHookControl += (o, e) => {Console.WriteLine(e.Control.GetType().ToString());var frm = e.Control as Form;frm.Icon = GetResAsIcon("app.ico");};hooker.Hook();Application.Run(new FrmMain());
}

PS:

1、事件顺序:Form_Load、Hook、Form_Shown

学习之路三十八:Hook(钩子)的学习

KeyMouseHook

C#启动前为所有的Form设置统一的Icon相关推荐

  1. 新手教学 CSGO游戏启动前优化设置-CSGO游戏优化

    今天给各位小伙伴讲讲关于 CSGO游戏启动前优化设置 的内容,帮助大家进行更好的游戏体验.游戏前的优化能让游戏运行更加流畅,具体结合鼠标指针的优化和CSGO游戏启动选项的优化.CSGO游戏优化 建议先 ...

  2. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | AMS 启动前使用动态代理替换掉插件 Activity 类 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  3. 华硕主板无盘启动bios设置_legacy和UEFI启动是什么?电脑BIOS设置开启进入UEFI启动方法...

    legacy启动是什么?UEFI启动是什么?可能大部分朋友对这个概念都比较模糊,UEFI可以做什么呢?有什么具体的作用?似乎经常可以在BIOS设置里会见到它,毕竟从几年前开始越来越多的电脑都使用上了带 ...

  4. 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性...

    原文:重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性 [源码下载] 重新想象 Wind ...

  5. 技嘉 linux设置u盘启动项,技嘉u盘启动,教您技嘉主板怎么设置u盘启动

    现在基本上都是人手一个U盘,精致小巧又便于携带,更重要的是小小的一个U盘可以装下很多的东西,作用很大,其中要提到的是U盘安装系统了,不过安装系统前,我们需要使用设置u盘启动,那么技嘉主板怎么设置u盘启 ...

  6. python官网无法访问移动网络_关于 win10 创建WiFi热点 问题(无法启动承载网络 , 我们无法设置移动热点,因为你的电脑未建立以太网,wifi或手机网络数据连接 )...

    --------2020.2.27 补充------------------------------------------------------------------------------- ...

  7. Springboot项目启动前执行数据库初始化脚本

    背景:项目里面遇到了要在springboot项目启动前做数据库初始化的需求.总结一下几种方案: 1.使用flywaydb,启动工程的时候同时初始化脚本.集成倒是不难,主要是要解决bean的顺序加载问题 ...

  8. 【Win8启动后自动进入传统桌面设置】

    对于预览版的Windows 8系统,每天启动电脑后的第一件事就是从Metro开始屏幕上点击桌面回到传统界面,久而久之,就感觉十分麻烦.虽然Metro开始屏幕给用户提供了一种 全新的体验,但是对于大多数 ...

  9. DFINITY创始人:目前仍以Q1路线图为主要目标,正在进行创世启动前的安全审计

    去中心化计算平台DFINITY创始人兼首席科学家Dominic Williams在推特上回应一名用户针对2021年Q1更新的问题称,目前为止仍以Q1路线图为主要目标,这并非任意决定,而是创世启动前须完 ...

最新文章

  1. 正确使用stl vecotr erase函数
  2. yunyang tensorflow-yolov3 Intel Realsense D435 (并发)使用locals()函数批量配置摄像头运行识别程序并画框(代码记录)(代码示例)
  3. Bootstrap 分页导航的对齐方式
  4. 票务系统开发_景区票务系统部署到底是SaaS还是本地化呢?
  5. R+markdown+LaTeX 中文编译解决方案
  6. mariadb中文手册_mariadb中文手册
  7. 科目三 流程 记录 LTS
  8. 歌尔首次闪耀CES Asia,展示全面创新力量
  9. java excel列宽自动换行_Excel单元格中数据如何自动换行以便适应单元格的大小
  10. 阿里云快速搭建个人网站
  11. CPU(Central Processing Unit,中央处理器)
  12. inet_addr()和IN_ADDR
  13. Python: matplotlib模块 源码阅读理解
  14. 华为防火墙虚拟系统的案例分析(个人总结向)
  15. 15款JQuery图片展示效果插件
  16. 免疫算法(matlab)---求数的平方和
  17. 选择公理可能不成立,否则计算机可以生成真正的随机数
  18. 详细讲解如何安装原生安卓电子市场(android market)
  19. AR增强现实的特点是什么?
  20. MYSQL数据库的主从切换

热门文章

  1. DevExpress的GridControl如何实现打印和打印预览
  2. [转载] C++ STL之 vector的capacity和size属性区别
  3. [转载] Python编程之np.argmax()的用法
  4. 单工、半双工、双工通信详解
  5. VMware虚拟机 硬盘空间不足 磁盘大小调整方案
  6. sql server 小技巧(8) visual studio 2013里使用Sql server compact 4.0及发布问题处理
  7. OpenStack点滴01-概览
  8. Nginx启动/重启脚本详解
  9. 2012.12.26 晚 小雨
  10. leetcode练习--字符串中第一个唯一字符