问题仍然由定制MessageBox引发。

定制MessageBox,虽加入自定义些东西,但仍然希望,最大限度接近系统原生框。碰到的问题,就是其钮文本。

即如MessageBox.Show()之MessageBoxButtons(c#)或MessageBox()之MB_OKCANCEL之类。

遍找网络,功夫不负有心人,终于找到!

一、GetModuleHandle、LoadString与user32.dll

所用到的资源,存在于user32.dll中,其编号以8开头,定义其常量为:

c#:

        [DllImport("kernel32")]
static extern IntPtr GetModuleHandle(string lpFileName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax); private const uint OK_CAPTION = ;
private const uint CANCEL_CAPTION = ;
private const uint ABORT_CAPTION = ;
private const uint RETRY_CAPTION = ;
private const uint IGNORE_CAPTION = ;
private const uint YES_CAPTION = ;
private const uint NO_CAPTION = ;
private const uint CLOSE_CAPTION = ;
private const uint HELP_CAPTION = ;
private const uint TRYAGAIN_CAPTION = ;
private const uint CONTINUE_CAPTION = ;

Delphi:

const
OK_CAPTION = ;
CANCEL_CAPTION = ;
ABORT_CAPTION = ;
RETRY_CAPTION = ;
IGNORE_CAPTION = ;
YES_CAPTION = ;
NO_CAPTION = ;
CLOSE_CAPTION = ;
HELP_CAPTION = ;
TRYAGAIN_CAPTION = ;
CONTINUE_CAPTION = ;

二、获取

根据以上资源,写获取函数为:

c#:

        private string LoadWindowsStr(string libraryName, uint ident, string defaultText = "")
{
IntPtr ptr = GetModuleHandle(libraryName);
if (ptr == IntPtr.Zero)
return defaultText; var sb = new StringBuilder();
int len = LoadString(ptr, ident, sb, sb.Capacity);
if (len == )
return defaultText; return sb.ToString();
} private void Form1_Load(object sender, EventArgs e)
{
string s = string.Empty;
for (uint i = OK_CAPTION; i <= CONTINUE_CAPTION; i++)
s += LoadWindowsStr("user32.dll", i, string.Empty) + "\r\n"; textBox2.Text = s;
}

Delphi:

function LoadWindowsStr(const LibraryName: String; const AIdent: Integer;
const ADefaultText: String = ''): String;
var
hLibrary: THandle;
iSize: Integer;
begin
hLibrary := GetModuleHandle(PChar(LibraryName));
if (hLibrary <> ) then
begin
SetLength(Result, MAX_PATH);
iSize := LoadString(hLibrary, AIdent, PChar(Result), MAX_PATH);
if (iSize > ) then
SetLength(Result, iSize)
else
Result := ADefaultText;
end
else
Result := ADefaultText;
end; procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
for i := OK_CAPTION to CONTINUE_CAPTION do
Memo1.Lines.Append(LoadWindowsStr('user32.dll', i));
end;

三、效果:

验证获取字串如下,以中、日、英为例:

确定
取消
中止(&A)
重试(&R)
忽略(&I)
是(&Y)
否(&N)
关闭(&C)
帮助
重试(&T)
继续(&C)
OK
キャンセル
中止(&A)
再試行(&R)
無視(&I)
はい(&Y)
いいえ(&N)
閉じる(&C)
ヘルプ
再実行(&T)
続行(&C)
OK
Cancel
&Abort
&Retry
&Ignore
&Yes
&No
&Close
Help
&Try Again
&Continue

OK,问题解决。

参考资料:

c# - c # - Sì / No valore del sistema - CoreDump.one

c# - How do I get MessageBox button caption? - Stack Overflow

Delphi tips

LoadString() 中 uID 的资料在哪

获取MessageBox按钮本地字符串(OK、Cancel、Yes、No等)的更多相关文章

  1. jquery获取当前按钮、截取字符串、字符串拼接、动态循环添加元素

    截取字符串:字符串拼接:动态循环添加元素:获取当前按钮: {data : null, render: function(data, type, row ) { var loginName = $(&q ...

  2. ZeroMQ接口函数之 :zmq_strerror - 获取ZMQ错误描述字符串

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_strerror zmq_strerror(3) ØMQ Manual - ØMQ/4.1.0 Name zmq_ ...

  3. SQL Server获取下一个编码字符串的实现方案分割和进位

        我在前一种解决方案SQL Server获取下一个编码字符实现和后一种解决方案SQL Server获取下一个编码字符实现继续重构与增强两篇博文中均提供了一种解决编码的方案,考虑良久对比以上两种方 ...

  4. iOS “获取验证码”按钮的倒计时功能

    iOS 的倒计时有多种实现细节,Cocoa Touch 为我们提供了 NSTimer 类和 GCD 的dispatch_source_set_timer方法去更加方便的使用计时器.我们也可以很容易的的 ...

  5. c# 用正则表达式获取开始和结束字符串中间的值

    c# 用正则表达式获取开始和结束字符串中间的值 /// <summary> /// 获得字符串中开始和结束字符串中间得值 /// </summary> /// <para ...

  6. 前端:JS获取单击按钮单元格所在行的信息

    在操作表格前后端交互式时,总会遇到将所要操作的行的信息传至后台进行数据库更新的操作,本文适用于标准的html页面和js库,并提出了三种操作方式根据实际情况进行选择 1.表格格式如图所示 2.表格代码如 ...

  7. 获取url "?" 后面的字符串

    今天写了一个URL “?” 后面的字符串 来改变当前页面的状态 首先需要获取当前页面的URL console.log(widow.location) 之后页面就会打印出来当前的URL 之后我们获取UR ...

  8. 获取转UTF8的字符串

    /// <summary> /// 获取转UTF8的字符串 /// </summary> /// <param name="strWord">& ...

  9. MVC二级联动使用$.ajax方法获取后端返回的字符串

    在"MVC二级联动使用$.getJSON方法"中使用$.getJSON()获取后端返回的JSon. 本篇使用jQuery的$.ajax()获取后端返回的字符串,实现二级联动.   ...

随机推荐

  1. nginx 文档链接

    https://www.cnblogs.com/wcwnina/p/8728391.html    NGINX简介 http://www.nginx.cn/doc/                  ...

  2. 【js字符串当做数组来使用】浪费一晚【想出了3个解决方案】

    数据库的所有数据都打成字符串发到前端. 不必把它的类型也强制转成int这类的,页面负责字符串的展示 这样做可以修改页面的数据 response.setHeader("Content-type ...

  3. zombodb 配置设置

    主要是关于es 集群地址以及分片,复制副本的配置,配置主要在postgresql.conf,当然我们可以在函数中指定 postgresql.conf 级别的配置 es 配置 格式 zdb.defaul ...

  4. ElasticSearch的lowlevelApi和低级别API

    之前开发使用的其实都是lowLevel的api,所谓lowlevelapi就是操作ES的json字符串要自己去写:所谓highlevel的api就是指将查询的json字符串给对象化,创建一个Searc ...

  5. [转].NET 性能测试工具 -- 事件跟踪器(ETW)

    .NET 性能测试工具 -- 事件跟踪器(ETW) 内容预告: Windows内置工具(性能计数器) 事件跟踪器(WPT,PerfMoniter,PerfView,自定义ETW) 时间分析 内存分配分 ...

  6. react使用ant-design组件库

    新建项目并引入组件 1,全局安装脚手架 npm install -g create-react-app 2,新建项目 create-react-app reactantd 3,安装组件 npm ins ...

  7. Bootstrap 前端UI框架

    Bootstrap 有哪些优越性? 1.简单灵活的用于搭建WEB页面的HTML,CSS, JavaScript的工具集 2.基于html5, css3, 具有良好特性,友好的学习曲线,卓越的兼容性,1 ...

  8. JAVA使用log4j(另SSM框架中使用log4j)

    1.引入jar包 log4j-1.2.13.jar 2.src下建立配置文件:log4j.properties #不+All,只写后一种LOG log4j.rootLogger =ALL,system ...

  9. 关于java字节码框架ASM的学习

      一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为 ...

  10. OpenStack Trove组件WSGI和RPC调用流程(参考调用的整个过程)

    参考博文:https://blog.csdn.net/bill_xiang_/article/details/72909927