提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
日常工作的过程中,大量的.NC文件需要转换为.MPF文件,厂家仅仅提供了一款每次转换一个文件的程序,转换的速度特别的慢,需要设计一款批量准换的文件。方案的实现使用mfc。该项目比较简单,但是涉及了注册码,注册机,配置文件等比较独立的内容,特总结,既是增加自己的记忆,也是与大家分享学习!
提示:以下是本篇文章正文内容,下面案例可供参考
1、项目的设计方案
1.1界面设计
选择使用MFC进行窗口设计,比较方便,容易实现。包含注册界面、选择文件界面。
1.1.1注册界面
1.1.2选择文件夹和转换界面
未注册可直接点击注册,弹出注册界面。输入cpu序列号和注册码即可完成注册。注册码由注册机生成。
1.2程序设计
程序设计的过程以主功能为主,辅助功能次之的方式进行总结,主功能包括识别文件和批量转换,辅助功能包含配置文件的设置和注册码的设置。项目实现的的方式是注册码检测,配置文件的检测,文件识别和转换。
1.2.1选择文件,将文件夹内的所有文件按照顺序逐次打开
1.2.1.1选择文件夹,将文件夹的路径赋值给变量LuJing
TCHAR szPath[MAX_PATH] = { 0 };//文件路径的内存地址
LPITEMIDLIST pitem;
BROWSEINFO info;//创建结构体
::ZeroMemory(&info, sizeof(info));
info.hwndOwner = this->m_hWnd;
info.lpszTitle = _T("请选择路径: ");
info.pszDisplayName = szPath;
if (pitem = ::SHBrowseForFolder(&info))
{
::SHGetPathFromIDList(pitem, szPath);//项目制列表转换为路径
LuJing = szPath;
UpdateData(FALSE);
}
//原文链接:https ://blog.csdn.net/weixin_42899088/article/details/103673493
1.2.1.2遍历文件,并将文件名放入到vector容器内,使用FOR循环,逐一的将文件的路径赋值给变量WenJian。
/*创建容器*/
vector<CString> FileName_List;//遍历文件名,创建容器,准备装文件路径和文件名
GetFileFromDir(LuJing, FileName_List);//调用函数,将路径指定的文件夹内的文件名装入容器vector
for (int i = 0; i < FileName_List.size(); i++)//按照文件的数量进行循环
{
CString WenJian;//创建变量,
WenJian = LuJing +"\\"+ FileName_List[i];//处理字符串,将文件路径和文件名整合到一个一个字符串
}
###1.2.2打开转换软件(.exe)
CString A = _T("Xchange.exe");//要查看的程序的名称**********
int b = IsProccessRunning(A);//调用函数检查该程序有没有运行,声明为全局函数
if (b == 0)//确认某个程序已经打开,如果打开(打开b==1)则直接加载,如果没有则打开该程序。
{
ShellExecute(NULL, _T("runas"),str2, NULL, NULL, SW_SHOWNORMAL);//运行指定的exe文件
Sleep(2000);
}
IsProccessRunning(A)的程序,在头文件进行声明。
int CALLXchangDlg::IsProccessRunning(CString strProccess)//定义函数为int型
{
BOOL BRunning = FALSE;
PROCESSENTRY32 processEntry32;
HANDLE toolHelp32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (((int)toolHelp32Snapshot) != -1)
{
processEntry32.dwSize = sizeof(processEntry32);
if (Process32First(toolHelp32Snapshot, &processEntry32))
{
do
{
CString str(L"");
str = processEntry32.szExeFile;
if (str == strProccess)
{
BRunning = TRUE;
//AfxMessageBox(L"程序正在运行");//不用弹出对话框
break;
}
}
while (Process32Next(toolHelp32Snapshot, &processEntry32));
}
CloseHandle(toolHelp32Snapshot);
}
return BRunning;
}
1.2.3查找窗口、控件句柄,传递数据
CString str = _T("MainWindow");
CWnd* pWnd = FindWindow(NULL, str);//获取程序运行窗口句柄
HWND hWnd = pWnd->GetSafeHwnd();//利用指针取值
SwitchToThisWindow(hWnd, TRUE);//激活对应句柄的窗口,如果已经最小化,则前端显示,且最大化
Sleep(100);
因为运行的转换软件的控件没有句柄,只能更换方案,通过模拟鼠标响应,实现点击。
RECT r1 = {
0,0,0,0 };//创建窗口的坐标的指针
//寻找xchang的坐标
::GetWindowRect(hWnd, &r1);//获取窗口的坐标
SetCursorPos(r1.left+750, r1.top+135);//移动到某点坐标
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//点下左键
使用剪切板,复制和粘贴变量
CString WenJian;//创建变量,
WenJian = LuJing +"\\"+ FileName_List[i];//处理字符串,将文件路径和文件名整合到一个一个字符串
/*通过剪切板进行文件名的复制*/
if (this->OpenClipboard()) //如果能打开剪贴板
{
::EmptyClipboard(); //清空剪贴板,使该窗口成为剪贴板的拥有者
//CString str("www.qzze.com");//将文本放置到系统剪贴板中
HGLOBAL hClip;
hClip = ::GlobalAlloc(GMEM_MOVEABLE, (WenJian.GetLength() * 2) + 2); //判断要是文本数据,分配内存时多分配一个字符
TCHAR* pBuf;
pBuf = (TCHAR*)::GlobalLock(hClip);//锁定剪贴板
lstrcpy(pBuf, WenJian);//把CString转换
::GlobalUnlock(hClip);//解除锁定剪贴板
::SetClipboardData(CF_UNICODETEXT, hClip);//把文本数据发送到剪贴板 CF_UNICODETEXT为Unicode编码
::CloseClipboard();//关闭剪贴板
}
/*粘贴注:本操作把剪贴板中数据读入数据类型为CString的fromclipboard变量中;*/
char* buffer = NULL;
CString fromClipboard;
if (OpenClipboard())
{
HANDLE hData = GetClipboardData(CF_TEXT