MiddleWares_YiHe 郑州颐和医院随访系统中间件

DisplayWnd.cpp 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. // DisplayWnd.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "DisplayWnd.h"
  5. #include "Resource.h"
  6. #include "DockPane.h"
  7. #include "Config.h"
  8. #include "GuardMain.h"
  9. #include "DlgProcess.h"
  10. #include "tlhelp32.h"
  11. #pragma region AboutDlg
  12. class CAboutDlg : public CDialogEx
  13. {
  14. public:
  15. CAboutDlg();
  16. // 对话框数据
  17. enum { IDD = IDD_ABOUTBOX };
  18. protected:
  19. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  20. virtual BOOL OnInitDialog();
  21. // 实现
  22. protected:
  23. DECLARE_MESSAGE_MAP()
  24. };
  25. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  26. {
  27. }
  28. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  29. {
  30. CDialogEx::DoDataExchange(pDX);
  31. }
  32. BOOL CAboutDlg::OnInitDialog()
  33. {
  34. CDialogEx::OnInitDialog();
  35. CStatic* pLogoCtrl = (CStatic*)GetDlgItem(IDC_STATIC_LOGO);
  36. #ifdef _VERSION_EHANG
  37. HBITMAP bm = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BMP_LOGO_EHANG));
  38. if(bm != NULL)
  39. pLogoCtrl->SetBitmap(bm);
  40. SetDlgItemText(IDC_STATIC_ABOUT_VERSION, _T("毅航Ehangcom_守护子系统V4.0"));
  41. SetDlgItemText(IDC_STATIC_ABOUT_RIGHT, _T("Copyright (C) 2015 广州市毅航互联通信股份有限公司"));
  42. #else
  43. pLogoCtrl->ModifyStyle(SS_BITMAP, SS_ICON);
  44. HICON Icon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MAINFRAME));
  45. if(Icon != NULL)
  46. pLogoCtrl->SetIcon(Icon);
  47. SetDlgItemText(IDC_STATIC_ABOUT_VERSION, _T("河南华谊中间件_守护子系统V4.0"));
  48. SetDlgItemText(IDC_STATIC_ABOUT_RIGHT, _T("Copyright (C) 2015 河南华谊网络科技有限公司"));
  49. #endif
  50. return TRUE; // return TRUE unless you set the focus to a control
  51. // 异常: OCX 属性页应返回 FALSE
  52. }
  53. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  54. END_MESSAGE_MAP()
  55. #pragma endregion
  56. // CDisplayWnd
  57. IMPLEMENT_DYNCREATE(CDisplayWnd, CFrameWndEx)
  58. CDisplayWnd::CDisplayWnd() : m_pShellManager(NULL), m_TrayIcon(IDR_MAINFRAME), m_IsGuardRun(FALSE)
  59. {
  60. // 创建 shell 管理器,以防对话框包含
  61. // 任何 shell 树视图控件或 shell 列表视图控件。
  62. m_pShellManager = new CShellManager;
  63. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  64. }
  65. CDisplayWnd::~CDisplayWnd()
  66. {
  67. // 删除上面创建的 shell 管理器。
  68. if (m_pShellManager != NULL)
  69. {
  70. delete m_pShellManager;
  71. }
  72. }
  73. /*****************************************************************
  74. **【函数名称】 __InsertMenuItem
  75. **【函数功能】 插入新的菜单项
  76. **【参数】
  77. **【返回值】
  78. ****************************************************************/
  79. BOOL CDisplayWnd::InsertMenuItem( UINT beforeItemId, UINT NewItemId, UINT NewItemName )
  80. {
  81. CMenu* pMenu = GetMenu();
  82. ASSERT(pMenu != NULL);
  83. MENUITEMINFO MenuInfo;
  84. memset(&MenuInfo, 0, sizeof(MenuInfo));
  85. MenuInfo.cbSize = sizeof(MenuInfo);
  86. MenuInfo.fMask = MIIM_ID | MIIM_STRING;
  87. MenuInfo.wID = NewItemId;
  88. CString Name;
  89. Name.LoadString(NewItemName);
  90. MenuInfo.dwTypeData = Name.GetBuffer(0);
  91. return pMenu->InsertMenuItem(beforeItemId, &MenuInfo);
  92. }
  93. /*****************************************************************
  94. **【函数名称】 Show
  95. **【函数功能】 显示窗口
  96. **【参数】
  97. **【返回值】
  98. ****************************************************************/
  99. void CDisplayWnd::Show( void )
  100. {
  101. LoadFrame(IDR_MAINFRAME);
  102. ShowWindow(SW_HIDE);
  103. UpdateWindow();
  104. }
  105. /*****************************************************************
  106. **【函数名称】 OnNewPane
  107. **【函数功能】 新增Pane的处理函数
  108. **【参数】
  109. **【返回值】
  110. ****************************************************************/
  111. void CDisplayWnd::OnNewPane( CDockPane* pPane )
  112. {
  113. ASSERT(pPane != NULL);
  114. DockPane(pPane);
  115. }
  116. BEGIN_MESSAGE_MAP(CDisplayWnd, CFrameWndEx)
  117. ON_MESSAGE(WM_SYSTEMTRAY, OnSystemTray)
  118. ON_WM_CREATE()
  119. ON_WM_CLOSE()
  120. ON_COMMAND(ID_MENU_ABOUT, &CDisplayWnd::OnMenuAbout)
  121. ON_COMMAND(ID_MENU_VIEW_LOG, &CDisplayWnd::OnMenuViewLog)
  122. ON_COMMAND(ID_MENU_QUIT, &CDisplayWnd::OnMenuQuit)
  123. ON_COMMAND(ID_MENU_ABOUT, &CDisplayWnd::OnMenuAbout)
  124. ON_COMMAND(ID_MENU_MONITOR_START, &CDisplayWnd::OnMenuMonitorStart)
  125. ON_COMMAND(ID_MENU_MONITOR_STOP, &CDisplayWnd::OnMenuMonitorStop)
  126. ON_UPDATE_COMMAND_UI(ID_MENU_MONITOR_START, &CDisplayWnd::OnUpdateMenuMonitorStart)
  127. ON_UPDATE_COMMAND_UI(ID_MENU_MONITOR_STOP, &CDisplayWnd::OnUpdateMenuMonitorStop)
  128. ON_COMMAND(ID_MENU_PROCESS, &CDisplayWnd::OnMenuProcess)
  129. ON_WM_SYSCOMMAND()
  130. END_MESSAGE_MAP()
  131. static UINT indicators[] =
  132. {
  133. ID_SEPARATOR, // 状态行指示器
  134. IDS_STR_PRODUCT,
  135. IDS_STR_RIGHT,
  136. };
  137. // CDisplayWnd 消息处理程序
  138. /*****************************************************************
  139. **【函数名称】 OnSystemTray
  140. **【函数功能】 系统托盘图标点击的处理
  141. **【参数】
  142. **【返回值】
  143. ****************************************************************/
  144. LRESULT CDisplayWnd::OnSystemTray(WPARAM wParam, LPARAM lParam)
  145. {
  146. if(wParam == IDR_MAINFRAME)
  147. {
  148. switch(lParam)
  149. {
  150. case WM_LBUTTONDBLCLK:
  151. {
  152. // 不显示主窗口
  153. this->ShowWindow(SW_NORMAL);
  154. }
  155. break;
  156. case WM_RBUTTONDOWN:
  157. {
  158. CMenu hMenu, *pMenu;
  159. hMenu.LoadMenu(IDR_MENU_POP); // 加载菜单资源
  160. pMenu = hMenu.GetSubMenu(0); // 获取子对话框
  161. CPoint pot;
  162. GetCursorPos(&pot); // 获取鼠标当前位置
  163. ::SetForegroundWindow(this->m_hWnd);
  164. pMenu->TrackPopupMenu(TPM_RIGHTALIGN, pot.x, pot.y, this);
  165. ::PostMessageA(this->m_hWnd, WM_NULL, 0, 0); // 释放焦点
  166. }
  167. break;
  168. }
  169. }
  170. return 1;
  171. }
  172. int CDisplayWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  173. {
  174. if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
  175. return -1;
  176. // 设置主窗口标记
  177. ::SetProp(m_hWnd, AfxGetApp()->m_pszAppName, (HANDLE)1);
  178. // 设置图标
  179. SetIcon(m_hIcon, TRUE); // 设置大图标
  180. SetIcon(m_hIcon, FALSE); // 设置小图标
  181. // 添加菜单
  182. CMenu menu;
  183. menu.LoadMenu(IDR_MAINFRAME);
  184. SetMenu(&menu);
  185. menu.Detach();
  186. if (!m_wndStatusBar.Create(this))
  187. {
  188. TRACE0("未能创建状态栏\n");
  189. return -1; // 未能创建
  190. }
  191. m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
  192. // 设置停靠属性
  193. /*GetDockingManager()->DisableRestoreDockState(TRUE);
  194. EnableLoadDockState(FALSE);*/
  195. EnableDocking(CBRS_ALIGN_ANY);
  196. CDockingManager::SetDockingMode(DT_SMART);
  197. EnableAutoHidePanes(CBRS_ALIGN_ANY);
  198. m_TrayIcon.SetNotificationWnd(this, WM_SYSTEMTRAY);
  199. m_ViewLog.create(this);
  200. ILogger::getInstance().init(&m_ViewLog, LOG_DEV_GUARD, CConfig::logFilePath());
  201. ILogger::getInstance().start();
  202. // 服务信息初始化
  203. if(CGuardMain::GetInstance().init())
  204. {
  205. m_IsGuardRun = TRUE;
  206. m_TrayIcon.SetIcon(IDR_MAINFRAME, NULL, _T("守护中..."));
  207. }
  208. else
  209. {
  210. m_IsGuardRun = FALSE;
  211. m_TrayIcon.SetIcon(IDR_MAINFRAME, NULL, _T("守护停止..."));
  212. }
  213. return 0;
  214. }
  215. void CDisplayWnd::OnClose()
  216. {
  217. if(MessageBox(_T("确定要退出守护系统吗"), _T("提示"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
  218. {
  219. ILogger::getInstance().stop();
  220. ILogger::getInstance().close();
  221. CFrameWndEx::OnClose();
  222. }
  223. }
  224. void CDisplayWnd::OnMenuAbout()
  225. {
  226. CAboutDlg Dlg;
  227. Dlg.DoModal();
  228. }
  229. void CDisplayWnd::OnMenuViewLog()
  230. {
  231. m_ViewLog.show();
  232. }
  233. void CDisplayWnd::OnMenuQuit()
  234. {
  235. //退出前关闭所有进程
  236. int m_PowerTimeDelay=0;
  237. int m_TimeDelay=0;
  238. int m_Conut=0;
  239. FILE* pfile=NULL;
  240. pfile=fopen("AutoStart.txt","r");
  241. if(pfile==NULL)
  242. {
  243. PostMessage(WM_CLOSE);
  244. return;
  245. }
  246. fscanf(pfile,"%d",&m_PowerTimeDelay);
  247. fscanf(pfile,"%d",&m_TimeDelay);
  248. fscanf(pfile,"%d",&m_Conut);
  249. char chName[300]={0};
  250. for (int x=0;x<m_Conut;x++)
  251. {
  252. fscanf(pfile,"%s",chName);
  253. CString strPath= chName;
  254. CString strExe = strPath.Mid(strPath.ReverseFind('\\')+1,strPath.GetLength());
  255. __KillProcessFromName(strExe);
  256. }
  257. fclose(pfile);
  258. PostMessage(WM_CLOSE);
  259. }
  260. void CDisplayWnd::OnSysCommand(UINT nID, LPARAM lParam)
  261. {
  262. if(nID == SC_CLOSE)
  263. ShowWindow(FALSE); // 不显示主窗体
  264. else
  265. CFrameWndEx::OnSysCommand(nID, lParam);
  266. }
  267. void CDisplayWnd::OnMenuMonitorStart()
  268. {
  269. // 启动服务
  270. if(!m_IsGuardRun)
  271. {
  272. m_IsGuardRun = TRUE;
  273. CGuardMain::GetInstance().startWatchServer();
  274. // 托盘图标显示
  275. m_TrayIcon.SetIcon(IDR_MAINFRAME, NULL, _T("守护中..."));
  276. }
  277. }
  278. void CDisplayWnd::OnMenuMonitorStop()
  279. {
  280. // 停止服务
  281. if(m_IsGuardRun)
  282. {
  283. m_IsGuardRun = FALSE;
  284. CGuardMain::GetInstance().stopWatchServer();
  285. // 托盘图标显示
  286. m_TrayIcon.SetIcon(IDR_MAINFRAME, NULL, _T("守护停止..."));
  287. }
  288. }
  289. void CDisplayWnd::OnUpdateMenuMonitorStart(CCmdUI *pCmdUI)
  290. {
  291. pCmdUI->SetCheck(m_IsGuardRun);
  292. }
  293. void CDisplayWnd::OnUpdateMenuMonitorStop(CCmdUI *pCmdUI)
  294. {
  295. pCmdUI->SetCheck(!m_IsGuardRun);
  296. }
  297. void CDisplayWnd::OnMenuProcess()
  298. {
  299. CDlgProcess ProcessDlg;
  300. ProcessDlg.DoModal();
  301. }
  302. BOOL CDisplayWnd::__KillProcessFromName(CString strProcessName)
  303. {
  304. //创建进程快照(TH32CS_SNAPPROCESS表示创建所有进程的快照)
  305. HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  306. //PROCESSENTRY32进程快照的结构体
  307. PROCESSENTRY32 pe;
  308. //实例化后使用Process32First获取第一个快照的进程前必做的初始化操作
  309. pe.dwSize = sizeof(PROCESSENTRY32);
  310. //下面的IF效果同:
  311. //if(hProcessSnap == INVALID_HANDLE_VALUE) 无效的句柄
  312. if(!Process32First(hSnapShot,&pe))
  313. {
  314. return FALSE;
  315. }
  316. //将字符串转换为小写
  317. strProcessName.MakeLower();
  318. //如果句柄有效 则一直获取下一个句柄循环下去
  319. while (Process32Next(hSnapShot,&pe))
  320. {
  321. //pe.szExeFile获取当前进程的可执行文件名称
  322. CString scTmp = pe.szExeFile;
  323. //将可执行文件名称所有英文字母修改为小写
  324. scTmp.MakeLower();
  325. //比较当前进程的可执行文件名称和传递进来的文件名称是否相同
  326. //相同的话Compare返回0
  327. if(!scTmp.Compare(strProcessName))
  328. {
  329. //从快照进程中获取该进程的PID(即任务管理器中的PID)
  330. DWORD dwProcessID = pe.th32ProcessID;
  331. HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);
  332. ::TerminateProcess(hProcess,0);
  333. CloseHandle(hProcess);
  334. return TRUE;
  335. }
  336. scTmp.ReleaseBuffer();
  337. }
  338. strProcessName.ReleaseBuffer();
  339. return FALSE;
  340. }