OGCAssistToolDlg.cpp 10.0 KB

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