InjectDLLDlg.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. // InjectDLLDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "InjectDLL.h"
  5. #include "InjectDLLDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #endif
  9. // OGC Tool无序句柄;
  10. HWND g_hWnd_SN = NULL;
  11. HWND g_hWnd_SN_Combobox = NULL;
  12. HWND g_hWnd_Tester = NULL;
  13. HWND g_hWnd_FWVersion = NULL;
  14. HWND g_hWnd_Channel = NULL;
  15. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  16. class CAboutDlg : public CDialog
  17. {
  18. public:
  19. CAboutDlg();
  20. // 对话框数据
  21. enum { IDD = IDD_ABOUTBOX };
  22. protected:
  23. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  24. // 实现
  25. protected:
  26. DECLARE_MESSAGE_MAP()
  27. };
  28. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  29. {
  30. }
  31. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  32. {
  33. CDialog::DoDataExchange(pDX);
  34. }
  35. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  36. END_MESSAGE_MAP()
  37. // CInjectDLLDlg 对话框
  38. CInjectDLLDlg::CInjectDLLDlg(CWnd* pParent /*=NULL*/)
  39. : CDialog(CInjectDLLDlg::IDD, pParent)
  40. {
  41. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  42. }
  43. void CInjectDLLDlg::DoDataExchange(CDataExchange* pDX)
  44. {
  45. CDialog::DoDataExchange(pDX);
  46. DDX_Control(pDX, COMBO_PROCESS, m_cbProcess);
  47. DDX_Control(pDX, COMBOX_BTN_NAME, m_cbBtnName);
  48. }
  49. BEGIN_MESSAGE_MAP(CInjectDLLDlg, CDialog)
  50. ON_WM_SYSCOMMAND()
  51. ON_WM_PAINT()
  52. ON_WM_QUERYDRAGICON()
  53. //}}AFX_MSG_MAP
  54. ON_BN_CLICKED(BTN_INJECT, &CInjectDLLDlg::OnBnClickedInject)
  55. ON_BN_CLICKED(BTN_EJECT, &CInjectDLLDlg::OnBnClickedEject)
  56. ON_BN_CLICKED(BTN_REFLESH, &CInjectDLLDlg::OnBnClickedReflesh)
  57. ON_BN_CLICKED(BTN_HIDE_WND, &CInjectDLLDlg::OnBnClickedHideWnd)
  58. ON_BN_CLICKED(BTN_SHOW_WND, &CInjectDLLDlg::OnBnClickedShowWnd)
  59. ON_BN_CLICKED(BTN_TEST, &CInjectDLLDlg::OnBnClickedTest)
  60. ON_BN_CLICKED(BTN_SETDATA, &CInjectDLLDlg::OnBnClickedSetdata)
  61. END_MESSAGE_MAP()
  62. // CInjectDLLDlg 消息处理程序
  63. BOOL CInjectDLLDlg::OnInitDialog()
  64. {
  65. CDialog::OnInitDialog();
  66. // 将“关于...”菜单项添加到系统菜单中。
  67. // IDM_ABOUTBOX 必须在系统命令范围内。
  68. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  69. ASSERT(IDM_ABOUTBOX < 0xF000);
  70. CMenu* pSysMenu = GetSystemMenu(FALSE);
  71. if (pSysMenu != NULL)
  72. {
  73. BOOL bNameValid;
  74. CString strAboutMenu;
  75. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  76. ASSERT(bNameValid);
  77. if (!strAboutMenu.IsEmpty())
  78. {
  79. pSysMenu->AppendMenu(MF_SEPARATOR);
  80. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  81. }
  82. }
  83. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  84. // 执行此操作
  85. SetIcon(m_hIcon, TRUE); // 设置大图标
  86. SetIcon(m_hIcon, FALSE); // 设置小图标
  87. // TODO: 在此添加额外的初始化代码
  88. InitCommbox();
  89. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  90. }
  91. void CInjectDLLDlg::OnSysCommand(UINT nID, LPARAM lParam)
  92. {
  93. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  94. {
  95. CAboutDlg dlgAbout;
  96. dlgAbout.DoModal();
  97. }
  98. else
  99. {
  100. CDialog::OnSysCommand(nID, lParam);
  101. }
  102. }
  103. // 如果向对话框添加最小化按钮,则需要下面的代码
  104. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  105. // 这将由框架自动完成。
  106. void CInjectDLLDlg::OnPaint()
  107. {
  108. if (IsIconic())
  109. {
  110. CPaintDC dc(this); // 用于绘制的设备上下文
  111. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  112. // 使图标在工作区矩形中居中
  113. int cxIcon = GetSystemMetrics(SM_CXICON);
  114. int cyIcon = GetSystemMetrics(SM_CYICON);
  115. CRect rect;
  116. GetClientRect(&rect);
  117. int x = (rect.Width() - cxIcon + 1) / 2;
  118. int y = (rect.Height() - cyIcon + 1) / 2;
  119. // 绘制图标
  120. dc.DrawIcon(x, y, m_hIcon);
  121. }
  122. else
  123. {
  124. CDialog::OnPaint();
  125. }
  126. }
  127. //当用户拖动最小化窗口时系统调用此函数取得光标
  128. //显示。
  129. HCURSOR CInjectDLLDlg::OnQueryDragIcon()
  130. {
  131. return static_cast<HCURSOR>(m_hIcon);
  132. }
  133. void CInjectDLLDlg::OnBnClickedInject()
  134. {
  135. // TODO: 在此添加控件通知处理程序代码
  136. CString strInjectDLL = OpenInectDLL();
  137. INT nCurSel = m_cbProcess.GetCurSel();
  138. if ( nCurSel == CB_ERR )
  139. {
  140. MessageBox(_T("请选择要注入的进程"), _T("提醒"), MB_ICONWARNING);
  141. return;
  142. }
  143. ProInfo *ptr = (ProInfo*)m_cbProcess.GetItemDataPtr(nCurSel);
  144. if ( ptr )
  145. {
  146. if ( m_Inject.GetInjectProcess() )
  147. {
  148. m_Inject.EjectDynamicLibrary();
  149. }
  150. m_Inject.setInjectionObj(ptr->dwProId, strInjectDLL.GetString());
  151. m_Inject.InjectDynamicLibrary();
  152. }
  153. }
  154. void CInjectDLLDlg::OnBnClickedEject()
  155. {
  156. // TODO: 在此添加控件通知处理程序代码
  157. if ( m_Inject.GetInjectProcess() )
  158. {
  159. m_Inject.EjectDynamicLibrary();
  160. }
  161. }
  162. void CInjectDLLDlg::InitCommbox()
  163. {
  164. m_vtProInfo.clear();
  165. m_cbProcess.ResetContent();
  166. m_wndData.vtWndInfo.clear();
  167. // 获取全部进程到Commbox;
  168. FindAllProcess(m_vtProInfo);
  169. int nIndex = 0;
  170. TCHAR szName[MAX_PATH] = {0};
  171. for (std::vector<ProInfo>::iterator it = m_vtProInfo.begin(); it != m_vtProInfo.end(); it++ )
  172. {
  173. _stprintf(szName, _T("%s %ld"), it->strProName.c_str(),it->dwProId);
  174. nIndex = m_cbProcess.AddString(szName);
  175. m_cbProcess.SetItemDataPtr(nIndex, &*it);
  176. #ifdef _DEBUG
  177. TRACE3("%ld-%s:%p\n", it->dwProId, it->strProName.c_str(), *it);
  178. #endif
  179. }
  180. if ( (nIndex = m_cbProcess.SelectString(0, _T("Demo"))) != -1 )
  181. {
  182. ProInfo *ptr = (ProInfo*)m_cbProcess.GetItemDataPtr(nIndex);
  183. if ( ptr )
  184. {
  185. m_wndData.dwPid = ptr->dwProId;
  186. EnumProcessAllWnd(&m_wndData);
  187. for (std::vector<WNDINFO>::iterator it = m_wndData.vtWndInfo.begin(); it != m_wndData.vtWndInfo.end(); it++ )
  188. {
  189. if ( _tcscmp(it->szClassName, _T("TButton")) == 0 )
  190. {
  191. m_cbBtnName.AddString(it->szWndTitle);
  192. }
  193. }
  194. }
  195. }
  196. FetchOGCWnd();
  197. }
  198. CString CInjectDLLDlg::OpenInectDLL()
  199. {
  200. CString strInjectDLL = _T("");
  201. CFileDialog dlg(TRUE, _T("DLL"), _T("*.DLL"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("要注入的DLL (*.dll)|*.dll||"));
  202. if ( dlg.DoModal() == IDOK )
  203. {
  204. strInjectDLL = dlg.GetPathName();
  205. }
  206. return strInjectDLL;
  207. }
  208. void CInjectDLLDlg::OnBnClickedReflesh()
  209. {
  210. // TODO: 在此添加控件通知处理程序代码
  211. InitCommbox();
  212. }
  213. BOOL ShowInTaskbar(HWND hWnd, BOOL bShow)
  214. {
  215. HRESULT hr;
  216. ITaskbarList* pTaskbarList;
  217. hr = CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER,
  218. IID_ITaskbarList, (void**)&pTaskbarList );
  219. if(SUCCEEDED(hr))
  220. {
  221. pTaskbarList->HrInit();
  222. if(bShow)
  223. pTaskbarList->AddTab(hWnd);
  224. else
  225. pTaskbarList->DeleteTab(hWnd);
  226. pTaskbarList->Release();
  227. return TRUE;
  228. }
  229. return FALSE;
  230. }
  231. HWND g_hCurrentProWnd = NULL;
  232. HWND g_hCurrentProWnd2 = NULL;
  233. void CInjectDLLDlg::OnBnClickedHideWnd()
  234. {
  235. // TODO: 在此添加控件通知处理程序代码
  236. INT nCurSel = m_cbProcess.GetCurSel();
  237. if ( nCurSel == CB_ERR )
  238. {
  239. MessageBox(_T("请选择要隐藏窗口的进程"), _T("提醒"), MB_ICONWARNING);
  240. return;
  241. }
  242. HWND hWnd = NULL;
  243. if ( hWnd = FindWindow(_T("TfrmDemo")) )
  244. ::ShowWindow(hWnd, SW_HIDE);
  245. if ( hWnd = FindWindow(_T("TApplication")) )
  246. ::ShowWindow(hWnd, SW_HIDE);
  247. }
  248. HWND CInjectDLLDlg::FindWindow(LPCTSTR lpClassName)
  249. {
  250. HWND hWnd = NULL;
  251. if ( lpClassName == NULL || lpClassName[0] == '\0' )
  252. return hWnd;
  253. for (std::vector<WNDINFO>::iterator it = m_wndData.vtWndInfo.begin(); it != m_wndData.vtWndInfo.end(); it++ )
  254. {
  255. // 返回第一个找到的类名;
  256. if ( _tcscmp(lpClassName, it->szClassName) == 0 )
  257. {
  258. hWnd = it->hWnd;
  259. break;
  260. }
  261. }
  262. return hWnd;
  263. }
  264. void CInjectDLLDlg::OnBnClickedShowWnd()
  265. {
  266. // TODO: 在此添加控件通知处理程序代码
  267. INT nCurSel = m_cbProcess.GetCurSel();
  268. if ( nCurSel == CB_ERR )
  269. {
  270. MessageBox(_T("请选择要显示窗口的进程"), _T("提醒"), MB_ICONWARNING);
  271. return;
  272. }
  273. HWND hWnd = NULL;
  274. if ( hWnd = FindWindow(_T("TfrmDemo")) )
  275. ::ShowWindow(hWnd, SW_SHOW);
  276. if ( hWnd = FindWindow(_T("TApplication")) )
  277. ::ShowWindow(hWnd, SW_SHOW);
  278. }
  279. void CInjectDLLDlg::OnBnClickedTest()
  280. {
  281. TCHAR szBtnName[MAX_PATH] = {0};
  282. INT nCurSel = m_cbBtnName.GetCurSel();
  283. if ( nCurSel == CB_ERR )
  284. {
  285. MessageBox(_T("请选择要测试的按钮名称"), _T("提醒"), MB_ICONWARNING);
  286. return;
  287. }
  288. m_cbBtnName.GetLBText(nCurSel, szBtnName);
  289. // TODO: 在此添加控件通知处理程序代码
  290. HWND hWnd = NULL;
  291. for ( std::vector<WNDINFO>::iterator it = m_wndData.vtWndInfo.begin(); it != m_wndData.vtWndInfo.end(); it++ )
  292. {
  293. if ( _tcscmp(it->szWndTitle, szBtnName) == 0 )
  294. {
  295. hWnd = it->hWnd;
  296. break;
  297. }
  298. }
  299. if ( hWnd )
  300. {
  301. ::PostMessage(hWnd, WM_LBUTTONDOWN, 0, 0);
  302. Sleep(20);
  303. ::PostMessage(hWnd, WM_LBUTTONUP, 0, 0);
  304. }
  305. else
  306. {
  307. AfxMessageBox(_T("没有找到控件句柄"));
  308. }
  309. }
  310. void CInjectDLLDlg::OnBnClickedSetdata()
  311. {
  312. // TODO: 在此添加控件通知处理程序代码
  313. UINT dwAddr = GetDlgItemInt(TX_ID);
  314. TCHAR szData[MAX_PATH] = {0};
  315. GetDlgItemText(TX_DATA, szData, MAX_PATH);
  316. BOOL bIsDropList = ((CButton*)GetDlgItem(CH_DROPLIST))->GetCheck();
  317. if ( dwAddr != -1 )
  318. {
  319. //WNDINFO &info = m_wndData.vtWndInfo.at(nID);
  320. //::SetWindowText(info.hWnd, szData); // 此方法:设置句柄文本失败;
  321. //::SendMessage(info.hWnd, WM_SETTEXT, 0, (LPARAM)&szData); // 此方法:设置句柄文本成功;
  322. if ( bIsDropList )
  323. ::SendMessage(HWND(dwAddr), CB_SELECTSTRING, 0, (LPARAM)&szData); // 此方法:设置句柄文本成功;
  324. else
  325. ::SendMessage(HWND(dwAddr), WM_SETTEXT, 0, (LPARAM)&szData); // 此方法:设置句柄文本成功;
  326. }
  327. }
  328. void CInjectDLLDlg::FetchOGCWnd()
  329. {
  330. // SN Combobox;
  331. for(std::vector<WNDINFO>::iterator it = m_wndData.vtWndInfo.begin(); it != m_wndData.vtWndInfo.end(); it++ )
  332. {
  333. if ( _tcscmp(_T("TfrmDemo"), it->szClassName) == 0 )
  334. {
  335. g_hWnd_SN_Combobox = (++it)->hWnd;
  336. break;
  337. }
  338. }
  339. // SN Edit && Tester;
  340. for(std::vector<WNDINFO>::iterator it = m_wndData.vtWndInfo.begin(); it != m_wndData.vtWndInfo.end(); it++ )
  341. {
  342. if ( !_tcscmp(_T("OCC"), it->szWndTitle) && !_tcscmp(_T("TCheckBox"), it->szClassName) )
  343. {
  344. g_hWnd_SN = (--it)->hWnd;
  345. g_hWnd_Tester = (--it)->hWnd;
  346. break;
  347. }
  348. }
  349. // Channel Edit;
  350. for(std::vector<WNDINFO>::iterator it = m_wndData.vtWndInfo.begin(); it != m_wndData.vtWndInfo.end(); it++ )
  351. {
  352. if ( !_tcscmp(_T("Connect CA310"), it->szWndTitle) && !_tcscmp(_T("TButton"), it->szClassName) )
  353. {
  354. g_hWnd_Channel = (--it)->hWnd;
  355. break;
  356. }
  357. }
  358. // FW Version;
  359. for(std::vector<WNDINFO>::iterator it = m_wndData.vtWndInfo.begin(); it != m_wndData.vtWndInfo.end(); it++ )
  360. {
  361. if ( !_tcscmp(_T("FS2"), it->szWndTitle) && !_tcscmp(_T("TCheckBox"), it->szClassName) )
  362. {
  363. g_hWnd_FWVersion = (--it)->hWnd;
  364. break;
  365. }
  366. }
  367. #ifdef _DEBUG
  368. TCHAR szMsg[MAX_PATH] = {0};
  369. //_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);
  370. _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);
  371. //TRACE(szMsg);
  372. WriteTextLog(szMsg);
  373. #endif
  374. }