winmain.cpp
来自「mysee网络直播源代码Mysee Lite是Mysee独立研发的网络视频流媒体」· C++ 代码 · 共 502 行
CPP
502 行
/*
* Openmysee
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include "stdafx.h"
#include "LocalServer.h"
#include "ChaosUI.h"
#include "ChannelMenu.h"
#include "MultiLanguageMgr.h"
#include "About.h"
volatile HINSTANCE g_hInstance = NULL;
volatile HWND g_hMainWnd = NULL;
const TCHAR g_sWndClassName[MAX_PATH] = _TEXT("MainWndCls");
const TCHAR g_sWndName[MAX_PATH] = _TEXT("MainWindow");
TCHAR g_sAppPath[MAX_PATH] = _T("");
CChaosUI *g_pChaosUI = NULL;
CLocalServer *g_pLocalServer = NULL;
namespace {
#include <Tlhelp32.h>
void GetAndKillWMP()
{
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hModuleSnap == INVALID_HANDLE_VALUE)
return ;
// Set the size of the structure before using it.
PROCESSENTRY32 prc32;
prc32.dwSize = sizeof(PROCESSENTRY32);
prc32.cntUsage = 0;
// Retrieve information about the first module,
// and exit if unsuccessful
if(!Process32First(hModuleSnap, &prc32)) {
CloseHandle(hModuleSnap); // Must clean up the snapshot object!
return;
}
// Now walk the module list of the process,
// and display information about each module
DWORD wmpid = 0;
do
{
/* TCHAR tmp[MAX_PATH];
TCHAR* dest = _tcsrchr(prc32.szExeFile, _T('\\'));
if(dest == NULL)
continue;
_tcscpy(tmp, dest + 1);*/
if(_tcsicmp(prc32.szExeFile, _T("wmplayer.exe")) == 0)
{
wmpid = prc32.th32ProcessID; // Find target module name
break;
}
} while(Process32Next(hModuleSnap, &prc32));
// Do not forget to clean up the snapshot object.
CloseHandle(hModuleSnap);
if(wmpid == 0)
return;
HANDLE hwmp = OpenProcess(PROCESS_TERMINATE | SYNCHRONIZE , FALSE, wmpid);
if(hwmp == NULL)
return;
TerminateProcess(hwmp, 0);
WaitForSingleObject(hwmp, 2000);
CloseHandle(hwmp);
}
BOOL GetRegString(HKEY hkey, LPCTSTR regToBeGet, LPCTSTR valueName, LPTSTR pdata)
{
HKEY hkSub;
DWORD dis;
if(RegCreateKeyEx(hkey, regToBeGet, 0, _T(""), 0,
KEY_READ, NULL, &hkSub, &dis) != ERROR_SUCCESS)
return FALSE;
DWORD len = 0;
if(RegQueryValueEx(hkSub, valueName, 0, NULL, NULL, &len) != ERROR_SUCCESS)
return FALSE;
if(RegQueryValueEx(hkSub, valueName, 0, NULL, (BYTE*)pdata, &len) != ERROR_SUCCESS)
return FALSE;
RegCloseKey(hkSub);
return TRUE;
}
CString m_strBrowser;
LPCTSTR GetBrowser(void)
{
// Have we already got the browser?
if (m_strBrowser.IsEmpty())
{
// Get the default browser from HKCR\http\shell\open\command
BOOL ret = GetRegString(HKEY_CLASSES_ROOT, _T("http\\shell\\open\\command"), NULL, m_strBrowser.GetBuffer(1024));
m_strBrowser.ReleaseBuffer();
if(!ret) //fail, try another position: HKCR\htmlfile\shell\open\command
{
ret = GetRegString(HKEY_CLASSES_ROOT, _T("http\\htmlfile\\shell\\open\\command"), NULL, m_strBrowser.GetBuffer(1024));
m_strBrowser.ReleaseBuffer();
}
// Do we have the browser?
if(!ret) //fail again, we had to use a default string
{
m_strBrowser = _T("iexplore"); //use default string
return m_strBrowser;
}
//remove the quote in path
m_strBrowser.Remove('"');
int nIndex = m_strBrowser.ReverseFind('\\');
if(nIndex > 0)
{
//script the total path of browser
int nSpace = m_strBrowser.Find(' ', nIndex);
if(nSpace > 0)
m_strBrowser = m_strBrowser.Left(nSpace);
}
}
return m_strBrowser;
}
void OnUpdate()
{
int ret = g_pLocalServer->GetChannelNum();
if(ret != 0)
{
MultiLanguage LanguageDll;
if(MessageBox(g_hMainWnd, LanguageDll.GetStringByStr(_T("更新程序将中断当前的播放过程,确定要更新吗?")), _T("Warning"), MB_YESNO | MB_ICONQUESTION) != IDYES)
return;
}
TCHAR* updatepath = new TCHAR[MAX_PATH + 32];
memset(updatepath, 0, sizeof(TCHAR)*(MAX_PATH+32));
GetModuleFileName(NULL, updatepath, MAX_PATH);
TCHAR* appendpos = _tcsrchr(updatepath, _T('\\')) + 1;
_tcscpy(appendpos, _T("xtvupdater.exe"));
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
CreateProcess( // No module name (use command line).
updatepath,
NULL, // 如果不需要强制升级,则使用/S参数避免显示升级界面
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
;
delete[] updatepath;
}
void OnHelp()
{
TCHAR* pbuffer = new TCHAR[1024];
LoadString(g_hInstance, IDS_HELPURL, pbuffer, 1024);
ShellExecute(NULL, NULL, GetBrowser() ,pbuffer, NULL, SW_SHOWNORMAL);
delete[] pbuffer;
}
void OnHomePage()
{
TCHAR* pbuffer = new TCHAR[1024];
LoadString(g_hInstance, IDS_HOMEPAGE, pbuffer, 1024);
ShellExecute(NULL, NULL, GetBrowser() ,pbuffer, NULL, SW_SHOWNORMAL);
delete[] pbuffer;
}
void OnEmail()
{
TCHAR* pbuffer = new TCHAR[1024];
LoadString(g_hInstance, IDS_SUPPORTEMAIL, pbuffer, 1024);
ShellExecute(NULL, NULL, pbuffer ,NULL, NULL, SW_SHOWNORMAL);
delete[] pbuffer;
}
void OnSelectNetWork()
{
TCHAR* pbuffer = new TCHAR[1024];
LoadString(g_hInstance, IDS_NETWORKSELECTURL, pbuffer, 1024);
ShellExecute(NULL, NULL, GetBrowser() ,pbuffer, NULL, SW_SHOWNORMAL);
delete[] pbuffer;
}
void OnAbout()
{
// CBalloonHelp::LaunchBalloon("adsfadf", "dafadf", CPoint(100, 100), IDI_EXCLAMATION, CBalloonHelp::unSHOW_CLOSE_BUTTON,
// g_hMainWnd);
CAbout aboutdlg;
}
void OnExit()
{
int ret = g_pLocalServer->GetChannelNum();
if(ret != 0)
{
MultiLanguage LanguageDll;
MessageBox(g_hMainWnd, LanguageDll.GetStringByStr(_T("请关闭正在播放的内容后再退出。")), _T("Warning"), MB_OK | MB_ICONWARNING);
}
else
{
if(g_pChaosUI)
g_pChaosUI->DeliverExit();
if(g_pLocalServer)
{
g_pLocalServer->Stop();
g_pLocalServer->FireExit();
}
}
}
BOOL OnOpenChannel(DWORD cmdID)
{
LPCTSTR url = CChannelMenu::GetInstance()->GetChannelByCmdID(cmdID);
if(url != NULL)
{
//强行杀掉WMP进程等于让WMP非正常退出. 会导致下次启动WMP时禁用所有插件.所以取消掉
// GetAndKillWMP();
TCHAR* pplayerpath = new TCHAR[MAX_PATH];
BOOL bOK = FALSE;
if(GetRegString(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Multimedia\\WMPlayer"),
_T("Player.Path"), pplayerpath))
bOK = TRUE;
else if(GetRegString(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Multimedia\\MPlayer2"),
_T("Player.Path"), pplayerpath))
bOK = TRUE;
if(!bOK)
{
MultiLanguage langDll;
MessageBox(g_hMainWnd, langDll.GetStringByStr(_T("找不到windows media player播放器")),
langDll.GetStringByStr(_T("错误")), MB_OK);
return TRUE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
TCHAR* tmpurl = new TCHAR[1024];
tmpurl[0] = _T(' ');
_tcscpy(tmpurl + 1, url);
CreateProcess( // No module name (use command line).
pplayerpath,
tmpurl, // cmdLIne
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
;
delete[] tmpurl;
delete[] pplayerpath;
return TRUE;
}
return FALSE;
}
}
LRESULT CALLBACK _MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_SENDTOLOCALSERVER:
if(g_pLocalServer)
g_pLocalServer->HandleLocalSrvNotify(wParam, lParam);
break;
case WM_SENDTOLAYER1:
if(g_pLocalServer)
g_pLocalServer->UpdateLayer1Notify(wParam, lParam);
break;
// 收到一个ChannelMgr需要退出的消息
case WM_CHANNELMGR_QUIT:
if(g_pLocalServer)
g_pLocalServer->DeleteChannel(CHANNELID(wParam));
break;
case WM_EXIT_EX: //清理所有内容并退出程序
CChaosUI::DeleteInstance();
g_pChaosUI = NULL;
CLocalServer::DeleteInstance();
g_pLocalServer = NULL;
DestroyWindow(g_hMainWnd);
CChannelMenu::ReleaseInstance();
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_TASKBARMSG:
SetForegroundWindow(g_hMainWnd); //保证在按菜单外部时能关闭菜单
switch(lParam)
{
case WM_RBUTTONUP:
if(CChannelMenu::GetInstance())
{
CChannelMenu::GetInstance()->ShowRButtonTIMenu(hwnd);
}
break;
case WM_LBUTTONDOWN:
g_pChaosUI->ShowBalloon();
break;
default:
break;
}
break;
case WM_INITMENUPOPUP :
if(CChannelMenu::GetInstance())
CChannelMenu::GetInstance()->OnPopupMenu((HMENU) wParam, lParam);
break;
case WM_COMMAND:
{
int wmId, wmEvent;
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
if(OnOpenChannel(wmId))
break;
switch (wmId)
{
case TRAYWM_LANGUAGECHANGE:
case TRAYWM_UPDATECHANNEL:
CChannelMenu::GetInstance()->UpdateChannelNow();
break;
case TRAYWM_EXIT:
OnExit();
break;
case TRAYWM_ABOUT:
OnAbout();
break;
case TRAYWM_HELP:
OnHelp();
break;
case TRAYWM_UPDATE:
OnUpdate();
break;
case TRAYWM_HOMEPAGE:
OnHomePage();
break;
case TRAYWM_EMAIL:
OnEmail();
break;
case TRAYWM_NETWORK:
OnSelectNetWork();
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
ATOM RegisterMainWndClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;;
wcex.lpfnWndProc = (WNDPROC)_MainWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = ::LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYSEE_1));
wcex.hCursor = NULL;
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = g_sWndClassName;
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
// { 保证单个实例
HANDLE hSingleInstMutex = CreateMutex(NULL, TRUE, _TEXT("SingleInst"));
if(NULL == hSingleInstMutex)
{
assert(0);
return 0;
}
else
{
if(ERROR_ALREADY_EXISTS == GetLastError())
{
CloseHandle(hSingleInstMutex);
return 0;
}
}
// 保证单个实例 }
//处理命令行消息
_strlwr(lpCmdLine);
// BOOL useChannelMenu = strstr(lpCmdLine, "l") != NULL;
if(strstr(lpCmdLine, "home") != NULL)
OnHomePage(); //直接调用函数打开主页
BOOL useChannelMenu = TRUE;
//
// 生成程序目录
GetModuleFileName(NULL, g_sAppPath, MAX_PATH);
{
TCHAR* pos = _tcsrchr(g_sAppPath, _T('\\'));
if(pos != NULL)
*pos = _T('\0');
}
//
g_hInstance = hInstance;
RegisterMainWndClass(hInstance);
g_hMainWnd = CreateWindowEx(WS_EX_TOPMOST, g_sWndClassName, g_sWndName, \
WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, NULL, NULL, hInstance, NULL);
ShowWindow(g_hMainWnd, SW_HIDE);
UpdateWindow(g_hMainWnd);
// { 开始创建各模块
CChannelMenu::CreateInstance(useChannelMenu);
g_pLocalServer = CLocalServer::CreateInstance();
assert(g_pLocalServer);
if(g_pLocalServer)
{
g_pChaosUI = CChaosUI::CreateInstance(g_pLocalServer);
if(!g_pLocalServer->Run())
{
assert(0);
}
}
// }创建各模块结束
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//所有清理都在WM_EXIT_EX中完成了
UnregisterClass(g_sWndClassName, hInstance);
CloseHandle(hSingleInstMutex);
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?