// 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;xSetCheck(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; }