Dlg4.cpp
上传用户:tree100901
上传日期:2016-07-12
资源大小:182k
文件大小:10k
源码类别:

外挂编程

开发平台:

Visual C++

  1. // Dlg4.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "WarH.h"
  5. #include "Register.h"
  6. #include "Dlg4.h"
  7. #include "YZFindFile.h"
  8. HRESULT CreateLink(LPCWSTR lpszPathObj, LPWSTR lpszPathLink, LPWSTR lpszDesc);
  9. HRESULT GetDesktop(LPWSTR lpPath, DWORD* lpSize);
  10. // CDlg4 对话框
  11. IMPLEMENT_DYNAMIC(CDlg4, CDialog)
  12. CDlg4::CDlg4(CWnd* pParent /*=NULL*/)
  13. : CDialog(CDlg4::IDD, pParent)
  14. , m_strPath(_T(""))
  15. , m_strParam(_T(""))
  16. , m_bWindows(FALSE)
  17. , m_bOpenGL(FALSE)
  18. , m_bLink(FALSE)
  19. , m_bAutoRun(FALSE)
  20. {
  21. }
  22. CDlg4::~CDlg4()
  23. {
  24. }
  25. void CDlg4::DoDataExchange(CDataExchange* pDX)
  26. {
  27. CDialog::DoDataExchange(pDX);
  28. DDX_Text(pDX, IDC_PATH, m_strPath);
  29. DDX_Text(pDX, IDC_COMLINE, m_strParam);
  30. DDX_Check(pDX, IDC_WINDOW, m_bWindows);
  31. DDX_Check(pDX, IDC_OPENGL, m_bOpenGL);
  32. DDX_Check(pDX, IDC_CHECK4, m_bLink);
  33. DDX_Check(pDX, IDC_AUTORUN, m_bAutoRun);
  34. }
  35. BEGIN_MESSAGE_MAP(CDlg4, CDialog)
  36. ON_WM_CTLCOLOR()
  37. ON_WM_SHOWWINDOW()
  38. ON_BN_CLICKED(IDC_SEARCH, &CDlg4::OnBnClickedSearch)
  39. ON_BN_CLICKED(IDC_RUN, &CDlg4::OnBnClickedRun)
  40. ON_BN_CLICKED(IDC_WINDOW, &CDlg4::OnBnClickedWindow)
  41. ON_BN_CLICKED(IDC_OPENGL, &CDlg4::OnBnClickedOpengl)
  42. ON_BN_CLICKED(IDC_SAVE, &CDlg4::OnBnClickedSave)
  43. ON_BN_CLICKED(IDC_READ, &CDlg4::OnBnClickedRead)
  44. ON_BN_CLICKED(IDC_CHECK4, &CDlg4::OnBnClickedCheck4)
  45. ON_BN_CLICKED(IDC_LastReplay, &CDlg4::OnBnClickedLastreplay)
  46. ON_BN_CLICKED(IDC_AUTORUN, &CDlg4::OnBnClickedAutorun)
  47. ON_BN_CLICKED(IDC_SEARCHFILE, &CDlg4::OnBnClickedSearchfile)
  48. END_MESSAGE_MAP()
  49. // CDlg4 消息处理程序
  50. HBRUSH CDlg4::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  51. {
  52. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  53. // TODO:  在此更改 DC 的任何属性
  54. int nID = pWnd->GetDlgCtrlID();
  55. switch (nID)
  56. {
  57. case IDC_STATIC:
  58. case IDC_PATH:
  59. case IDC_COMLINE:
  60. pDC->SetTextColor(RGB(255, 0, 0));
  61. break;
  62. case IDC_STATICB:
  63. pDC->SetTextColor(RGB(0, 0, 255));
  64. break;
  65. }
  66. // TODO:  如果默认的不是所需画笔,则返回另一个画笔
  67. return hbr;
  68. }
  69. void CDlg4::OnShowWindow(BOOL bShow, UINT nStatus)
  70. {
  71. CDialog::OnShowWindow(bShow, nStatus);
  72. // TODO: 在此处添加消息处理程序代码
  73. OnBnClickedRead();
  74. }
  75. void CDlg4::OnBnClickedSearch()
  76. {
  77. // TODO: 在此添加控件通知处理程序代码
  78. CFileDialog fileDlg(true, _T(""), _T("War3.exe"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
  79. _T("魔兽可执行文件(War3.exe)|War3.exe||"));
  80. if (fileDlg.DoModal() == IDOK)
  81. {
  82. m_strPath = fileDlg.GetPathName();
  83. UpdateData(false);
  84. }
  85. }
  86. void CDlg4::OnBnClickedRun()
  87. {
  88. // TODO: 在此添加控件通知处理程序代码
  89. UpdateData();
  90. STARTUPINFO si;
  91.     PROCESS_INFORMATION pi;
  92.     ZeroMemory( &si, sizeof(si) );
  93.     si.cb = sizeof(si);
  94.     ZeroMemory( &pi, sizeof(pi) );
  95. CString strCommandline;
  96. strCommandline = m_strPath + ' ' + m_strParam;
  97.     // Start the child process. 
  98.     if( !CreateProcess( NULL,       // No module name (use command line). 
  99.         strCommandline.GetBuffer(), // Command line. 
  100.         NULL,             // Process handle not inheritable. 
  101.         NULL,             // Thread handle not inheritable. 
  102.         FALSE,            // Set handle inheritance to FALSE. 
  103.         0,                // No creation flags. 
  104.         NULL,             // Use parent's environment block. 
  105.         NULL,             // Use parent's starting directory. 
  106.         &si,              // Pointer to STARTUPINFO structure.
  107.         &pi )             // Pointer to PROCESS_INFORMATION structure.
  108.     ) 
  109.     {
  110. MessageBox(_T("路征不对吧!"));
  111.         return;
  112.     }
  113. }
  114. void CDlg4::OnBnClickedWindow()
  115. {
  116. // TODO: 在此添加控件通知处理程序代码
  117. UpdateData(1);
  118. if (m_bWindows)
  119. {
  120. if (m_strParam.Find(_T("-windows")) == -1)
  121. {
  122. m_strParam += "-windows ";
  123. }
  124. }
  125. else
  126. {
  127. int index = m_strParam.Find(_T("-windows"));
  128. if (index != -1)
  129. {
  130. m_strParam.Delete(index, 9);
  131. }
  132. }
  133. UpdateData(0);
  134. }
  135. void CDlg4::OnBnClickedOpengl()
  136. {
  137. // TODO: 在此添加控件通知处理程序代码
  138. UpdateData(1);
  139. if (m_bOpenGL)
  140. {
  141. if (m_strParam.Find(_T("-opengl")) == -1)
  142. {
  143. m_strParam += "-opengl ";
  144. }
  145. }
  146. else
  147. {
  148. int index = m_strParam.Find(_T("-opengl"));
  149. if (index != -1)
  150. {
  151. m_strParam.Delete(index, 8);
  152. }
  153. }
  154. UpdateData(0);
  155. }
  156. void CDlg4::OnBnClickedLastreplay()
  157. {
  158. // TODO: 在此添加控件通知处理程序代码
  159. UpdateData(1);
  160. CString str;
  161. str =_T("-loadfile "") + str + m_strPath;
  162. str.Replace(_T("War3.exe"), _T("replay\LastReplay.w3g" "));
  163. if (::IsDlgButtonChecked(m_hWnd, IDC_LastReplay))
  164. {
  165. if (m_strParam.Find(str) == -1)
  166. {
  167. m_strParam = str + m_strParam;
  168. }
  169. }
  170. else
  171. {
  172. int index = m_strParam.Find(str);
  173. if (index != -1)
  174. {
  175. m_strParam.Delete(index, str.GetLength());
  176. }
  177. }
  178. UpdateData(0);
  179. }
  180. void CDlg4::OnBnClickedSave()
  181. {
  182. // TODO: 在此添加控件通知处理程序代码
  183. UpdateData(1);
  184. BOOL bResult = TRUE;
  185. CRegister reg;
  186. bResult = bResult && reg.CreateKeyW(HKEY_CURRENT_USER, _T("Software\Blizzard Entertainment\Warcraft III\WarH"));
  187. bResult = bResult && reg.SetValueExExW(_T("War3Path"), REG_SZ, (LPBYTE)m_strPath.GetBuffer(), wcslen(m_strPath.GetBuffer()) * sizeof(TCHAR));
  188. bResult = bResult && reg.SetValueExExW(_T("Param"), REG_SZ, (LPBYTE)m_strParam.GetBuffer(), wcslen(m_strParam.GetBuffer()) * sizeof(TCHAR));
  189. bResult = bResult && reg.SetValueExExA("bWindows", REG_BINARY, (LPBYTE)&m_bWindows, sizeof(BYTE));
  190. bResult = bResult && reg.SetValueExExA("bOpenGL", REG_BINARY, (LPBYTE)&m_bOpenGL, sizeof(BYTE));
  191. bResult = bResult && reg.SetValueExExA("bAutoRun", REG_BINARY, (LPBYTE)&m_bAutoRun, sizeof(BYTE));
  192. if (bResult)
  193. {
  194. MessageBox(_T("保存成功!"), _T("消息:)"), MB_OK);
  195. }
  196. }
  197. void CDlg4::OnBnClickedRead()
  198. {
  199. // TODO: 在此添加控件通知处理程序代码
  200. static BYTE szPath[MAX_PATH];
  201. static BYTE szParam[MAX_PATH];
  202. memset(szPath, 0, MAX_PATH);
  203. memset(szParam, 0, MAX_PATH);
  204. CRegister reg;
  205. reg.OpenKeyEx(HKEY_CURRENT_USER, _T("Software\Blizzard Entertainment\Warcraft III\WarH"));
  206. reg.QueryValueExW(_T("War3Path"), szPath, MAX_PATH);
  207. reg.QueryValueExW(_T("Param"), szParam, MAX_PATH);
  208. reg.QueryValueExA("bWindows", (LPBYTE)&m_bWindows, 4);
  209. reg.QueryValueExA("bOpenGL", (LPBYTE)&m_bOpenGL, 4);
  210. reg.QueryValueExA("bAutoRun", (LPBYTE)&m_bAutoRun, 4);
  211. m_strPath.Format((LPWSTR)szPath);
  212. m_strParam.Format((LPWSTR)szParam);
  213. UpdateData(0);
  214. }
  215. void CDlg4::OnBnClickedCheck4()
  216. {
  217. // TODO: 在此添加控件通知处理程序代码
  218. wchar_t chDir[512];
  219. DWORD size;
  220. UpdateData();
  221. GetDesktop(chDir, &size);
  222.   
  223. wcscat(chDir, _T("\Frozen Throne.lnk"));
  224. if (m_bLink)
  225. {
  226. CString str = m_strPath;
  227. str.Replace(_T("War3"), _T("Frozen Throne"));
  228. CreateLink(str.GetBuffer(), chDir, _T("魔兽快捷方式"));
  229. }
  230. else
  231. {
  232. SHFILEOPSTRUCT fileOp;  
  233. ZeroMemory(&fileOp, sizeof(fileOp)) ;
  234. fileOp.hwnd =  HWND_DESKTOP;     
  235. fileOp.wFunc = FO_DELETE; 
  236. fileOp.pFrom = chDir; 
  237. fileOp.fFlags = FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS ; // 删除文件到回收站
  238. SHFileOperation(&fileOp);
  239. }
  240. }
  241. HRESULT GetDesktop(LPWSTR lpPath, DWORD* lpSize)
  242. {
  243. long result;
  244. HKEY hKey;     
  245. DWORD dwType;
  246. result = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"),
  247. NULL, KEY_QUERY_VALUE,&hKey);
  248. if(result == ERROR_SUCCESS)
  249. {
  250. // 查询Desktop的键值并把查询到的结果保存在字符串“chDir”中(因为Windows并不一定安装在c盘中,所以要查询注册表)
  251. result = RegQueryValueEx(hKey,_T("Desktop"),0,&dwType,(LPBYTE)lpPath,lpSize);
  252. result = RegCloseKey(hKey); 
  253. }
  254. return result;
  255. }
  256. HRESULT CreateLink(LPCWSTR lpszPathObj, LPWSTR lpszPathLink, LPWSTR lpszDesc)
  257. {
  258. HRESULT hres;
  259. IShellLink* psl;
  260. CoInitialize(NULL);   
  261. //   Get   a   pointer   to   the   IShellLink   interface.   
  262. hres = CoCreateInstance(CLSID_ShellLink, NULL,   
  263. CLSCTX_INPROC_SERVER,   
  264. IID_IShellLink,   
  265. (void**)&psl);   
  266. if (SUCCEEDED(hres))
  267. {   
  268. IPersistFile* ppf;   
  269. //   Set   the   path   to   the   shortcut   target   and   add   the   
  270. //   description.   
  271. psl->SetPath(lpszPathObj);   
  272. psl->SetDescription(lpszDesc);   
  273. //   Query   IShellLink   for   the   IPersistFile   interface   for   saving   the   
  274. //   shortcut   in   persistent   storage.   
  275. hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);   
  276. if (SUCCEEDED(hres))   
  277. {   
  278. wchar_t wsz[MAX_PATH];   //   Ensure   that   the   string   is   ANSI.   
  279. //MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH);   
  280. //   Save   the   link   by   calling   IPersistFile::Save.   
  281. hres = ppf->Save(lpszPathLink, TRUE);   
  282. ppf->Release();   
  283. }   
  284. psl->Release();
  285. }   
  286. return   hres;   
  287. }
  288. void CDlg4::OnBnClickedAutorun()
  289. {
  290. // TODO: 在此添加控件通知处理程序代码
  291. UpdateData();
  292. HKEY hKey;
  293. DWORD dwType;
  294. LONG result;
  295. TCHAR wsBuf[MAX_PATH];
  296. memset(wsBuf, 0, MAX_PATH * 2);
  297. result = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\Microsoft\Windows\CurrentVersion\Run"),
  298. NULL, KEY_ALL_ACCESS, &hKey);
  299. if (result == ERROR_SUCCESS)
  300. {
  301. if (m_bAutoRun)
  302. {
  303. ::GetCurrentDirectoryW(MAX_PATH, wsBuf);
  304. wsprintf(wsBuf, _T("%s%s"), wsBuf, _T("\WarH.exe"));
  305. RegSetValueExW(hKey, _T("WarH V1.12"), NULL, REG_SZ, (LPBYTE)wsBuf, wcslen(wsBuf) * sizeof(TCHAR));
  306. }
  307. else
  308. {
  309. ::RegDeleteKeyW(hKey, _T("WarH V1.12"));
  310. }
  311. }
  312. }
  313. void CALLBACK ShowPath(LPTSTR lpStr)
  314. {
  315. HWND hWnd = ::AfxGetApp()->m_pMainWnd->GetSafeHwnd();
  316. ::SetWindowText(hWnd, lpStr);
  317. }
  318. void CDlg4::OnBnClickedSearchfile()
  319. {
  320. // TODO: 在此添加控件通知处理程序代码
  321. UpdateData(TRUE);
  322. BROWSEINFO bi;
  323. TCHAR szDispName[MAX_PATH + 1];
  324. memset(&bi, 0, sizeof(BROWSEINFO));
  325. bi.hwndOwner = m_hWnd;
  326. bi.pszDisplayName = szDispName;
  327. bi.ulFlags = BIF_BROWSEINCLUDEFILES + BIF_EDITBOX;
  328. bi.lpszTitle = _T("Please select the folder u want to search:");
  329. if(ITEMIDLIST *iil = SHBrowseForFolder(&bi))
  330. {
  331. SHGetPathFromIDList(iil, szDispName);
  332. if (!SearchFile(_T("War3.exe"), szDispName, m_strPath.GetBuffer(MAX_PATH), ShowPath))
  333. {
  334. m_strPath = _T("");
  335. MessageBox(_T("no find"));
  336. }
  337. UpdateData(FALSE);
  338. }
  339. }