C# WinForm MessageBox自定义按键文本 COM组件版

c# 更改弹窗MessageBox按钮文字_c# messagebox.show 字体-CSDN博客

需要用到大佬上传到百度云盘的Hook类,在大佬给的例子的基础上改动了点。

加了ok按键,还原了最基础的messageBox。

为了适配多语言,增加ReadBtnLanguge方法。

应用时自己加GUID和ProgID。

组件实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace HookMessageBox
{[ComVisible(true)][Guid("")]interface IHookMessageBox{[DispId(1)]void ReadBtnLanguage();[DispId(1)]DialogResult MessageBoxOKBtnShow(string text,string caption, MessageBoxIcon icon);[DispId(1)]DialogResult MessageBoxYesOrNoBtnShow(string text,string caption, MessageBoxIcon icon);[DispId(1)]DialogResult MessageBoxYesOrNoOrCancelBtnShow(string text,string caption, MessageBoxIcon icon);}[ComVisible(true)][Guid("")][ProgId("")]public class ClsHookMessageBox: IHookMessageBox{private string OKText { get; set; }private string YesText { get; set; }private string NoText { get; set; }private string CancelText { get; set; }public void ReadBtnLanguage(){OKText = "OK";YesText = "Yes";NoText = "No";CancelText = "Cancel";}public DialogResult MessageBoxOKBtnShow(string text,string caption,MessageBoxIcon icon=MessageBoxIcon.None){return HookMessageBoxShow<DialogResult>(text:text, caption:caption,okText: OKText, icon:icon);}public DialogResult MessageBoxYesOrNoBtnShow(string text, string caption, MessageBoxIcon icon = MessageBoxIcon.None){string yesText = "Yes";string noText = "No";return HookMessageBoxShow<DialogResult>(text: text, caption: caption, yesText: YesText, noText: NoText, buttons:MessageBoxButtons.YesNo,icon: icon);}public DialogResult MessageBoxYesOrNoOrCancelBtnShow(string text, string caption, MessageBoxIcon icon = MessageBoxIcon.None){string yesText = "Yes";string noText = "No";string cancelText = "Cancel";return HookMessageBoxShow<DialogResult>(text: text, caption: caption, yesText: YesText, noText: NoText, cancelText: CancelText, buttons: MessageBoxButtons.YesNoCancel, icon: icon);}/// <summary>/// 带返回值/// </summary>private T HookMessageBoxShow<T>(string text, string caption, MessageBoxButtons buttons= MessageBoxButtons.OK, MessageBoxIcon icon = MessageBoxIcon.None,string okText="",string yesText = "", string noText = "", string cancelText = "", Func<DialogResult, T> handleResult = null){//hook 修改弹出窗按钮 文本var hook = new HookINCS.Hook();hook.OnMessageBoxShow += (s, mbe) =>{IntPtr hChildWnd = mbe.hChildWnd;int result;if (!string.IsNullOrEmpty(yesText) && HookINCS.Win32Api_Hook.GetDlgItem(hChildWnd, 6) != 0)//IDYES = 6{result = HookINCS.Win32Api_Hook.SetDlgItemTextA(hChildWnd, 6, $"{yesText}");//在Project.Resources里自定义文本}if (!string.IsNullOrEmpty(noText) && HookINCS.Win32Api_Hook.GetDlgItem(hChildWnd, 7) != 0)//IDNO = 7{result = HookINCS.Win32Api_Hook.SetDlgItemTextA(hChildWnd, 7, $"{noText}");}if (!string.IsNullOrEmpty(cancelText) && HookINCS.Win32Api_Hook.GetDlgItem(hChildWnd, 2) != 0)//IDCANCEL = 2{result = HookINCS.Win32Api_Hook.SetDlgItemTextA(hChildWnd, 2, $"{cancelText}");}if (!string.IsNullOrEmpty(okText) && HookINCS.Win32Api_Hook.GetDlgItem(hChildWnd, 1) != 0)//IDCANCEL = 2{result = HookINCS.Win32Api_Hook.SetDlgItemTextA(hChildWnd, 1, $"{okText}");}};hook.InstallMessageBoxHook();DialogResult dialogResult = MessageBox.Show(text, caption, buttons, icon);if (handleResult == null){//卸载钩子hook.UninstallMessageBoxHook();return default;}//卸载钩子hook.UninstallMessageBoxHook();return handleResult(dialogResult);}/// <summary>/// 不带返回值/// </summary>private void HookMessageBoxShow(string text, string caption, MessageBoxButtons buttons= MessageBoxButtons.OK, MessageBoxIcon icon = MessageBoxIcon.None,string okText = "", string yesText = "", string noText = "", string cancelText = "", Action<DialogResult> handleResult = null){//hook 修改弹出窗按钮 文本var hook = new HookINCS.Hook();hook.OnMessageBoxShow += (s, mbe) =>{IntPtr hChildWnd = mbe.hChildWnd;int result;if (!string.IsNullOrEmpty(yesText) && HookINCS.Win32Api_Hook.GetDlgItem(hChildWnd, 6) != 0)//IDYES = 6{result = HookINCS.Win32Api_Hook.SetDlgItemTextA(hChildWnd, 6, $"{yesText}");//在Project.Resources里自定义文本}if (!string.IsNullOrEmpty(noText) && HookINCS.Win32Api_Hook.GetDlgItem(hChildWnd, 7) != 0)//IDNO = 7{result = HookINCS.Win32Api_Hook.SetDlgItemTextA(hChildWnd, 7, $"{noText}");}if (!string.IsNullOrEmpty(cancelText) && HookINCS.Win32Api_Hook.GetDlgItem(hChildWnd, 2) != 0)//IDCANCEL = 2{result = HookINCS.Win32Api_Hook.SetDlgItemTextA(hChildWnd, 2, $"{cancelText}");}if (!string.IsNullOrEmpty(okText) && HookINCS.Win32Api_Hook.GetDlgItem(hChildWnd, 1) != 0)//IDCANCEL = 2{result = HookINCS.Win32Api_Hook.SetDlgItemTextA(hChildWnd, 1, $"{okText}");}};hook.InstallMessageBoxHook();DialogResult dialogResult = MessageBox.Show(text, caption, buttons, icon);if (handleResult != null)handleResult(dialogResult);//卸载钩子hook.UninstallMessageBoxHook();}}
}

调用:

            object obj = Activator.CreateInstance(Type.GetTypeFromProgID("HookMessageBox.ClsHookMessageBox"));obj.GetType().GetMethod("ReadBtnLanguage").Invoke(obj, new object[] { });obj.GetType().GetMethod("MessageBoxOKBtnShow").Invoke(obj, new object[] { "messageboxText","messageCaption", MessageBoxIcon.None });obj.GetType().GetMethod("MessageBoxYesOrNoBtnShow").Invoke(obj, new object[] { "messageboxText","messageCaption", MessageBoxIcon.None });obj.GetType().GetMethod("MessageBoxYesOrNoOrCancelBtnShow").Invoke(obj, new object[] { "messageboxText","messageCaption", MessageBoxIcon.None }); });

