如何模拟点击一个非当前窗口的外部程序的按钮,打开一个对话框,在对话框中输入字符串,并模拟点击对话框的“打开”按钮?

yjyb 2007-08-31 01:34:52
实际工作中需要编写一个程序,自动点击一个非当前窗口的外部程序mtsatDealProgram的“打开文件”按钮,以打开一个对话框,在这个对话框的“文件名”文本框中自动输入文件名字符串,再点击对话框中的“打开”按钮。
一开始用api函数mouse_event、keybd_event和SendKeys类实现,但是这种方法要求外部程序mtsatDealProgram处于当前窗口状态,在实际应用时受到很多限制。
后来尝试用api函数SendMessage和PostMessage来实现这个功能,代码如下;public void Run(string _mtsatDealProgramPath,string _fileName)
{
//启动鼠标和键盘锁定
//this.EnableKeyBoardCapture();
//this.EnableMouseCapture();
//判断程序是否已经运行,如果没有则启动之
bool isRun = this.IsProgramAlreadyRunned();
if (!isRun)
{
this.RunProgram(_mtsatDealProgramPath);
//延迟两秒后继续执行
Thread.Sleep(2000);
}
//获得程序主窗体的句柄
int mtsatMainWindowHandle = GetProgramMainWindowHandle() ;
//使主窗体在所有窗体之前,为当前窗体
this.SetWindowToTopMost(mtsatMainWindowHandle);
//获取“打开文件”按钮控件的句柄
int buttonHandleOfOpenFile = this.GetButtonHandleOfOpenFile(mtsatMainWindowHandle);
//利用PostMessage函数将点击命令传递给“打开文件”按钮控件
//int lResult = SendMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0);
while (!PostMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0))
{
Thread.Sleep(100);
}
//延迟1.5秒后继续执行
Thread.Sleep(1500);
//获得“打开”对话框的句柄
int openFileDialogHandle = GetOpenFileDialogHandle(mtsatMainWindowHandle);
//获得输入文件名的文本框的句柄
int fileNameTextHandle = GetFileNameTextHandle(openFileDialogHandle);
//利用SendMessage函数把文件名传递给输入文件名的文本框
SendMessage(fileNameTextHandle, WM_SETTEXT, 0, _fileName);
//获得输入获得“打开”按钮的句柄
int openButtonHandle = GetOpenButtonHandle(openFileDialogHandle);
//利用SendMessage函数将点击命令传递给“打开”按钮
SendMessage(openButtonHandle, BM_CLICK, 0, 0);
//取消主窗体的顶层窗口状态
CancelWindowTopMost(mtsatMainWindowHandle);
//解除鼠标和键盘盘锁定
//this.DisableKeyBoardCapture();
//this.DisableMouseCapture();
}
但是同样有很多问题存在:
1、同样要求mtsatDealProgram处于当前窗口状态下,当mtsatDealProgram在非当前窗口状态下,有时候能正常运行,但更多时候在执行到
//利用PostMessage函数将点击命令传递给“打开文件”按钮控件
while (!PostMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0))
{
Thread.Sleep(100);
}
时就停住了,无法打开“打开”对话框,不知为何?
2、通过
//使主窗体在所有窗体之前,为当前窗体
this.SetWindowToTopMost(mtsatMainWindowHandle);
使程序运行时,mtsatDealProgram程序在当前窗口状态下,程序能正常运行。但是,只要过程中,人工移动鼠标,就会对程序造成影响,在执行到
//利用PostMessage函数将点击命令传递给“打开文件”按钮控件
while (!PostMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0))
{
Thread.Sleep(100);
}
时就停住了,无法打开“打开”对话框,这是什么原因那?
3、在将
while (!PostMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0))
{
Thread.Sleep(100);
}
处改用int lResult = SendMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0);
时,能够打开“打开”对话框,但程序无法执行下去,也即lResult无法获得返回值,只有手动将“打开”对话框关闭时,程序才能执行下去,但也就无法实现程序功能了。
4、//启动鼠标和键盘锁定
this.EnableKeyBoardCapture();
this.EnableMouseCapture();
执行这两句代码会造成1、2中问题,而且好像也没法锁死鼠标和键盘。EnableKeyBoardCapture()和EnableMouseCapture()这两个函数定义如下:
private bool EnableKeyBoardCapture()
{
KeyBoardHookProcedure = new HookProc(this.KeyBoardHookProc);
Process currentProcess = Process.GetCurrentProcess();
//安装全局键盘钩子
hhookKeyBoard = SetWindowsHookEx(WH_KEYBOARD, KeyBoardHookProcedure, currentProcess.MainModule.BaseAddress, 0);
if (hhookKeyBoard == 0)
return false;
return true;
}
private int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
//如果nCode<0,直接调用CallNextHookEx返回
if (nCode < 0)
//return CallNextHookEx(hhookKeyBoard, nCode, wParam, lParam);
return 1;
//函数将消息向下传递,下一个钩子处理将截获这一消息
//if (nCode != HC_ACTION)
//return CallNextHookEx(hhookKeyBoard, nCode, wParam, lParam);
return 1;
}
private bool EnableMouseCapture()
{
MouseHookProcedure = new HookProc(this.MouseHookProc);
Process currentProcess = Process.GetCurrentProcess();
//安装全局鼠标钩子
hhookMouse = SetWindowsHookEx(WH_MOUSE, MouseHookProcedure, currentProcess.MainModule.BaseAddress, 0);
if (hhookMouse == 0)
return false;
return true;
}
private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
//如果nCode<0,直接调用CallNextHookEx返回
if (nCode < 0)
//return CallNextHookEx(hhookMouse,nCode,wParam,lParam);
return 1;
//函数将消息向下传递,下一个钩子处理将截获这一消息
//if(nCode!= HC_ACTION)
// return CallNextHookEx(hhookMouse, nCode, wParam, lParam);
return 1;
}
5、要如何才能使外部程序mtsatDealProgram在处于非当前窗口状态时,实现自动打开的功能,不受其它事情(如有人在使用键盘、鼠标)的影响?

