OGCAssistToolDlg.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. // OGCAssistToolDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "OGCAssistTool.h"
  5. #include "OGCAssistToolDlg.h"
  6. #include "PageDebug.h"
  7. #include "PageLog.h"
  8. #include "PageConfig.h"
  9. #include "PageStatistics.h"
  10. #include "Injection.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #endif
  14. // 注入;
  15. CInjection g_Injection;
  16. // OGC Tool无序句柄;
  17. HWND g_hWnd_SN = NULL;
  18. HWND g_hWnd_SN_Combobox = NULL;
  19. HWND g_hWnd_Tester = NULL;
  20. HWND g_hWnd_FWVersion = NULL;
  21. HWND g_hWnd_Channel = NULL;
  22. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  23. class CAboutDlg : public CDialogEx
  24. {
  25. public:
  26. CAboutDlg();
  27. // 对话框数据
  28. enum { IDD = IDD_ABOUTBOX };
  29. protected:
  30. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  31. // 实现
  32. protected:
  33. DECLARE_MESSAGE_MAP()
  34. };
  35. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  36. {
  37. }
  38. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  39. {
  40. CDialogEx::DoDataExchange(pDX);
  41. }
  42. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  43. END_MESSAGE_MAP()
  44. // COGCAssistToolDlg 对话框
  45. COGCAssistToolDlg::COGCAssistToolDlg(CWnd* pParent /*=NULL*/)
  46. : CDialogEx(COGCAssistToolDlg::IDD, pParent)
  47. {
  48. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  49. }
  50. void COGCAssistToolDlg::DoDataExchange(CDataExchange* pDX)
  51. {
  52. CDialogEx::DoDataExchange(pDX);
  53. DDX_Control(pDX, IDC_TAB, m_tabCtrl);
  54. }
  55. BEGIN_MESSAGE_MAP(COGCAssistToolDlg, CDialogEx)
  56. ON_WM_SYSCOMMAND()
  57. ON_WM_PAINT()
  58. ON_WM_QUERYDRAGICON()
  59. //}}AFX_MSG_MAP
  60. ON_NOTIFY(TCN_SELCHANGE, IDC_TAB, &COGCAssistToolDlg::OnTcnSelchangeTab)
  61. ON_WM_TIMER()
  62. END_MESSAGE_MAP()
  63. // COGCAssistToolDlg 消息处理程序
  64. BOOL COGCAssistToolDlg::OnInitDialog()
  65. {
  66. CDialogEx::OnInitDialog();
  67. // 将“关于...”菜单项添加到系统菜单中。
  68. // IDM_ABOUTBOX 必须在系统命令范围内。
  69. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  70. ASSERT(IDM_ABOUTBOX < 0xF000);
  71. CMenu* pSysMenu = GetSystemMenu(FALSE);
  72. if (pSysMenu != NULL)
  73. {
  74. BOOL bNameValid;
  75. CString strAboutMenu;
  76. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  77. ASSERT(bNameValid);
  78. if (!strAboutMenu.IsEmpty())
  79. {
  80. pSysMenu->AppendMenu(MF_SEPARATOR);
  81. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  82. }
  83. }
  84. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  85. // 执行此操作
  86. SetIcon(m_hIcon, TRUE); // 设置大图标
  87. SetIcon(m_hIcon, FALSE); // 设置小图标
  88. // TODO: 在此添加额外的初始化代码
  89. //SetBackgroundImage(IDB_LOGO);
  90. //SetBackgroundColor(RGB(255,255,255));
  91. if ( GLOBAL::g_config.nOffline )
  92. {
  93. }
  94. InitTabCtrl();
  95. SetTimer(0, 300, NULL);
  96. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  97. }
  98. void COGCAssistToolDlg::OnSysCommand(UINT nID, LPARAM lParam)
  99. {
  100. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  101. {
  102. CAboutDlg dlgAbout;
  103. dlgAbout.DoModal();
  104. }
  105. else
  106. {
  107. CDialogEx::OnSysCommand(nID, lParam);
  108. }
  109. }
  110. // 如果向对话框添加最小化按钮,则需要下面的代码
  111. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  112. // 这将由框架自动完成。
  113. void COGCAssistToolDlg::OnPaint()
  114. {
  115. if (IsIconic())
  116. {
  117. CPaintDC dc(this); // 用于绘制的设备上下文
  118. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  119. // 使图标在工作区矩形中居中
  120. int cxIcon = GetSystemMetrics(SM_CXICON);
  121. int cyIcon = GetSystemMetrics(SM_CYICON);
  122. CRect rect;
  123. GetClientRect(&rect);
  124. int x = (rect.Width() - cxIcon + 1) / 2;
  125. int y = (rect.Height() - cyIcon + 1) / 2;
  126. // 绘制图标
  127. dc.DrawIcon(x, y, m_hIcon);
  128. }
  129. else
  130. {
  131. CDialogEx::OnPaint();
  132. }
  133. }
  134. //当用户拖动最小化窗口时系统调用此函数取得光标
  135. //显示。
  136. HCURSOR COGCAssistToolDlg::OnQueryDragIcon()
  137. {
  138. return static_cast<HCURSOR>(m_hIcon);
  139. }
  140. void COGCAssistToolDlg::InitTabCtrl()
  141. {
  142. static CFont font;// 必须全局或成员或静态,局部变量无效异常;
  143. VERIFY(font.CreateFont(
  144. 39, // nHeight
  145. 0, // nWidth
  146. 0, // nEscapement
  147. 0, // nOrientation
  148. FW_NORMAL, // nWeight
  149. FALSE, // bItalic
  150. FALSE, // bUnderline
  151. 0, // cStrikeOut
  152. ANSI_CHARSET, // nCharSet
  153. OUT_DEFAULT_PRECIS, // nOutPrecision
  154. CLIP_DEFAULT_PRECIS, // nClipPrecision
  155. DEFAULT_QUALITY, // nQuality
  156. DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
  157. _T("Arial")));
  158. m_tabCtrl.SetFont(&font);
  159. m_ImageList.Create(IDB_TAB, 32, 1, RGB(255,255,255) );
  160. m_tabCtrl.SetImageList(&m_ImageList);
  161. m_tabCtrl.InsertItem(0, _T("调试"));
  162. m_tabCtrl.InsertItem(1, _T("日志"));
  163. m_tabCtrl.InsertItem(2, _T("统计"));
  164. m_tabCtrl.InsertItem(3, _T("设置"));
  165. TC_ITEM tcItem;
  166. tcItem.mask = TCIF_IMAGE;
  167. for( int i = 0; i < 4; i++ )
  168. {
  169. tcItem.iImage = i;
  170. m_tabCtrl.SetItem( i, &tcItem ); //显示ImageList的序号
  171. }
  172. // 获取当前窗口大小;
  173. CRect rcWnd;
  174. m_tabCtrl.GetWindowRect(&rcWnd);
  175. int nCount = m_tabCtrl.GetItemCount();
  176. // 设置标签的大小(必须在属性Style里设置Fixed Width)
  177. CSize size(rcWnd.Width()/nCount-1, 80), sizeReturn;
  178. sizeReturn = m_tabCtrl.SetItemSize(size);
  179. // 设置好标签后,创建Page;
  180. CPageDebug *pDlgDebug = new CPageDebug();
  181. pDlgDebug->Create(PAGE_DEBUG, &m_tabCtrl);
  182. m_pDialog[0] = pDlgDebug;
  183. CPageLog* pDlgLog = new CPageLog();
  184. pDlgLog->Create(PAGE_LOG, &m_tabCtrl);
  185. m_pDialog[1] = pDlgLog;
  186. CPageStatistics *pDlgStatistics = new CPageStatistics();
  187. pDlgStatistics->Create(PAGE_STATISTICS, &m_tabCtrl);
  188. m_pDialog[2] = pDlgStatistics;
  189. CPageConfig *pDlgConfig = new CPageConfig();
  190. pDlgConfig->Create(PAGE_CONFIG, &m_tabCtrl);
  191. m_pDialog[3] = pDlgConfig;
  192. //设定在Tab内显示的范围
  193. CRect rcClient;
  194. m_tabCtrl.GetClientRect(rcClient);
  195. rcClient.top += 82;
  196. pDlgDebug->MoveWindow(&rcClient);
  197. pDlgDebug->ShowWindow(SW_SHOW);
  198. pDlgLog->MoveWindow(&rcClient);
  199. pDlgLog->ShowWindow(SW_HIDE);
  200. pDlgConfig->MoveWindow(&rcClient);
  201. pDlgConfig->ShowWindow(SW_HIDE);
  202. pDlgStatistics->MoveWindow(&rcClient);
  203. pDlgStatistics->ShowWindow(SW_HIDE);
  204. // 设置默认page;
  205. m_tabCtrl.SetCurSel(m_CurSelTab=0);
  206. }
  207. HWND COGCAssistToolDlg::MyFindWindow(LPCTSTR lpClassName)
  208. {
  209. HWND hWnd = NULL;
  210. if ( lpClassName == NULL || lpClassName[0] == '\0' )
  211. return hWnd;
  212. for (std::vector<GLOBAL::WND_INFO>::iterator it = GLOBAL::g_procWndInfo.vtWndInfo.begin(); it != GLOBAL::g_procWndInfo.vtWndInfo.end(); it++ )
  213. {
  214. // 返回第一个找到的类名;
  215. if ( _tcscmp(lpClassName, it->szClassName) == 0 )
  216. {
  217. hWnd = it->hWnd;
  218. break;
  219. }
  220. }
  221. return hWnd;
  222. }
  223. void COGCAssistToolDlg::FetchOGCWnd()
  224. {
  225. // SN Combobox;
  226. for(std::vector<GLOBAL::WND_INFO>::iterator it = GLOBAL::g_procWndInfo.vtWndInfo.begin(); it != GLOBAL::g_procWndInfo.vtWndInfo.end(); it++ )
  227. {
  228. if ( _tcscmp(_T("TfrmDemo"), it->szClassName) == 0 )
  229. {
  230. g_hWnd_SN_Combobox = (++it)->hWnd;
  231. break;
  232. }
  233. }
  234. // SN Edit && Tester;
  235. for(std::vector<GLOBAL::WND_INFO>::iterator it = GLOBAL::g_procWndInfo.vtWndInfo.begin(); it != GLOBAL::g_procWndInfo.vtWndInfo.end(); it++ )
  236. {
  237. if ( !_tcscmp(_T("OCC"), it->szWndTitle) && !_tcscmp(_T("TCheckBox"), it->szClassName) )
  238. {
  239. g_hWnd_SN = (--it)->hWnd;
  240. g_hWnd_Tester = (--it)->hWnd;
  241. break;
  242. }
  243. }
  244. // Channel Edit;
  245. for(std::vector<GLOBAL::WND_INFO>::iterator it = GLOBAL::g_procWndInfo.vtWndInfo.begin(); it != GLOBAL::g_procWndInfo.vtWndInfo.end(); it++ )
  246. {
  247. if ( !_tcscmp(_T("Connect CA310"), it->szWndTitle) && !_tcscmp(_T("TButton"), it->szClassName) )
  248. {
  249. g_hWnd_Channel = (--it)->hWnd;
  250. break;
  251. }
  252. }
  253. // FW Version;
  254. for(std::vector<GLOBAL::WND_INFO>::iterator it = GLOBAL::g_procWndInfo.vtWndInfo.begin(); it != GLOBAL::g_procWndInfo.vtWndInfo.end(); it++ )
  255. {
  256. if ( !_tcscmp(_T("FS2"), it->szWndTitle) && !_tcscmp(_T("TCheckBox"), it->szClassName) )
  257. {
  258. g_hWnd_FWVersion = (--it)->hWnd;
  259. break;
  260. }
  261. }
  262. #ifdef _DEBUG
  263. TCHAR szMsg[MAX_PATH] = {0};
  264. //_stprintf(szMsg, _T("Channel=%08X, SN=%08X, Combobox=%08X, Tester=%08X, FWVersion=%08X\n"), g_hWnd_Channel, g_hWnd_SN, g_hWnd_SN_Combobox, g_hWnd_Tester, g_hWnd_FWVersion);
  265. _stprintf(szMsg, _T("Channel=%ld, SN=%ld, Combobox=%ld, Tester=%ld, FWVersion=%ld\n"), g_hWnd_Channel, g_hWnd_SN, g_hWnd_SN_Combobox, g_hWnd_Tester, g_hWnd_FWVersion);
  266. //TRACE(szMsg);
  267. GLOBAL::WriteTextLog(szMsg);
  268. #endif
  269. }
  270. void COGCAssistToolDlg::OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult)
  271. {
  272. // TODO: 在此添加控件通知处理程序代码
  273. m_pDialog[m_CurSelTab]->ShowWindow(SW_HIDE);
  274. //得到新的页面
  275. m_CurSelTab = m_tabCtrl.GetCurSel();
  276. //把新的页面显示出来
  277. m_pDialog[m_CurSelTab]->ShowWindow(SW_SHOW);
  278. m_pDialog[m_CurSelTab]->UpdateData(TRUE);
  279. *pResult = 0;
  280. }
  281. BOOL COGCAssistToolDlg::DestroyWindow()
  282. {
  283. // TODO: 在此添加专用代码和/或调用基类
  284. for ( int i = 0; i < 4; i++ )
  285. {
  286. delete m_pDialog[i];
  287. m_pDialog[i] = NULL;
  288. }
  289. return CDialogEx::DestroyWindow();
  290. }
  291. void COGCAssistToolDlg::OnTimer(UINT_PTR nIDEvent)
  292. {
  293. // TODO: 在此添加消息处理程序代码和/或调用默认值
  294. switch (nIDEvent)
  295. {
  296. case 0:
  297. {
  298. // OGC启动时间较长(5~7秒,根据电脑性能决定),需要判断窗口是否完全显示出来;
  299. if ( FindWindow(_T("TApplication"), _T("Demo")) && FindWindow(_T("TfrmDemo"), _T("(TPV 2021/09/29) UHD Series OGC Tool V2.21.1.3")) )
  300. {
  301. Sleep(1200); // 再等多会;
  302. GLOBAL::EnumProcessAllWnd(&GLOBAL::g_procWndInfo);
  303. if ( !GLOBAL::g_bInjected )
  304. {
  305. TCHAR szDll[MAX_PATH] = {0};
  306. _stprintf(szDll, _T("%s%s"), GLOBAL::g_szModulePath, _T("OGCAssist.dll"));
  307. g_Injection.setInjectionObj(GLOBAL::g_procWndInfo.dwProcId, szDll);
  308. // 需要查找OGCAssist.dll是否在目录进程内;
  309. if ( GLOBAL::GetModulePath(_T("OGCAssist.dll"), GLOBAL::g_procWndInfo.dwProcId) )
  310. {
  311. GLOBAL::g_bInjected = TRUE;
  312. }
  313. else
  314. {
  315. GLOBAL::g_bInjected = g_Injection.InjectDynamicLibrary();
  316. }
  317. }
  318. // 附加窗口句柄;
  319. FetchOGCWnd();
  320. #pragma region 隐藏窗口;
  321. HWND hWnd = NULL;
  322. if ( hWnd = MyFindWindow(_T("TfrmDemo")) )
  323. ::ShowWindow(hWnd, SW_HIDE);
  324. if ( hWnd = MyFindWindow(_T("TApplication")) )
  325. ::ShowWindow(hWnd, SW_HIDE);
  326. #pragma endregion
  327. #pragma region 进程通信:请求状态;
  328. #pragma endregion
  329. KillTimer(nIDEvent);
  330. }
  331. }
  332. break;
  333. default:
  334. break;
  335. }
  336. CDialogEx::OnTimer(nIDEvent);
  337. }