WinMain.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:13k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #include "stdafx.h"
  20. #include "LocalServer.h"
  21. #include "ChaosUI.h"
  22. #include "ChannelMenu.h"
  23. #include "MultiLanguageMgr.h"
  24. #include "About.h"
  25. volatile HINSTANCE g_hInstance = NULL;
  26. volatile HWND g_hMainWnd = NULL;
  27. const TCHAR g_sWndClassName[MAX_PATH] = _TEXT("MainWndCls");
  28. const TCHAR g_sWndName[MAX_PATH] = _TEXT("MainWindow");
  29. TCHAR g_sAppPath[MAX_PATH] = _T("");
  30. CChaosUI *g_pChaosUI = NULL;
  31. CLocalServer *g_pLocalServer = NULL;
  32. namespace {
  33. #include <Tlhelp32.h>
  34. void GetAndKillWMP()
  35. {
  36. HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
  37. if(hModuleSnap == INVALID_HANDLE_VALUE) 
  38. return ; 
  39. //  Set the size of the structure before using it. 
  40. PROCESSENTRY32 prc32;
  41. prc32.dwSize = sizeof(PROCESSENTRY32);
  42. prc32.cntUsage = 0;
  43. //  Retrieve information about the first module, 
  44. //  and exit if unsuccessful 
  45. if(!Process32First(hModuleSnap, &prc32)) { 
  46. CloseHandle(hModuleSnap);     // Must clean up the snapshot object! 
  47. return; 
  48. //  Now walk the module list of the process, 
  49. //  and display information about each module 
  50. DWORD wmpid = 0;
  51. do 
  52. {
  53. /* TCHAR tmp[MAX_PATH];
  54. TCHAR* dest = _tcsrchr(prc32.szExeFile, _T('\'));
  55. if(dest == NULL)
  56. continue;
  57. _tcscpy(tmp, dest + 1);*/
  58. if(_tcsicmp(prc32.szExeFile, _T("wmplayer.exe")) == 0)
  59. {
  60. wmpid = prc32.th32ProcessID;  // Find target module name
  61. break;
  62. }
  63. } while(Process32Next(hModuleSnap, &prc32)); 
  64. //  Do not forget to clean up the snapshot object. 
  65. CloseHandle(hModuleSnap);
  66. if(wmpid == 0)
  67. return;
  68. HANDLE hwmp = OpenProcess(PROCESS_TERMINATE | SYNCHRONIZE , FALSE, wmpid);
  69. if(hwmp == NULL)
  70. return;
  71. TerminateProcess(hwmp, 0);
  72. WaitForSingleObject(hwmp, 2000);
  73. CloseHandle(hwmp);
  74. }
  75. BOOL GetRegString(HKEY hkey, LPCTSTR regToBeGet, LPCTSTR valueName, LPTSTR pdata)
  76. {
  77. HKEY hkSub;
  78. DWORD dis;
  79. if(RegCreateKeyEx(hkey, regToBeGet, 0, _T(""), 0, 
  80. KEY_READ, NULL, &hkSub, &dis) != ERROR_SUCCESS)
  81. return FALSE;
  82. DWORD len = 0;
  83. if(RegQueryValueEx(hkSub, valueName, 0, NULL, NULL, &len) != ERROR_SUCCESS)
  84. return FALSE;
  85. if(RegQueryValueEx(hkSub, valueName, 0, NULL, (BYTE*)pdata, &len) != ERROR_SUCCESS)
  86. return FALSE;
  87. RegCloseKey(hkSub);
  88. return TRUE;
  89. }
  90. CString m_strBrowser;
  91. LPCTSTR GetBrowser(void)
  92. {
  93.   // Have we already got the browser?
  94.   if (m_strBrowser.IsEmpty())
  95.   {
  96.    // Get the default browser from HKCRhttpshellopencommand
  97.   BOOL ret = GetRegString(HKEY_CLASSES_ROOT, _T("http\shell\open\command"), NULL, m_strBrowser.GetBuffer(1024));
  98.   m_strBrowser.ReleaseBuffer();
  99.       if(!ret)  //fail, try another position: HKCRhtmlfileshellopencommand
  100.       {
  101.           ret = GetRegString(HKEY_CLASSES_ROOT, _T("http\htmlfile\shell\open\command"), NULL, m_strBrowser.GetBuffer(1024));
  102.           m_strBrowser.ReleaseBuffer();
  103.       }
  104.   // Do we have the browser?
  105.   if(!ret)  //fail again, we had to use a default string
  106.   {
  107.   m_strBrowser = _T("iexplore"); //use default string
  108.   return m_strBrowser;
  109.   }
  110.   //remove the quote in path
  111.   m_strBrowser.Remove('"');
  112.   int nIndex = m_strBrowser.ReverseFind('\');
  113.   if(nIndex > 0)
  114.   {
  115.      //script the total path of browser
  116.  int nSpace = m_strBrowser.Find(' ', nIndex);
  117.  if(nSpace > 0)
  118. m_strBrowser = m_strBrowser.Left(nSpace);  
  119.   }
  120.   }
  121.   return m_strBrowser;
  122. }
  123. void OnUpdate()
  124. {
  125. int ret = g_pLocalServer->GetChannelNum();
  126. if(ret != 0)
  127. {
  128. MultiLanguage LanguageDll;
  129. if(MessageBox(g_hMainWnd, LanguageDll.GetStringByStr(_T("更新程序将中断当前的播放过程,确定要更新吗?")), _T("Warning"), MB_YESNO | MB_ICONQUESTION) != IDYES)
  130. return;
  131. }
  132. TCHAR* updatepath = new TCHAR[MAX_PATH + 32];
  133. memset(updatepath, 0, sizeof(TCHAR)*(MAX_PATH+32));
  134. GetModuleFileName(NULL, updatepath, MAX_PATH);
  135. TCHAR* appendpos = _tcsrchr(updatepath, _T('\')) + 1;
  136. _tcscpy(appendpos, _T("xtvupdater.exe"));
  137. STARTUPINFO si;
  138. PROCESS_INFORMATION pi;
  139. ZeroMemory( &si, sizeof(si) );
  140. si.cb = sizeof(si);
  141. ZeroMemory( &pi, sizeof(pi) );
  142. CreateProcess(  // No module name (use command line). 
  143. updatepath,
  144. NULL, // 如果不需要强制升级,则使用/S参数避免显示升级界面
  145. NULL,             // Process handle not inheritable. 
  146. NULL,             // Thread handle not inheritable. 
  147. FALSE,            // Set handle inheritance to FALSE. 
  148. 0,                // No creation flags. 
  149. NULL,             // Use parent's environment block. 
  150. NULL,             // Use parent's starting directory. 
  151. &si,              // Pointer to STARTUPINFO structure.
  152. &pi )             // Pointer to PROCESS_INFORMATION structure.
  153. ;
  154. delete[] updatepath;
  155. }
  156. void OnHelp()
  157. {
  158. TCHAR* pbuffer = new TCHAR[1024];
  159. LoadString(g_hInstance, IDS_HELPURL, pbuffer, 1024);
  160. ShellExecute(NULL, NULL, GetBrowser() ,pbuffer, NULL, SW_SHOWNORMAL);
  161. delete[] pbuffer;
  162. }
  163. void OnHomePage()
  164. {
  165. TCHAR* pbuffer = new TCHAR[1024];
  166. LoadString(g_hInstance, IDS_HOMEPAGE, pbuffer, 1024);
  167. ShellExecute(NULL, NULL, GetBrowser() ,pbuffer, NULL, SW_SHOWNORMAL);
  168. delete[] pbuffer;
  169. }
  170. void    OnEmail()
  171. {
  172.     TCHAR* pbuffer = new TCHAR[1024];
  173. LoadString(g_hInstance, IDS_SUPPORTEMAIL, pbuffer, 1024);
  174. ShellExecute(NULL, NULL, pbuffer ,NULL, NULL, SW_SHOWNORMAL);
  175. delete[] pbuffer;
  176. }
  177. void    OnSelectNetWork()
  178. {
  179.     TCHAR* pbuffer = new TCHAR[1024];
  180. LoadString(g_hInstance, IDS_NETWORKSELECTURL, pbuffer, 1024);
  181. ShellExecute(NULL, NULL, GetBrowser() ,pbuffer, NULL, SW_SHOWNORMAL);
  182. delete[] pbuffer;
  183. }
  184. void OnAbout()
  185. {
  186. // CBalloonHelp::LaunchBalloon("adsfadf", "dafadf", CPoint(100, 100),  IDI_EXCLAMATION, CBalloonHelp::unSHOW_CLOSE_BUTTON,
  187. // g_hMainWnd);
  188. CAbout aboutdlg;
  189. }
  190. void OnExit()
  191. {
  192. int ret = g_pLocalServer->GetChannelNum();
  193. if(ret != 0)
  194. {
  195. MultiLanguage LanguageDll;
  196. MessageBox(g_hMainWnd, LanguageDll.GetStringByStr(_T("请关闭正在播放的内容后再退出。")), _T("Warning"), MB_OK | MB_ICONWARNING);
  197. }
  198. else
  199. {
  200. if(g_pChaosUI)
  201. g_pChaosUI->DeliverExit();
  202.         if(g_pLocalServer)
  203.         {
  204.             g_pLocalServer->Stop();
  205.             g_pLocalServer->FireExit();
  206.         }
  207. }
  208. }
  209. BOOL OnOpenChannel(DWORD cmdID)
  210. {
  211. LPCTSTR url = CChannelMenu::GetInstance()->GetChannelByCmdID(cmdID);
  212. if(url != NULL)
  213. {
  214.         //强行杀掉WMP进程等于让WMP非正常退出. 会导致下次启动WMP时禁用所有插件.所以取消掉
  215. // GetAndKillWMP();
  216. TCHAR* pplayerpath = new TCHAR[MAX_PATH];
  217. BOOL bOK = FALSE;
  218. if(GetRegString(HKEY_LOCAL_MACHINE, _T("SOFTWARE\Microsoft\Multimedia\WMPlayer"),
  219. _T("Player.Path"), pplayerpath))
  220. bOK = TRUE;
  221. else if(GetRegString(HKEY_LOCAL_MACHINE, _T("SOFTWARE\Microsoft\Multimedia\MPlayer2"),
  222. _T("Player.Path"), pplayerpath))
  223. bOK = TRUE;
  224. if(!bOK)
  225. {
  226. MultiLanguage langDll;
  227. MessageBox(g_hMainWnd, langDll.GetStringByStr(_T("找不到windows media player播放器")),
  228. langDll.GetStringByStr(_T("错误")), MB_OK);
  229. return TRUE;
  230. }
  231. STARTUPINFO si;
  232. PROCESS_INFORMATION pi;
  233. ZeroMemory( &si, sizeof(si) );
  234. si.cb = sizeof(si);
  235. ZeroMemory( &pi, sizeof(pi) );
  236. TCHAR* tmpurl = new TCHAR[1024];
  237. tmpurl[0] = _T(' ');
  238. _tcscpy(tmpurl + 1, url);
  239. CreateProcess(  // No module name (use command line). 
  240. pplayerpath,
  241. tmpurl, // cmdLIne
  242. NULL,             // Process handle not inheritable. 
  243. NULL,             // Thread handle not inheritable. 
  244. FALSE,            // Set handle inheritance to FALSE. 
  245. 0,                // No creation flags. 
  246. NULL,             // Use parent's environment block. 
  247. NULL,             // Use parent's starting directory. 
  248. &si,              // Pointer to STARTUPINFO structure.
  249. &pi )             // Pointer to PROCESS_INFORMATION structure.
  250. ;
  251. delete[] tmpurl;
  252. delete[] pplayerpath;
  253. return TRUE;
  254. }
  255. return FALSE;
  256. }
  257. }
  258. LRESULT CALLBACK _MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  259. {
  260. switch(uMsg)
  261. {
  262.     case WM_SENDTOLOCALSERVER:
  263.         if(g_pLocalServer)
  264.             g_pLocalServer->HandleLocalSrvNotify(wParam, lParam);
  265.         break;
  266. case WM_SENDTOLAYER1:
  267. if(g_pLocalServer)
  268. g_pLocalServer->UpdateLayer1Notify(wParam, lParam);
  269. break;
  270. // 收到一个ChannelMgr需要退出的消息
  271. case WM_CHANNELMGR_QUIT:
  272. if(g_pLocalServer)
  273. g_pLocalServer->DeleteChannel(CHANNELID(wParam));
  274. break;
  275.     case WM_EXIT_EX:    //清理所有内容并退出程序
  276.         CChaosUI::DeleteInstance();
  277.         g_pChaosUI = NULL;
  278.         CLocalServer::DeleteInstance();
  279. g_pLocalServer = NULL;
  280.         DestroyWindow(g_hMainWnd);
  281.         CChannelMenu::ReleaseInstance();
  282.         break;
  283. case WM_DESTROY:
  284. PostQuitMessage(0);
  285. break;
  286. case WM_TASKBARMSG:
  287.         SetForegroundWindow(g_hMainWnd); //保证在按菜单外部时能关闭菜单
  288. switch(lParam)
  289. {
  290. case WM_RBUTTONUP:
  291. if(CChannelMenu::GetInstance())
  292. {
  293. CChannelMenu::GetInstance()->ShowRButtonTIMenu(hwnd);
  294. }
  295. break;
  296. case WM_LBUTTONDOWN:
  297. g_pChaosUI->ShowBalloon();
  298. break;
  299. default:
  300. break;
  301. }
  302. break;
  303. case WM_INITMENUPOPUP :
  304. if(CChannelMenu::GetInstance())
  305. CChannelMenu::GetInstance()->OnPopupMenu((HMENU) wParam, lParam);
  306. break;
  307. case WM_COMMAND:
  308. {
  309. int wmId, wmEvent;
  310. wmId    = LOWORD(wParam); 
  311. wmEvent = HIWORD(wParam); 
  312. // Parse the menu selections:
  313. if(OnOpenChannel(wmId))
  314. break;
  315. switch (wmId)
  316. {
  317.                 case TRAYWM_LANGUAGECHANGE:
  318. case TRAYWM_UPDATECHANNEL:
  319. CChannelMenu::GetInstance()->UpdateChannelNow();
  320. break;
  321. case TRAYWM_EXIT:
  322. OnExit();
  323. break;
  324. case TRAYWM_ABOUT:
  325. OnAbout();
  326. break;
  327. case TRAYWM_HELP:
  328. OnHelp();
  329. break;
  330. case TRAYWM_UPDATE:
  331. OnUpdate();
  332. break;
  333. case TRAYWM_HOMEPAGE:
  334. OnHomePage();
  335. break;
  336.                 case TRAYWM_EMAIL:
  337.                     OnEmail();
  338.                     break;
  339.                 case TRAYWM_NETWORK:
  340.                     OnSelectNetWork();
  341. break;
  342. default:
  343. return DefWindowProc(hwnd, uMsg, wParam, lParam);
  344. }
  345. }
  346. break;
  347. default:
  348. return DefWindowProc(hwnd, uMsg, wParam, lParam);
  349. }
  350. return 0;
  351. }
  352. ATOM RegisterMainWndClass(HINSTANCE hInstance)
  353. {
  354. WNDCLASSEX wcex;
  355. wcex.cbSize = sizeof(WNDCLASSEX); 
  356. wcex.style = CS_HREDRAW | CS_VREDRAW;;
  357. wcex.lpfnWndProc = (WNDPROC)_MainWndProc;
  358. wcex.cbClsExtra = 0;
  359. wcex.cbWndExtra = 0;
  360. wcex.hInstance = hInstance;
  361. wcex.hIcon = ::LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYSEE_1));
  362. wcex.hCursor = NULL;
  363. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  364. wcex.lpszMenuName = NULL;
  365. wcex.lpszClassName = g_sWndClassName;
  366. wcex.hIconSm = NULL;
  367. return RegisterClassEx(&wcex);
  368. }
  369. int WINAPI WinMain( HINSTANCE hInstance,
  370.    HINSTANCE hPrevInstance,
  371.    LPSTR lpCmdLine,
  372.    int nCmdShow )
  373. {
  374. // { 保证单个实例
  375. HANDLE hSingleInstMutex = CreateMutex(NULL, TRUE, _TEXT("SingleInst"));
  376. if(NULL == hSingleInstMutex)
  377. {
  378. assert(0);
  379. return 0;
  380. }
  381. else
  382. {
  383. if(ERROR_ALREADY_EXISTS == GetLastError())
  384. {
  385. CloseHandle(hSingleInstMutex);
  386.             return 0;
  387. }
  388. }
  389. // 保证单个实例 }
  390. //处理命令行消息
  391. _strlwr(lpCmdLine);
  392. // BOOL useChannelMenu = strstr(lpCmdLine, "l") != NULL;
  393. if(strstr(lpCmdLine, "home") != NULL)
  394. OnHomePage(); //直接调用函数打开主页
  395. BOOL useChannelMenu = TRUE;
  396. //
  397. // 生成程序目录
  398. GetModuleFileName(NULL, g_sAppPath, MAX_PATH);
  399. {
  400. TCHAR* pos = _tcsrchr(g_sAppPath, _T('\'));
  401. if(pos != NULL)
  402. *pos = _T('');
  403. }
  404. //
  405. g_hInstance = hInstance;
  406. RegisterMainWndClass(hInstance);
  407. g_hMainWnd = CreateWindowEx(WS_EX_TOPMOST, g_sWndClassName, g_sWndName, 
  408. WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, NULL, NULL, hInstance, NULL);
  409. ShowWindow(g_hMainWnd, SW_HIDE);
  410. UpdateWindow(g_hMainWnd);
  411.     // { 开始创建各模块
  412.     CChannelMenu::CreateInstance(useChannelMenu);
  413. g_pLocalServer = CLocalServer::CreateInstance();
  414. assert(g_pLocalServer);
  415. if(g_pLocalServer)
  416. {
  417. g_pChaosUI = CChaosUI::CreateInstance(g_pLocalServer);
  418. if(!g_pLocalServer->Run())
  419. {
  420. assert(0);
  421. }
  422. }
  423.     // }创建各模块结束
  424. MSG msg;
  425. while(GetMessage(&msg, NULL, 0, 0))
  426. {
  427.           TranslateMessage(&msg);
  428.   DispatchMessage(&msg);
  429. }
  430.     //所有清理都在WM_EXIT_EX中完成了
  431. UnregisterClass(g_sWndClassName, hInstance);
  432. CloseHandle(hSingleInstMutex);
  433. return 0;
  434. }