| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 |
- // DisplayWnd.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "DisplayWnd.h"
- #include "Resource.h"
- #include "DockPane.h"
- #include "Config.h"
- #include "GuardMain.h"
- #include "DlgProcess.h"
- #include "tlhelp32.h"
- #pragma region AboutDlg
- class CAboutDlg : public CDialogEx
- {
- public:
- CAboutDlg();
- // 对话框数据
- enum { IDD = IDD_ABOUTBOX };
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
- virtual BOOL OnInitDialog();
- // 实现
- protected:
- DECLARE_MESSAGE_MAP()
- };
- CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
- {
- }
- void CAboutDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialogEx::DoDataExchange(pDX);
- }
- BOOL CAboutDlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
- CStatic* pLogoCtrl = (CStatic*)GetDlgItem(IDC_STATIC_LOGO);
- #ifdef _VERSION_EHANG
- HBITMAP bm = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BMP_LOGO_EHANG));
- if(bm != NULL)
- pLogoCtrl->SetBitmap(bm);
- SetDlgItemText(IDC_STATIC_ABOUT_VERSION, _T("毅航Ehangcom_守护子系统V4.0"));
- SetDlgItemText(IDC_STATIC_ABOUT_RIGHT, _T("Copyright (C) 2015 广州市毅航互联通信股份有限公司"));
- #else
- pLogoCtrl->ModifyStyle(SS_BITMAP, SS_ICON);
- HICON Icon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MAINFRAME));
- if(Icon != NULL)
- pLogoCtrl->SetIcon(Icon);
- SetDlgItemText(IDC_STATIC_ABOUT_VERSION, _T("河南华谊中间件_守护子系统V4.0"));
- SetDlgItemText(IDC_STATIC_ABOUT_RIGHT, _T("Copyright (C) 2015 河南华谊网络科技有限公司"));
- #endif
- return TRUE; // return TRUE unless you set the focus to a control
- // 异常: OCX 属性页应返回 FALSE
- }
- BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
- END_MESSAGE_MAP()
- #pragma endregion
- // CDisplayWnd
- IMPLEMENT_DYNCREATE(CDisplayWnd, CFrameWndEx)
- CDisplayWnd::CDisplayWnd() : m_pShellManager(NULL), m_TrayIcon(IDR_MAINFRAME), m_IsGuardRun(FALSE)
- {
- // 创建 shell 管理器,以防对话框包含
- // 任何 shell 树视图控件或 shell 列表视图控件。
- m_pShellManager = new CShellManager;
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- }
- CDisplayWnd::~CDisplayWnd()
- {
- // 删除上面创建的 shell 管理器。
- if (m_pShellManager != NULL)
- {
- delete m_pShellManager;
- }
- }
- /*****************************************************************
- **【函数名称】 __InsertMenuItem
- **【函数功能】 插入新的菜单项
- **【参数】
- **【返回值】
- ****************************************************************/
- BOOL CDisplayWnd::InsertMenuItem( UINT beforeItemId, UINT NewItemId, UINT NewItemName )
- {
- CMenu* pMenu = GetMenu();
- ASSERT(pMenu != NULL);
- MENUITEMINFO MenuInfo;
- memset(&MenuInfo, 0, sizeof(MenuInfo));
- MenuInfo.cbSize = sizeof(MenuInfo);
- MenuInfo.fMask = MIIM_ID | MIIM_STRING;
- MenuInfo.wID = NewItemId;
- CString Name;
- Name.LoadString(NewItemName);
- MenuInfo.dwTypeData = Name.GetBuffer(0);
- return pMenu->InsertMenuItem(beforeItemId, &MenuInfo);
- }
- /*****************************************************************
- **【函数名称】 Show
- **【函数功能】 显示窗口
- **【参数】
- **【返回值】
- ****************************************************************/
- void CDisplayWnd::Show( void )
- {
- LoadFrame(IDR_MAINFRAME);
- ShowWindow(SW_HIDE);
- UpdateWindow();
- }
- /*****************************************************************
- **【函数名称】 OnNewPane
- **【函数功能】 新增Pane的处理函数
- **【参数】
- **【返回值】
- ****************************************************************/
- void CDisplayWnd::OnNewPane( CDockPane* pPane )
- {
- ASSERT(pPane != NULL);
- DockPane(pPane);
- }
- BEGIN_MESSAGE_MAP(CDisplayWnd, CFrameWndEx)
- ON_MESSAGE(WM_SYSTEMTRAY, OnSystemTray)
- ON_WM_CREATE()
- ON_WM_CLOSE()
- ON_COMMAND(ID_MENU_ABOUT, &CDisplayWnd::OnMenuAbout)
- ON_COMMAND(ID_MENU_VIEW_LOG, &CDisplayWnd::OnMenuViewLog)
- ON_COMMAND(ID_MENU_QUIT, &CDisplayWnd::OnMenuQuit)
- ON_COMMAND(ID_MENU_ABOUT, &CDisplayWnd::OnMenuAbout)
- ON_COMMAND(ID_MENU_MONITOR_START, &CDisplayWnd::OnMenuMonitorStart)
- ON_COMMAND(ID_MENU_MONITOR_STOP, &CDisplayWnd::OnMenuMonitorStop)
- ON_UPDATE_COMMAND_UI(ID_MENU_MONITOR_START, &CDisplayWnd::OnUpdateMenuMonitorStart)
- ON_UPDATE_COMMAND_UI(ID_MENU_MONITOR_STOP, &CDisplayWnd::OnUpdateMenuMonitorStop)
- ON_COMMAND(ID_MENU_PROCESS, &CDisplayWnd::OnMenuProcess)
- ON_WM_SYSCOMMAND()
- END_MESSAGE_MAP()
- static UINT indicators[] =
- {
- ID_SEPARATOR, // 状态行指示器
- IDS_STR_PRODUCT,
- IDS_STR_RIGHT,
- };
- // CDisplayWnd 消息处理程序
- /*****************************************************************
- **【函数名称】 OnSystemTray
- **【函数功能】 系统托盘图标点击的处理
- **【参数】
- **【返回值】
- ****************************************************************/
- LRESULT CDisplayWnd::OnSystemTray(WPARAM wParam, LPARAM lParam)
- {
- if(wParam == IDR_MAINFRAME)
- {
- switch(lParam)
- {
- case WM_LBUTTONDBLCLK:
- {
- // 不显示主窗口
- this->ShowWindow(SW_NORMAL);
- }
- break;
- case WM_RBUTTONDOWN:
- {
- CMenu hMenu, *pMenu;
- hMenu.LoadMenu(IDR_MENU_POP); // 加载菜单资源
- pMenu = hMenu.GetSubMenu(0); // 获取子对话框
- CPoint pot;
- GetCursorPos(&pot); // 获取鼠标当前位置
- ::SetForegroundWindow(this->m_hWnd);
- pMenu->TrackPopupMenu(TPM_RIGHTALIGN, pot.x, pot.y, this);
- ::PostMessageA(this->m_hWnd, WM_NULL, 0, 0); // 释放焦点
- }
- break;
- }
- }
- return 1;
- }
- int CDisplayWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
- return -1;
- // 设置主窗口标记
- ::SetProp(m_hWnd, AfxGetApp()->m_pszAppName, (HANDLE)1);
- // 设置图标
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
- // 添加菜单
- CMenu menu;
- menu.LoadMenu(IDR_MAINFRAME);
- SetMenu(&menu);
- menu.Detach();
- if (!m_wndStatusBar.Create(this))
- {
- TRACE0("未能创建状态栏\n");
- return -1; // 未能创建
- }
- m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
- // 设置停靠属性
- /*GetDockingManager()->DisableRestoreDockState(TRUE);
- EnableLoadDockState(FALSE);*/
- EnableDocking(CBRS_ALIGN_ANY);
- CDockingManager::SetDockingMode(DT_SMART);
- EnableAutoHidePanes(CBRS_ALIGN_ANY);
- m_TrayIcon.SetNotificationWnd(this, WM_SYSTEMTRAY);
- m_ViewLog.create(this);
- ILogger::getInstance().init(&m_ViewLog, LOG_DEV_GUARD, CConfig::logFilePath());
- ILogger::getInstance().start();
- // 服务信息初始化
- if(CGuardMain::GetInstance().init())
- {
- m_IsGuardRun = TRUE;
- m_TrayIcon.SetIcon(IDR_MAINFRAME, NULL, _T("守护中..."));
- }
- else
- {
- m_IsGuardRun = FALSE;
- m_TrayIcon.SetIcon(IDR_MAINFRAME, NULL, _T("守护停止..."));
- }
- return 0;
- }
- void CDisplayWnd::OnClose()
- {
- if(MessageBox(_T("确定要退出守护系统吗"), _T("提示"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
- {
- ILogger::getInstance().stop();
- ILogger::getInstance().close();
- CFrameWndEx::OnClose();
- }
- }
- void CDisplayWnd::OnMenuAbout()
- {
- CAboutDlg Dlg;
- Dlg.DoModal();
- }
- void CDisplayWnd::OnMenuViewLog()
- {
- m_ViewLog.show();
- }
- void CDisplayWnd::OnMenuQuit()
- {
- //退出前关闭所有进程
- int m_PowerTimeDelay=0;
- int m_TimeDelay=0;
- int m_Conut=0;
- FILE* pfile=NULL;
- pfile=fopen("AutoStart.txt","r");
- if(pfile==NULL)
- {
- PostMessage(WM_CLOSE);
- return;
- }
- fscanf(pfile,"%d",&m_PowerTimeDelay);
- fscanf(pfile,"%d",&m_TimeDelay);
- fscanf(pfile,"%d",&m_Conut);
- char chName[300]={0};
- for (int x=0;x<m_Conut;x++)
- {
- fscanf(pfile,"%s",chName);
- CString strPath= chName;
- CString strExe = strPath.Mid(strPath.ReverseFind('\\')+1,strPath.GetLength());
- __KillProcessFromName(strExe);
- }
- fclose(pfile);
- PostMessage(WM_CLOSE);
- }
- void CDisplayWnd::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if(nID == SC_CLOSE)
- ShowWindow(FALSE); // 不显示主窗体
- else
- CFrameWndEx::OnSysCommand(nID, lParam);
- }
- void CDisplayWnd::OnMenuMonitorStart()
- {
- // 启动服务
- if(!m_IsGuardRun)
- {
- m_IsGuardRun = TRUE;
- CGuardMain::GetInstance().startWatchServer();
- // 托盘图标显示
- m_TrayIcon.SetIcon(IDR_MAINFRAME, NULL, _T("守护中..."));
- }
- }
- void CDisplayWnd::OnMenuMonitorStop()
- {
- // 停止服务
- if(m_IsGuardRun)
- {
- m_IsGuardRun = FALSE;
- CGuardMain::GetInstance().stopWatchServer();
- // 托盘图标显示
- m_TrayIcon.SetIcon(IDR_MAINFRAME, NULL, _T("守护停止..."));
- }
- }
- void CDisplayWnd::OnUpdateMenuMonitorStart(CCmdUI *pCmdUI)
- {
- pCmdUI->SetCheck(m_IsGuardRun);
- }
- void CDisplayWnd::OnUpdateMenuMonitorStop(CCmdUI *pCmdUI)
- {
- pCmdUI->SetCheck(!m_IsGuardRun);
- }
- void CDisplayWnd::OnMenuProcess()
- {
- CDlgProcess ProcessDlg;
- ProcessDlg.DoModal();
- }
- BOOL CDisplayWnd::__KillProcessFromName(CString strProcessName)
- {
- //创建进程快照(TH32CS_SNAPPROCESS表示创建所有进程的快照)
- HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
- //PROCESSENTRY32进程快照的结构体
- PROCESSENTRY32 pe;
- //实例化后使用Process32First获取第一个快照的进程前必做的初始化操作
- pe.dwSize = sizeof(PROCESSENTRY32);
- //下面的IF效果同:
- //if(hProcessSnap == INVALID_HANDLE_VALUE) 无效的句柄
- if(!Process32First(hSnapShot,&pe))
- {
- return FALSE;
- }
- //将字符串转换为小写
- strProcessName.MakeLower();
- //如果句柄有效 则一直获取下一个句柄循环下去
- while (Process32Next(hSnapShot,&pe))
- {
- //pe.szExeFile获取当前进程的可执行文件名称
- CString scTmp = pe.szExeFile;
- //将可执行文件名称所有英文字母修改为小写
- scTmp.MakeLower();
- //比较当前进程的可执行文件名称和传递进来的文件名称是否相同
- //相同的话Compare返回0
- if(!scTmp.Compare(strProcessName))
- {
- //从快照进程中获取该进程的PID(即任务管理器中的PID)
- DWORD dwProcessID = pe.th32ProcessID;
- HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);
- ::TerminateProcess(hProcess,0);
- CloseHandle(hProcess);
- return TRUE;
- }
- scTmp.ReleaseBuffer();
- }
- strProcessName.ReleaseBuffer();
- return FALSE;
- }
|