// DlgConfig.cpp : 实现文件 // #include "stdafx.h" #include "Guard.h" #include "DlgProcess.h" #include "afxdialogex.h" #include // CDlgConfig 对话框 IMPLEMENT_DYNAMIC(CDlgProcess, CDialogEx) CDlgProcess::CDlgProcess(CWnd* pParent /*=NULL*/) : CDialogEx(CDlgProcess::IDD, pParent) , m_IsUseTimer(0) , m_IsUnUseTimer(0) , m_hFileConfig(NULL) , m_hMapFileConfig(NULL) , m_pProcessInfo(NULL) { } CDlgProcess::~CDlgProcess() { } void CDlgProcess::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_INFO, m_listInfo); DDX_Check(pDX, IDC_RADIO_USE, m_IsUseTimer); DDX_Check(pDX, IDC_RADIO_UNUSE, m_IsUnUseTimer); DDX_Text(pDX, IDC_EDIT_PNAME, m_strProName); DDX_Text(pDX, IDC_MFCEDITBROWSE_PATH, m_strProcPath); DDX_Control(pDX, IDC_CHECK_HEARTBEAT, m_HeartbeatFlag); DDX_Control(pDX, IDC_EDT_RESTART_TIME, m_EdtRestartTime); DDX_Control(pDX, IDC_EDIT1, m_PowerDelayTime); DDX_Control(pDX, IDC_EDIT2, m_ExeDelayTime); } BEGIN_MESSAGE_MAP(CDlgProcess, CDialogEx) ON_BN_CLICKED(IDC_BTN_DEL, &CDlgProcess::OnBnClickedButtonDel) ON_NOTIFY(NM_CLICK, IDC_LIST_INFO, &CDlgProcess::OnNMClickListInfo) ON_BN_CLICKED(IDOK, &CDlgProcess::OnBnClickedOk) ON_EN_CHANGE(IDC_MFCEDITBROWSE_PATH, &CDlgProcess::OnEnChangeMfceditbrowsePath) ON_BN_CLICKED(IDC_RADIO_USE, &CDlgProcess::OnBnClickedRadioUse) ON_BN_CLICKED(IDC_RADIO_UNUSE, &CDlgProcess::OnBnClickedRadioUnuse) ON_BN_CLICKED(IDC_BUTTON1, &CDlgProcess::OnBnClickedButton1) END_MESSAGE_MAP() // CDlgConfig 消息处理程序 BOOL CDlgProcess::OnInitDialog() { CDialogEx::OnInitDialog(); DWORD ExStyle = m_listInfo.GetExtendedStyle(); m_listInfo.SetExtendedStyle(ExStyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); m_listInfo.InsertColumn(0, "进程名称", LVCFMT_LEFT, 100, -1); m_listInfo.InsertColumn(1, "启用心跳通讯", LVCFMT_LEFT, 100, -1); m_listInfo.InsertColumn(2, "已运行时长(小时)", LVCFMT_LEFT, 120, -1); m_listInfo.InsertColumn(3, "重启间隔(小时)", LVCFMT_LEFT, 100, -1); m_listInfo.InsertColumn(4, "程序路径", LVCFMT_LEFT, 330, -1); // 打开配置信息 if(__OpenConfigFile()) { // 显示列表信息 __ShowListInfo(); } else { AfxMessageBox("打开配置文件错误"); } FILE* pfile=NULL; pfile=fopen("AutoStart.txt","r"); if(pfile!=NULL) { char chPowerDelayTime[100]; char chExeDelayTime[100]; fscanf(pfile,"%s",chPowerDelayTime); fscanf(pfile,"%s",chExeDelayTime); m_PowerDelayTime.SetWindowText(chPowerDelayTime); m_ExeDelayTime.SetWindowText(chExeDelayTime); fclose(pfile); } return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } /***************************************************************** **【函数名称】 __OpenConfigFile **【函数功能】 打开配置文件信息 **【参数】 **【返回值】 ****************************************************************/ BOOL CDlgProcess::__OpenConfigFile() { if(_access(FILE_PATH, 0) == -1) CreateDirectoryA(FILE_PATH, NULL); m_hFileConfig = CreateFile(FILE_NAME, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(m_hFileConfig == NULL) return FALSE; // 打开内存映射文件 m_hMapFileConfig = CreateFileMapping(m_hFileConfig, NULL, PAGE_READWRITE, 0, sizeof(ProcessInfo)*WATCH_MAX_COUNT, VIEW_NAME); if(m_hMapFileConfig == NULL) { CloseHandle(m_hFileConfig); return FALSE; } // 映射文件对象到进程地址空间 LPVOID hViewFile = MapViewOfFile(m_hMapFileConfig, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(ProcessInfo)*WATCH_MAX_COUNT); if(hViewFile == NULL) { CloseHandle(m_hMapFileConfig); CloseHandle(m_hFileConfig); return FALSE; } // 保存内存指针 if(m_hFileConfig != NULL) CloseHandle(m_hFileConfig); if(m_hMapFileConfig != NULL) CloseHandle(m_hMapFileConfig); m_pProcessInfo = (ProcessInfo*)hViewFile; return TRUE; } /***************************************************************** **【函数名称】 ShowListInfo **【函数功能】 显示列表信息 **【参数】 **【返回值】 ****************************************************************/ void CDlgProcess::__ShowListInfo() { m_listInfo.DeleteAllItems(); for(int i = 0; i < WATCH_MAX_COUNT; i++) { if(strcmp(m_pProcessInfo[i].m_szName, _T("")) != 0) { // 显示 m_listInfo.InsertItem(0, m_pProcessInfo[i].m_szName); m_listInfo.SetItemText(0, 1, m_pProcessInfo[i].m_bUseActiveFlag == TRUE ? _T("是") : _T("否")); // 运行时长 CString strRunTime; strRunTime.Format(_T("%d"), m_pProcessInfo[i].m_nRunTimer); m_listInfo.SetItemText(0, 2, strRunTime); // 重启间隔 CString strMaxTime; strMaxTime.Format(_T("%d"), m_pProcessInfo[i].m_nOnTimerReStart); m_listInfo.SetItemText(0, 3, strMaxTime); m_listInfo.SetItemText(0, 4, m_pProcessInfo[i].m_szPath); } } } void CDlgProcess::OnBnClickedButtonDel() { // 删除 UpdateData(TRUE); if(m_strProName == _T("")) { AfxMessageBox("请先选择要删除的进程"); return; } // 删除 for(int i = 0; i < WATCH_MAX_COUNT; i++) { if(strcmp(m_pProcessInfo[i].m_szName, m_strProName) == 0) { // 清除信息 ZeroMemory(&m_pProcessInfo[i], sizeof(ProcessInfo)); break; } } // 对话框清零 m_strProName = _T(""); m_strProcPath = _T(""); m_IsUseTimer = 0; m_IsUnUseTimer = 1; m_EdtRestartTime.SetWindowText(_T("")); UpdateData(FALSE); __ShowListInfo(); } void CDlgProcess::OnNMClickListInfo(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); int nItem, nFlags; nFlags = LVNI_SELECTED; nItem = m_listInfo.GetNextItem(-1, nFlags ); // 显示进程名 CHAR szPNamr[64]; ZeroMemory(szPNamr, 64); m_listInfo.GetItemText(nItem, 0, szPNamr, 64); m_strProName = szPNamr; // 显示是否启用心跳标识 CHAR szFlag[64]; ZeroMemory(szFlag, 64); m_listInfo.GetItemText(nItem, 1, szFlag, 64); BOOL bIsFlag = strcmp(szFlag, _T("是")) == 0 ? TRUE : FALSE; m_HeartbeatFlag.SetCheck(bIsFlag); // 显示指定时长 CHAR szMaxTime[64]; ZeroMemory(szMaxTime, 64); m_listInfo.GetItemText(nItem, 3, szMaxTime, 64); if(atoi(szMaxTime) > 0) { m_IsUseTimer = 1; m_IsUnUseTimer = 0; m_EdtRestartTime.SetReadOnly(FALSE); m_EdtRestartTime.SetWindowText(szMaxTime); } else { m_IsUseTimer = 0; m_IsUnUseTimer = 1; m_EdtRestartTime.SetReadOnly(TRUE); m_EdtRestartTime.SetWindowText(_T("")); } // 显示进程路径 CHAR szPath[256]; ZeroMemory(szPath, 256); m_listInfo.GetItemText(nItem, 4, szPath, 256); m_strProcPath = szPath; *pResult = 0; UpdateData(FALSE); } void CDlgProcess::OnBnClickedOk() { // 添加修改 UpdateData(TRUE); // 读取配置信息 ProcessInfo pInfo; ZeroMemory(&pInfo, sizeof(ProcessInfo)); if(m_strProName == _T("")||m_strProName.Right(4) != _T(".exe")) // 过滤掉非exe可执行程序 { MessageBox("请选择正确的可执行程序"); return; } lstrcpy(pInfo.m_szName, m_strProName); // 进程名称 pInfo.m_bUseActiveFlag = m_HeartbeatFlag.GetCheck(); // 是否启用心跳标识 // 重启间隔时长 CString RestartTime; m_EdtRestartTime.GetWindowText(RestartTime); pInfo.m_nOnTimerReStart = atoi(RestartTime); // 路径 lstrcpy(pInfo.m_szPath, m_strProcPath); // 若已经监控该进程,则更新信息 for(int i = 0; i < WATCH_MAX_COUNT; i++) { if(strcmp(m_pProcessInfo[i].m_szName, pInfo.m_szName) == 0) { CopyMemory(&m_pProcessInfo[i], &pInfo, sizeof(ProcessInfo)); __ShowListInfo(); return; } } // 若未曾监控该进程,则添加进程 for(int i = 0; i < WATCH_MAX_COUNT; i++) { if(strcmp(m_pProcessInfo[i].m_szName, _T("")) == 0) { CopyMemory(&m_pProcessInfo[i], &pInfo, sizeof(ProcessInfo)); __ShowListInfo(); break; } } } void CDlgProcess::OnEnChangeMfceditbrowsePath() { // 选择进程路径,自动生成进程名 this->UpdateData(TRUE); CString strPath = m_strProcPath; int nIndex = strPath.ReverseFind('/'); if(nIndex == -1) { nIndex = strPath.ReverseFind('\\'); } if(nIndex != -1) { m_strProName = strPath.Right(strPath.GetLength()-nIndex-1); } this->UpdateData(FALSE); } void CDlgProcess::OnBnClickedRadioUse() { m_IsUseTimer = 1; m_IsUnUseTimer = 0; UpdateData(FALSE); m_EdtRestartTime.SetReadOnly(FALSE); } void CDlgProcess::OnBnClickedRadioUnuse() { m_IsUseTimer = 0; m_IsUnUseTimer = 1; m_EdtRestartTime.SetWindowText(_T("")); UpdateData(FALSE); m_EdtRestartTime.SetReadOnly(TRUE); } void CDlgProcess::OnBnClickedButton1() { FILE* pfile=NULL; pfile=fopen("AutoStart.txt","w"); CString PowerDelyTimestr; CString ExeDelayTimestr; m_PowerDelayTime.GetWindowText(PowerDelyTimestr); m_ExeDelayTime.GetWindowText(ExeDelayTimestr); int PowerDelyTime = atoi(PowerDelyTimestr); int ExeDelayTime = atoi(ExeDelayTimestr); fprintf(pfile,"%d\n",PowerDelyTime); fprintf(pfile,"%d\n",ExeDelayTime); int count = m_listInfo.GetItemCount(); fprintf(pfile,"%d\n",count); for (int i=count-1;i>=0;i--) { CString strPath=m_listInfo.GetItemText(i,4); fprintf(pfile,"%s\n",strPath.GetBuffer(0)); } fclose(pfile); }