问题可能太多了,分不够另开贴给分,谢谢支持!
...全文
768 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
pen_sky 2008-04-23
  • 打赏
  • 举报
回复
我向楼主请教一下,如果点击一个当前窗口按钮后弹出文件选择窗口,我想在这个对话框的“文件名”文本框中自动输入文件名字符串,再点击对话框中的“确认”按钮。 怎么做?我是一个新手,尝试了很多方法都不行.能给给例子吗?
yjyb 2007-09-06
  • 打赏
  • 举报
回复
这几天都没人来看看吗?
看来我的问题是很难都能解决了!唉!

问题3、在将
while (!PostMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0))
{
Thread.Sleep(100);
}
处改用int lResult = SendMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0);
时,能够打开“打开”对话框,但程序无法执行下去,也即lResult无法获得返回值,只有手动将“打开”对话框关闭时,程序才能执行下去,但也就无法实现程序功能了!

这个问题有人知道是怎么回事吗?
我猜可能是SendMessage需要一个结果才能返回导致程序执行不下去,那是不是要对“打开”对话框进行某项操作才能使SendMessage有结果呢?!
yjyb 2007-09-03
  • 打赏
  • 举报
回复
同时锁死鼠标后,对我的程序有影响,表现在PostMessage(buttonHandleOfOpenFile, BM_CLICK, 0, 0));不能起作用了。难道说通过PostMessage发送的BM_CLICK消息也被当作实体鼠标消息截获了?
yjyb 2007-09-03
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Reflection;

namespace 鼠标键盘钩子实例
{
public partial class Form1 : Form
{
#region 锁定鼠标和键盘
//有关鼠标和键盘钩子的相关定义
static int hhookMouse = 0;
static int hhookKeyBoard = 0;
public const int WH_MOUSE_LL = 14;
private const int WH_KEYBOARD_LL = 13;
public const int HC_ACTION = 0;
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr iParam);
HookProc MouseHookProcedure, KeyBoardHookProcedure;
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hinstance, int threadid);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
/// <summary>
/// 钩子处理方法(鼠标锁定)
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
//如果nCode<0,直接调用CallNextHookEx返回
if (nCode < 0)
//return CallNextHookEx(hhookMouse,nCode,wParam,lParam);
return 1;
//函数将消息向下传递,下一个钩子处理将截获这一消息
//if(nCode!= HC_ACTION)
// return CallNextHookEx(hhookMouse, nCode, wParam, lParam);
return 1;
}
/// <summary>
/// 启动鼠标锁定
/// </summary>
/// <returns></returns>
private bool EnableMouseCapture()
{
MouseHookProcedure = new HookProc(this.MouseHookProc);
Process currentProcess = Process.GetCurrentProcess();

//安装全局鼠标钩子
hhookMouse = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, currentProcess.MainModule.BaseAddress, 0);
if (hhookMouse == 0)
return false;
return true;
}
/// <summary>
/// 解除鼠标锁定
/// </summary>
/// <returns></returns>
private bool DisableMouseCapture()
{
return UnhookWindowsHookEx(hhookMouse);
}