效果:

551cfb2aff8642c59fcb8b55eefd0c05.pngebdc9b8033154c34ad8d29237d6316f8.png9cacc93d1135493799303f1414601dc9.png

遗留问题:

获取弹窗被按下按键。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/592353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发辅助三(缓存Redisson分布式锁+分页插件)

缓存 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;由于缓存不命中&#xff0c;将大量查询数据库&#xff0c;但是数据库也没有此记录。 没有将这次查询的null写入缓存&#xff0c;导致了这个不存在的数据每次请求都要到存储层查询&#xff0c;失去了缓存的意义。 解…

export .... 配置环境变量,环境变量都存去哪里了?

今天在配置镜像环境的时候&#xff0c;在纠结执行如下命令之后&#xff0c;这个环境变量会保存到哪里&#xff1f;然后找了.bash_profile和.zshrc文件都没有找到&#xff0c;在纠结乱存到哪里去了 export HOMEBREW_API_DOMAIN"https://mirrors.tuna.tsinghua.edu.cn/home…

复试 || 就业day02(2024.01.02)项目一

文章目录 前言最小二乘法的推导使用正规方程求解 y w x b ywxb ywxb多元线性回归 y w 1 x 1 w 2 x 2 b yw1x1w2x2b yw1x1w2x2b总结 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;本文内容来自某机构网课&#xff…

详解 docker 镜像制作的两种方式

概要 制作Docker镜像一般有2种方法&#xff1a; 通过Dockerfile&#xff0c;完成镜像的创建使用仓库中已有的镜像&#xff0c;安装自己使用的软件环境后完成新镜像创建 docker 常用命令 docker build: 用于构建 Docker 镜像。该命令可以从 Dockerfile 构建镜像&#xff0c;…

2022年12月10日-2023年12月28日

好久没写文章了,也就是好久没写流水账了.今天写的,到底是生日,还是记录这一年的工作,比较模糊,时间上来讲,两个用意合一起吧. 这一年,是极其艰苦的一年,也是不堪回首的一年.3月份的时候设宴欢送朋友离开深圳,回住处上楼时跌倒入院,之后开刀.家人们都从老家赶来,照顾了我好几天.…

Debezium发布历史43

原文地址&#xff1a; https://debezium.io/blog/2018/12/05/automating-cache-invalidation-with-change-data-capture/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 通过更改数据捕获自动使缓存失效 2018 年…

文本表示模型简介

文本是一类非常重要的非结构化数据&#xff0c;如何表示文本数据一直是机器学习领域的一个重要研究方向。那么有哪些文本表示模型&#xff1f;以及它们各有什么优缺点&#xff1f; 1. 常见的文本表示模型 1.1. 词袋模型和N-gram模型 最基础的文本表示模型是词袋模型。顾名思…

