1stOpt是一款世界领先的非线性曲线拟合,综合优化分析计算软件平台
但是软件读入文件和保存结果实在是太复杂了,很难做到批量处理数据
基于此,设计了一个能批量处理方程的小程序,以input.txt文本文件内容为输入,以output.txt文本内容为输出
首先用Spy++获取1stOpt的窗口信息,获得代码输入框的handle和结果显示的handle,用sendmessage的方法设置文本获取文本
HWND hWndMain,hWndPage,hWndTRzTabSheetEdit,hWndTRzTabSheetResult,hWndTEditorFormEdit,hWndTSynEditEdit,hWndTSynEditResult;
CFile fileInput;
if (fileInput.Open(_T("input.txt"),CFile::modeRead) ==NULL) return 1;
char *buf=new char[fileInput.GetLength()+1];
memset(buf,0,fileInput.GetLength()+1);
fileInput.Read(buf,fileInput.GetLength());
fileInput.Close();
hWndMain = ::FindWindow(NULL,_T("1stOpt - [Untitled1]"));
if(!hWndMain)
{
return 1;
}
hWndPage = ::FindWindowEx(hWndMain,NULL,_T("TRzPageControl"),NULL);
hWndTRzTabSheetEdit = ::FindWindowEx(hWndPage,NULL,_T("TRzTabSheet"),_T("代码本 1 - [Untitled1]"));
hWndTEditorFormEdit = ::FindWindowEx(hWndTRzTabSheetEdit,NULL,_T("TEditorForm"),NULL);
hWndTSynEditEdit = ::FindWindowEx(hWndTEditorFormEdit,NULL,_T("TSynEdit"),NULL);
int iRequiredSize = ::MultiByteToWideChar(CP_ACP, NULL, buf, -1, NULL, 0);
WCHAR* pwchString = new WCHAR[iRequiredSize];
::MultiByteToWideChar(CP_ACP, NULL, buf , -1, pwchString, iRequiredSize);
//CopyTheFileToEditor
::SendMessage(hWndTSynEditEdit,WM_SETTEXT,0,(LPARAM)pwchString);
delete [] pwchString;
delete [] buf;
//F9
::Sleep(10);
::SendMessage(hWndMain,WM_KEYDOWN,VK_F9,0);
::SendMessage(hWndMain,WM_KEYUP,VK_F9,0);
WCHAR bufResult[10000];
//Sleep for a while
::Sleep(100);
hWndTRzTabSheetResult = ::FindWindowEx(hWndPage,NULL,_T("TRzTabSheet"),_T(" 结 果 "));
hWndTSynEditResult = ::FindWindowEx(hWndTRzTabSheetResult,NULL,_T("TSynEdit"),NULL);
while (1)
{
//ReadResult
::SendMessage(hWndTSynEditResult,WM_GETTEXT,10000,(LPARAM)bufResult);
if (wcsstr(bufResult,_T("======")) != NULL ) break;
//Sleep for a while
::Sleep(100);
}
CFile fileOutput;
fileOutput.Open(_T("output.txt"), CFile::modeCreate | CFile::modeWrite);
setlocale(LC_ALL, "chs");
UINT resultLen = wcslen(bufResult);
char * pChar=new char[resultLen*2];
memset(pChar,0,resultLen*2);
wcstombs(pChar,bufResult,resultLen*2);
fileOutput.Write(pChar,resultLen*2);
fileOutput.Close();
delete [] pChar;