/// <summary>
/// 钩子处理方法(键盘锁定)
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
//如果nCode<0,直接调用CallNextHookEx返回
if (nCode < 0)
return CallNextHookEx(hhookKeyBoard, nCode, wParam, lParam);
//return 1;
//函数将消息向下传递,下一个钩子处理将截获这一消息
if (nCode != HC_ACTION)
return CallNextHookEx(hhookKeyBoard, nCode, wParam, lParam);
return 1;
}
/// <summary>
/// 启动键盘锁定
/// </summary>
/// <returns></returns>
private bool EnableKeyBoardCapture()
{
KeyBoardHookProcedure = new HookProc(this.KeyBoardHookProc);
Process currentProcess = Process.GetCurrentProcess();
//安装全局键盘钩子
hhookKeyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, currentProcess.MainModule.BaseAddress, 0);
if (hhookKeyBoard == 0)
return false;
return true;
}
/// <summary>
/// 解除键盘锁定
/// </summary>
/// <returns></returns>
private bool DisableKeyBoardCapture()
{
return UnhookWindowsHookEx(hhookKeyBoard);
}

#endregion
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
EnableKeyBoardCapture();
EnableMouseCapture();
}
}
}

各位,上面这段代码单独试验过了,可行。但是把它合并到我的程序当中去就不行,具体表现在EnableMouseCapture()后,不能锁死鼠标,移动鼠标时,鼠标还是能跳跃式移动,但移动非常缓慢,不能完全锁死鼠标。
lovefootball 2007-08-31
  • 打赏
  • 举报
回复
利用底层键盘钩子屏蔽任意按键
http://blog.csdn.net/goodname008/archive/2004/08/21/80827.aspx
virusswb 2007-08-31
  • 打赏
  • 举报
回复
那就要用SPY++看看它的层次结构
然后初始化它,调用它
lovefootball 2007-08-31
  • 打赏
  • 举报
回复
如果你允许激活窗口的话

屏蔽鼠标
http://asp2net.net/Article/bianchengwenda/C/2007-5-28/2007052823264120.html
屏蔽键盘
http://topic.csdn.net/t/20020325/22/599562.html
yjyb 2007-08-31
  • 打赏
  • 举报
回复
virusplayer() ,能说详细一点吗?mtsatDealProgram这个外部程序是用VC++写的。
懒牛科技 2007-08-31
  • 打赏
  • 举报
回复
没有怎么明白,看样水还不事很深
virusswb 2007-08-31
  • 打赏
  • 举报
回复
这不就是反射吗
有点自动化测试的意思
using System.Reflection;
zhchg6666 2007-08-31
  • 打赏
  • 举报
回复
up
yjyb 2007-08-31
  • 打赏
  • 举报