QML —— RadioButton的两个经典示例(附完整源码)

示例1-效果 示例2-效果 实例1 - 源码 import QtQuick 2.12 import QtQuick.Window 2.12import QtQuick.Layouts 1.12 import QtQuick.Controls 2.5Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Text{id: classNametext: qsTr("--&quo…

CSS-5

移动端适配 屏幕分辨率 屏幕分辨率&#xff1a;纵横向上的像素点数&#xff0c;单位是px电脑常见分辨率&#xff1a;1920 * 10801336 * 768...硬件分辨率 -> 物理分辨率&#xff08;出厂设置&#xff09; 缩放调节后的分辨率 -> 逻辑分辨率&#xff08;软件/驱动设置&a…

Web网页开发-CSS层叠样式表1-笔记

1.CSS的引入方式 (1)内嵌式&#xff1a;把style双标签写在head标签里面&#xff0c;可以影响同种标签 (2)行内式&#xff1a;把style写在标签内部&#xff0c;只能影响当前标签 (3)外链式&#xff1a;创建css文件&#xff0c;使用link将html文件和css文件连接起来 (4)导入式&am…

2024年美赛数学建模ABCDEF题思路选题分析

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间&#xff1a;北京时间2024年2月2日&#xff08;周五&#xff…

关于java的方法及定义

关于java的方法及定义 我们在之前的文章中介绍了java的流程控制等内容&#xff0c;本篇文章&#xff0c;我们要介绍一下java中的方法&#xff0c;这个是非常关键的&#x1f600;&#xff01; 什么是方法 我们用之前我们最常见的System.out.println(); 来举例。 System是类&…

Ef Core花里胡哨系列(5) 动态修改追踪的实体、动态查询

Ef Core花里胡哨系列(5) 动态修改追踪的实体、动态查询 同样还是IModelCacheKeyFactory&#xff0c;不过这次要采用主动刷新的方式。 实现DbContext 动态实体&#xff0c;根据配置等生成动态类型来当作数据库实体使用&#xff0c;当配置修改时&#xff0c;可以调用DynamicMo…

Redis(二)数据类型

文章目录 官网备注十大数据类型StringListHashSetZSetBitmapHyperLogLog&#xff1a;GEOStreamBitfield 官网 英文&#xff1a;https://redis.io/commands/ 中文&#xff1a;http://www.redis.cn/commands.html 备注 命令不区分大小写&#xff0c;key区分大小写帮助命令help…

关于时间格式yyyy-M-d或yyyy-MM-d到yyyy-MM-dd的转换

工作时遇到前端传的时间格式是"2023-12-3 17:41:52"&#xff0c;和"2023-1-1 17:41:52"但是我想要的是"2023-12-03 17:41:52"和"2023-01-01 17:41:52"。下面给大家分享几个解决方法 方法一&#xff1a; 找前端&#xff01;让他改&…

CSS属性的计算过程和层叠规则总结

✨ 专栏介绍 HTML/CSS专栏合集是一个涵盖HTML和CSS两个方面的栏目。HTML是一种标记语言&#xff0c;用于创建网页的结构和内容&#xff0c;而CSS是一种样式表语言&#xff0c;用于控制网页的外观和布局。 在HTML/CSS专栏合集中&#xff0c;我们将深入探讨HTML和CSS的基础知识…

汽车架构解析:python cantools库快速解析arxml

文章目录 前言一、安装cantools二、官方说明文档三、cantools方法1、解析message的属性2、解析pdu中的signals3、根据message查找signals4、报文组成bytes 总结 前言 曾经有拿cantools来解析过dbc&#xff0c;用得比较浅&#xff0c;不知道可以用来解析arxml。最近有个需求需要…

vfb控件数组的实现原理(visual freebasic ide),64位VB6 vb7

vfb控件数组的实现原理(visual freebasic ide),64位VB6 vb7 Sub Form1_Command1_BN_Clicked(ControlIndex As Long, hWndForm As hWnd, hWndControl As hWnd)MsgBox ("Command1 ControlIndex" & ControlIndex & ",Command1(x).Caption " & …

【纯java代码实现字符串运算符或公式计算,支持函数,不借助第三方依赖、工具】

纯java代码实现字符串运算符或公式计算&#xff0c;支持函数&#xff0c;不借助第三方依赖和工具 效果图代码 效果图 代码 import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import…

在 Oracle 数据库表中加载多个数据文件

在本文中&#xff0c;我将展示 SQL 加载器 Unix 脚本实用程序的强大功能&#xff0c;其中 SQL 加载器可以使用自动 shell 脚本加载多个数据文件。这在处理大量数据以及需要将数据从一个系统移动到另一个系统时非常有用。 它适合涉及大量历史数据的迁移项目。那么就不可能为每…