回复
注入程序好像很难哪!
如果非当前窗口状态实现不了的话,使用以下两个函数:
void SetWindowToTopMost(int _mainWindowHandle)
{
SetWindowPos(_mainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
void CancelWindowTopMost(int _mainWindowHandle)
{
SetWindowPos(_mainWindowHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
来实现将非当前窗口设置为当前窗口。那么需要解决的一个问题是,在实现功能时必须排除键盘和鼠标输入的干扰。之前使用:
//启动鼠标和键盘锁定
this.EnableKeyBoardCapture();
this.EnableMouseCapture();
这段代码却没有把键盘、鼠标锁定,那如何才能锁定键盘、鼠标,又不影响SendMessage的使用?
xwk789xwk 2007-08-31
  • 打赏
  • 举报
回复
不懂,路过,帮顶一下
shrinerain 2007-08-31
  • 打赏
  • 举报
回复
FindWindow

SetForegroudWindow
lovefootball 2007-08-31
  • 打赏
  • 举报
回复
http://blog.csdn.net/NicX/archive/2007/08/02/1721980.aspx
看看这个
yjyb 2007-08-31
  • 打赏
  • 举报
回复
lovefootball(蟑螂(生活就是扯淡--做人要放低姿态)) :
谢谢你的答复?注入程序从来没有接触过,需要哪些相关背景知识吗?
yjyb 2007-08-31
  • 打赏
  • 举报
回复
没人吗?救命啊!
liubin911 2007-08-31
  • 打赏
  • 举报
回复
up
lovefootball 2007-08-31
  • 打赏
  • 举报
回复
你可以给伴水发消息
他Delphi比较牛
应该做过类似的
lovefootball 2007-08-31
  • 打赏
  • 举报
回复
变通的办法就是激活该窗口
然后发送消息
然后恢复原来的激活窗口

估计这么做你也不同意
呵呵
加载更多回复(1)
VC实例精通一书的源码。 第2章(\Chapter02) 示例描述:本章介绍常用Win32控件的使用方法。 01_EditDemo 演示静态文本、文本框、按钮控件的使用方法 02_CheckBoxDemo 演示复选框和单选按钮控件的使用方法。 03_ComboBoxDemo 演示组合框和列表框控件的使用方法。 04_ScrollBarDemo 演示滚动条控件的使用方法。 05_SpinDemo 演示数值调节按钮的使用方法。 06_ProgressDemo 演示进度条控件的使用方法。 07_SliderDemo 演示滑块控件的使用方法。 08_HotkeyDemo 演示热键控件的使用方法。 09_ListCtrlDemo 演示列表控件的使用方法。 10_TreeCtrlDemo 演示树形控件的使用方法。 11_RichEditDemo 演示格式文本框的使用方法。 12_TabCtrlDemo 演示属性页的使用方法。 13_AnimateDemo 演示动画控件的使用方法。 14_DateTimeDemo 演示日期时间选择控件的使用方法。 15_CalendarDemo 演示日历控件的使用方法。 16_IPCtrlDemo 演示IP输入框的使用方法。 第3章(\Chapter03) 示例描述:本章介绍高级Win32控件的使用方法。 01_MenuDemo 演示窗体菜单的使用方法。 02_PopMenuDemo 演示弹出式菜单的使用方法。 03_ToolbarDemo 给窗体添加标准工具栏。 04_Toolbar256 使工具栏支持256色位图。 05_StatusBarDemo 在窗体的状态栏区域输出信息。 06_ColorStatusBar 在状态栏添加彩色渐变进度条。 07_ToolTipDemo 使用ToolTip显示即时提示。 第4章(\ Chapter04) 示例描述:本章介绍窗体的使用方法和使用技巧。 01_WindowDemo 演示创建和显示窗体的方法。 02_TopMostWnd 让窗体保持在桌面最顶层。 03_TransparentWindow 创建半透明窗体。 04_EllipticalWindow 创建椭圆窗体。 05_TextPathWnd 创建文字异形窗体。 06_ImagePathWnd 根据图片创建异形窗体。 07_AnimatedWnd 以动画方式显示和隐藏窗体。 08_AutoSize 让窗体上的控件自动适应窗体大小。 09_AutoSizeEx 多个控件改变大小时防止闪烁。 10_LimitSize 限制窗体的最大和最小尺寸。 11_AutoPos 让窗体具有停靠效果。 12_EnumWnd 枚举系统窗口。 第5章(\ Chapter05) 示例描述:本章介绍创建对话框以及通用对话框的使用技巧。 01_ModalDlg 显示模式对话框。 02_ModallessDlg 显示模式对话框。 03_OpenFileDemo 使用打开文件对话框。 04_SaveFileDemo 使用保存文件对话框。 05_FontDlgDemo 使用字体选择对话框。 06_FontDlgDemo_Color 使用字体选择对话框。 07_PreviewFileDlg_Demo 为打开文件对话框增加预览功能。 08_InputDlg_Demo 从内存创建对话框。 第6章(\ Chapter06) 示例描述:本章介绍Windows应用程序消息循环的原理和消息处理技巧。 01_PeekMsgDemo 传递并响应Windows消息。 02_SendMsg 发送Windows消息。 03_MsgInMfc 了解MFC的映射消息机制。 04_UserMsg 使用自定义消息。 05_DoubleEdit_Demo 拦截并处理Win32控件的消息。 第7章(\ Chapter07) 示例描述:本章介绍Windows系统和外壳编程的技巧。 01_TimerDemo 使用计时器。 02_RegDemo 访问系统注册表。 03_SuperPwd 用随机数生成强力密码。 04_ShellOpen 打开一个程序相关联的文档。 05_ClipboardDemo 访问Windows剪切板。 06_ClipboardMonitor 监视剪切板内容变化。 07_TrayIconDemo 使用系统托盘图标。 第8章(\ Chapter08) 示例描述:本章介绍在应用程序使用Windows基本设备的方法和技巧。 01_MouseSample 处理鼠标消息。 02_KeyTest 处理键盘消息。 03_MouseMoving 利用客户区鼠标消息拖动无边框窗体。 04_NCMsg 利用客户区鼠标消息控制无边框窗体。 05_LockMouse 限制鼠标移动区域。 06_MyEvent 模拟键盘鼠标消息。 07_ClipboardHelper 使用系统热键消息使后台程序得到通知。 第9章(\ Chapter09) 示例描述:本章学习Windows进程的创建和管理方法。 01_StartProcess 创建和结束进程。 02_RedirectStdio 用匿名管道获取控制台程序的输出。 03_CatchError 拦截并处理外部进程的错误。 04_SingleInstance 防止应用程序运行多个实例。 05_ProcessMsg 用消息在进程间通讯。 06_MappingFile 用内存映射文件在进程间通讯。 07_ProcessList 枚举并得到系统所有进程信息。 第10章(\ Chapter10) 示例描述:本章学习Windows线程的创建和管理方法。 01_PrimeNumberFinder 主线程和用户界面。 02_PrimeNumberFinderEx 创建和结束线程。 03_PrimeNumberFinal 用临界区对象同步线程。 04_BigPrimeNumber 用事件对象同步线程。 05_SemaphoreDemo 用信号量对象同步线程。 06_ThreadPriority 调整线程优先级。 第11章(\ Chapter11) 示例描述:本章学习使用VC6进行图形图像开发的技巧。 01_ZoomBitmap 用DC对象缩放位图。 02_DrawLine 用画笔对象画线。 03_BrushDemo 用画刷对象填充区域。 04_RollText 在屏幕上输出文本。 05_PicShow 使用GDI+读取不同格式的图片。 06_PicShowEx 使用GDI+保存不同格式的图片。 07_Snap 制作屏幕截图程序。 08_Watermark 给图片增加版权信息。 第12章(\ Chapter12) 示例描述:本章学习使用VC6进行文件IO开发的技巧。 01_BinaryView 用基本API编写二进制编辑器。 02_MyCompressor 用MFC类编写文件压缩软件。 03_DirMonitor 监控硬盘上文件的变化。 04_HddSpace 获取本机所有磁盘及其空间使用情况。 05_WideText 文本保存及编码方式。 06_XmlReader 读写XML文件。 07_SerialPort 读写串口数据。 第13章(\ Chapter13) 示例描述:本章学习使用VC6进行数据库开发的方法和技巧。 01_ODBC_Source 创建ODBC数据源。 02_ODBC_Demo 通过ODBC访问Access数据库。 03_ADO_Demo 通过ADO访问据库。 04_ExecProc 调用SQL Server的存储过程。 05_TransExec 事务处理SQL Server命令。 06_BinData 存取数据库的图片。 07_CreateMdb 在程序动态生成Access数据库。 第14章(\ Chapter14) 示例描述:本章学习使用VC6进行网络开发的方法和技巧。 01_UdpClient 建立UDP连接客户端。 02_UdpServer 建立UDP连接服务器端。 03_TcpClient 建立TCP连接客户端。 04_TcpServer 建立TCP连接服务器端。 05_MfcSock 使用MFC的SOCKET类。 06_MyWebProtocol 注册自己的浏览器地址栏协议。 07_GetHttpStr 抓取网页内容。 08_VisualPing 基于ICMP编写网络速度监控程序。 第15章(\ Chapter15) 示例描述:本章介绍一些Windows高级编程技术。 01_AppSnap 制作鼠标HOOK。 02_PasswordShow 用鼠标HOOK读取密码框的内容。 03_KeyVoice 制作键盘HOOK。 04_SysKey 用键盘HOOK屏蔽系统按键。 05_DlgSkinDemo 用HOOK技术给对话框换肤。 06_PeExport 分析DLL文件获取其导出函数列表。 第16章(\ Chapter16) 示例描述:本章介绍VC6在多媒体开发方面的应用技术。 01_BgMusic 用基本API播放声音。 02_MP3Player 用MCI播放音频。 03_MyReal 调用RealPlayer播放音频文件。 04_Recorder 制作录音机程序。 05_GifCtrl 在VC显示动态的GIF动画。 06_FlashWnd 在VC播放Flash动画。 07_MediaPlayer 在VC播放视频。 08_CaptureVideo 在VC实现视频采集及截图功能。 第17章(\ Chapter17) 示例描述:本章介绍VC6在ActiveX方面的应用技术。 01_MyActiveX 创建ActiveX控件。 02_MyActiveX2 为ActiveX控件增加属性和方法。 03_ActiveXInDlg 在应用程序使用ActiveX控件。 04_ActiveXInWeb 在浏览器使用ActiveX控件。 05_MyActiveX3 在VC显示动态的GIF动画。 06_RegOCX 在程序注册和注销ActiveX控件。 第18章(\ Chapter18) 示例描述:本章介绍如何将应用程序制作成完整的应用软件的技术。 01_MyHelp 制作帮助文件。 02_Setup 制作安装程序。 03_MultiLanguage 让应用程序界面支持多语言。 04_MultiLanguageEx 多语言的字符串常量。 05_SetupEx 制作多语言的安装程序

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