⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mtlweb.h

📁 一个使用wtl写的完整的多窗口浏览器
💻 H
📖 第 1 页 / 共 3 页
字号:
#ifndef __MTLWEB_H__
#define __MTLWEB_H__

// MTL Version 1.01
// Copyright (C) 2000 MB<mb2@geocities.co.jp>
// All rights unreserved.
//
// This file is a part of Mb Template Library.
// The code and information is *NOT* provided "as-is" without
// warranty of any kind, either expressed or implied.
//
// Last updated: July 05, 2000

#pragma once

#ifndef __MTLMISC_H__
	#error mtlweb.h requires mtlmisc.h to be included first
#endif

#ifndef _WININET_
	#error mtlweb.h requires wininet.h to be included first
#endif

#ifndef _INC_SHLWAPI
	#error mtlweb.h requires shlwapi.h to be included first
#endif

#ifndef __INTSHCUT_H__
	#error mtlweb.h requires intshcut.h to be included first
#endif

#include <algorithm>
#include <list>
#include <IntShCut.h>

namespace MTL
{

inline bool MtlGetFavoritesFolder(CString& rString)
{
	CRegKey rk;
	LONG lRet = rk.Open(HKEY_CURRENT_USER,
		_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"));
	if(lRet != ERROR_SUCCESS)
		return false;

	TCHAR szRetString[MAX_PATH];
	DWORD dwCount = MAX_PATH * sizeof(TCHAR);
	lRet = rk.QueryValue(szRetString, _T("Favorites"), &dwCount);
	if(lRet != ERROR_SUCCESS) {
		rk.Close();
		lRet = rk.Open(HKEY_CURRENT_USER,
			_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"));
		if (lRet != ERROR_SUCCESS)
			return false;
		lRet = rk.QueryValue(szRetString, _T("Favorites"), &dwCount);
		if (lRet != ERROR_SUCCESS)
			return false;
	}
	rk.Close();

	TCHAR szRetString2[MAX_PATH];
	::ExpandEnvironmentStrings(szRetString, szRetString2, MAX_PATH);
	rString = szRetString2;
	ATLTRACE2(atlTraceUser, 4, _T("MTL: MtlGetFavoritesFolder : %s\n"), szRetString2);
	return true;
}

inline bool MtlGetHistoryFolder(CString& rString)
{
	CRegKey rk;
	LONG lRet = rk.Open(HKEY_CURRENT_USER,
		_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"));
	if(lRet != ERROR_SUCCESS)
		return false;

	TCHAR szRetString[MAX_PATH];
	DWORD dwCount = MAX_PATH * sizeof(TCHAR);
	lRet = rk.QueryValue(szRetString, _T("History"), &dwCount);
	if(lRet != ERROR_SUCCESS) {
		rk.Close();
		lRet = rk.Open(HKEY_CURRENT_USER,
			_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"));
		if (lRet != ERROR_SUCCESS)
			return false;
		lRet = rk.QueryValue(szRetString, _T("History"), &dwCount);
		if (lRet != ERROR_SUCCESS)
			return false;
	}
	rk.Close();

	TCHAR szRetString2[MAX_PATH];
	::ExpandEnvironmentStrings(szRetString, szRetString2, MAX_PATH);
	rString = szRetString2;
	ATLTRACE2(atlTraceUser, 4, _T("MTL: MtlGetFavoritesFolder : %s\n"), szRetString2);
	return true;
}

inline bool MtlGetFavoriteLinksFolder(CString& rString)
{// inspired by DOGSTORE
	if (!MtlGetFavoritesFolder(rString))
		return false;

	MtlMakeSureTrailingBackSlash(rString);

	CRegKey rk;
	LONG lRet = rk.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Internet Explorer\\Toolbar"));
	if (lRet == ERROR_SUCCESS) {
		TCHAR szName[MAX_PATH];
		DWORD dwCount = MAX_PATH * sizeof(TCHAR);
		lRet = rk.QueryValue(szName, _T("LinksFolderName"), &dwCount);
		if (lRet == ERROR_SUCCESS) {
			TCHAR szName2[MAX_PATH];
			::ExpandEnvironmentStrings(szName, szName2, MAX_PATH);
			rString += szName2;
			MtlMakeSureTrailingBackSlash(rString);
			return true;
		}
	}

	rString += _T("Links\\");
	return false;
}

bool MtlCreateInternetShortcutFile(const CString& strFileName, const CString& strUrl)
{// Thanks to <http://www.nt.sakura.ne.jp/~miwaki/>
	CComPtr<IUniformResourceLocator> spUrl;
    HRESULT hr = ::CoCreateInstance(CLSID_InternetShortcut, NULL,
                CLSCTX_ALL, IID_IUniformResourceLocator, (void**)&spUrl);
	if (FAILED(hr))
		return false;

	CComPtr<IPersistFile> spPf;
	hr = spUrl->QueryInterface(IID_IPersistFile, (void**)&spPf);
	if (FAILED(hr))
		return false;

	hr = spUrl->SetURL(strUrl, 0);
	if (FAILED(hr))
		return false;

	USES_CONVERSION;
	hr = spPf->Save(T2COLE((LPCTSTR)strFileName), TRUE);
	if (FAILED(hr))
		return false;

	return true;
}


// Note. If the third parameter is "CString strPath", it rarely crash. why?
inline void MtlOrganizeFavorite(HWND hWnd, bool bOldShell = false, const CString& strPath_ = _T(""))
{
/*	Wrong code: dialog can't handle mouse message
	CComPtr<IShellUIHelper> spShell;
	HRESULT hr = spShell.CoCreateInstance(CLSID_ShellUIHelper, NULL);
	if (SUCCEEDED(hr)) {
	//	CComVariant v1, v2;
	//	CComBSTR bstr(OLESTR("OrganizeFavorites"));
	//	HRESULT hr = spShell->ShowBrowserUI(bstr, &v1, NULL);//&v2);
		CComVariant v1(OLESTR("OrganizeFavorites"));
		CComDispatchDriver driver(spShell);
		hr = driver.Invoke1(0x0000000d, &v1, NULL);
		if (FAILED(hr)) {
			CString strPath;
			if (MBtlGetFavoriteDirectory(strPath)) {
				::ShellExecute(0, "open", "explorer.exe", strPath, ".", SW_SHOW);
			}
		}
	}
*/
	// get favorite path
	CString strPath(strPath_);
	if (strPath.IsEmpty())
		MtlGetFavoritesFolder(strPath);

	if (bOldShell) {
		// easy way
		::ShellExecute(NULL, NULL, strPath, NULL, NULL, SW_SHOWNORMAL);
		return;
	}

	HINSTANCE hLib = ::LoadLibrary(_T("shdocvw.dll"));
	if (hLib) {
		typedef UINT (CALLBACK* LPFNORGFAV)(HWND, LPTSTR);
		LPFNORGFAV lpfnDoOrganizeFavDlg = (LPFNORGFAV)::GetProcAddress(hLib, "DoOrganizeFavDlg");
		if (lpfnDoOrganizeFavDlg) {
			TCHAR szPath[MAX_PATH];
			::lstrcpy(szPath, strPath);
			(*lpfnDoOrganizeFavDlg)(hWnd, szPath);
		}
		::FreeLibrary(hLib);
		// a following fails if old shell (not support ::SHGetSpecialFolderPath)
		// TCHAR szPath[MAX_PATH];
		// HRESULT hr = ::SHGetSpecialFolderPath(m_hWnd, szPath, CSIDL_FAVORITES, TRUE);
		// if (SUCCEEDED(hr)) {
		//	lpfnDoOrganizeFavDlg(m_hWnd, strPath);
		// }

		// We must rebuild the menu each time because
		// DoOrganizeFavDlg doesn't indicate if nothing 
		// was changed.
		// BeginWaitCursor();
		// BuildFavoritesMenu();   // Rebuild all the favorites links
		// EndWaitCursor();
	}
	else {
		// easy way
		::ShellExecute(NULL, NULL, strPath, NULL, NULL, SW_SHOWNORMAL);
	}
}

inline bool __MtlAddFavoriteOldShell(const CString& strUrl, const CString& strName_, const CString& strFavDir)
{
	// easy way for old shell users
	static const TCHAR szFilter[] = _T("URL File(*.url)\0*.url\0\0");
	TCHAR szOldPath[MAX_PATH];// save current directory
	::GetCurrentDirectory(MAX_PATH, szOldPath);
	
	::SetCurrentDirectory(strFavDir);

	CString strName(strName_);
	MtlValidateFileName(strName);

	CFileDialog fileDlg(FALSE, _T("url"), strName,
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	fileDlg.m_ofn.lpstrInitialDir = strFavDir;
	fileDlg.m_ofn.lpstrTitle = _T("Add to Favorites");

	if (fileDlg.DoModal() == IDOK) {
		CString strFile(fileDlg.m_szFileName);
		if (!MtlIsExt(strFile, _T(".url")))
			strFile += _T(".url");

		::WritePrivateProfileString(_T("InternetShortcut"), _T("URL"),
					 strUrl, strFile);
	}
	::SetCurrentDirectory(szOldPath);

	return true;
}

inline bool _MtlAddFavoriteNewShell(const CString& strUrl, const CString& strName)
{
	CComPtr<IShellUIHelper> spShell;
	HRESULT hr = spShell.CoCreateInstance(CLSID_ShellUIHelper);
	if (FAILED(hr))
		return false;

	CComBSTR bstrName(strName);
	CComBSTR bstrUrl(strUrl);
	CComVariant vt(bstrName);
	hr = spShell->AddFavorite(bstrUrl, &vt);
	if (FAILED(hr))
		return false;

	return true;
}

inline bool _MtlAddFavoriteModalSucks(const CString& strUrl, const CString& strName_,
									  const CString& strFavPath, HWND hWnd)
{
	CString strName(strName_);
	MtlValidateFileName(strName);

	bool bResult = false;
//	NOTE. Some buttons can't be validate. I'm fed up with IE.]
	typedef BOOL (CALLBACK* LPFNADDFAV)(HWND, LPTSTR, UINT, LPTSTR, UINT, LPITEMIDLIST);
 	HMODULE hMod = (HMODULE)::LoadLibrary(_T("shdocvw.dll"));
	if (hMod) {
		LPFNADDFAV lpfnDoAddToFavDlg = (LPFNADDFAV)::GetProcAddress(hMod, "DoAddToFavDlg");
		if (lpfnDoAddToFavDlg) {
			int nLen = strName.GetLength();
			LPTSTR szName = (LPTSTR)_alloca((nLen+1)*sizeof(TCHAR));
			::lstrcpy(szName, strName);

			TCHAR szPath[MAX_PATH];
			CItemIDList idlFavPath = strFavPath;
			BOOL bOK = lpfnDoAddToFavDlg(hWnd,
				szPath, _countof(szPath),
                szName, nLen,
				idlFavPath);
			
			if (bOK)
				MtlCreateInternetShortcutFile(szPath, strUrl);

			bResult = true;
		}

		FreeLibrary(hMod);
	}

	return bResult;
}

inline bool MtlAddFavorite(const CString& strUrl, const CString& strName, bool bOldShell = false,
						   const CString& strFavDir_ = _T(""), HWND hWnd = NULL)
{// how complex...	
	CString strStdFavDir;
	if (!MtlGetFavoritesFolder(strStdFavDir))
		return false;

	CString strFavDir(strFavDir_);
	if (strFavDir.IsEmpty()) {
		strFavDir = strStdFavDir;
	}

	if (bOldShell) {
		return __MtlAddFavoriteOldShell(strUrl, strName, strFavDir);
	}

	bool bStdFavDir = (strStdFavDir == strFavDir);

	if (bStdFavDir) {
		if (!_MtlAddFavoriteNewShell(strUrl, strName))
			return __MtlAddFavoriteOldShell(strUrl, strName, strFavDir);
	}
	else {
		if (!_MtlAddFavoriteModalSucks(strUrl, strName, strFavDir, hWnd))
			return __MtlAddFavoriteOldShell(strUrl, strName, strFavDir);
	}

	return false;
}

#pragma comment( lib, "wininet" )
// cf.MSDN "Offline Browsing"
// Bug: Even if an user is working-Offline before your application runs, 
//      this function always returns FALSE.
inline bool MtlIsGlobalOffline()
{
	DWORD dwState = 0, dwSize = sizeof(DWORD);
	bool bRet = false;

	if(::InternetQueryOption(NULL, INTERNET_OPTION_CONNECTED_STATE, &dwState, &dwSize)) {
		if(dwState & INTERNET_STATE_DISCONNECTED_BY_USER)
			bRet = true;
	}

	return bRet; 
}

// cf.MSDN "Offline Browsing"
inline void MtlSetGlobalOffline(bool bGoOffline)
{
	if (MtlIsGlobalOffline() == bGoOffline)
		return;

	INTERNET_CONNECTED_INFO ci;
	memset(&ci, 0, sizeof(ci));
	if(bGoOffline) {
		ci.dwConnectedState = INTERNET_STATE_DISCONNECTED_BY_USER;
		ci.dwFlags = ISO_FORCE_DISCONNECTED;
	} 
	else {
		ci.dwConnectedState = INTERNET_STATE_CONNECTED;
	}

	::InternetSetOption(NULL, INTERNET_OPTION_CONNECTED_STATE, &ci, sizeof(ci));
}

#if (_WIN32_IE >= 0x0500)
inline bool MtlAutoComplete(HWND hWnd)
{
	bool bRet = false;
	HINSTANCE hLib = ::LoadLibrary(_T("shlwapi.dll"));
	if (hLib) {
		typedef HRESULT (CALLBACK *LPFNSHAUTOCOMPLETE)(HWND hWnd, DWORD dw);
		LPFNSHAUTOCOMPLETE lpfnSHAutoComplete = (LPFNSHAUTOCOMPLETE)::GetProcAddress(hLib, "SHAutoComplete");
		if (lpfnSHAutoComplete) {
			HRESULT hr = (*lpfnSHAutoComplete)(hWnd, SHACF_FILESYSTEM | SHACF_URLALL | SHACF_USETAB);
			if (SUCCEEDED(hr))
				bRet = true;
		}
		::FreeLibrary(hLib);
	}

	return bRet;
}
#endif

inline MtlShowInternetOptions()
{// this is modeless
	::ShellExecute(0, _T("open"), _T("control.exe"), _T("inetcpl.cpl"), _T("."), SW_SHOW);
}

inline bool MtlCreateShortCutFile(const CString& strFile, const CString& strTarget,
					   const CString& strDescription = _T(""), const CString& strArgs = _T(""),
					   const CString& strWorkingDir = _T(""), const CString& strIconPath = _T(""),
					   int iIcon = 0, int iShowCmd = SW_SHOWNORMAL)	// Window Styles
{// Thanks to <http://www.nt.sakura.ne.jp/~miwaki/>
	if (MtlIsExt(strTarget, _T(".url")) || MtlIsExt(strTarget, _T(".lnk"))) {
		// if target is .lnk or .url, just copy!!
		CString strFolder = MtlGetDirectoryPath(strFile, true);
		CString strTarget_ = strTarget;
		CSimpleArray<CString> arrFiles; arrFiles.Add(strTarget_);
		return MtlCopyFile(strFolder, arrFiles);
	}

	CComPtr<IShellLink> spLink;
	HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLink, (void**)&spLink);
	if (FAILED(hr))
		return false;

	CComPtr<IPersistFile> spFile;
	hr = spLink->QueryInterface(IID_IPersistFile, (void**)&spFile);
	if (FAILED(hr))
		return false;


	spLink->SetPath(strTarget);

	if (!strDescription.IsEmpty())
		spLink->SetDescription(strDescription);
	if (!strArgs.IsEmpty())
		spLink->SetArguments(strArgs);
	if (!strWorkingDir.IsEmpty())
		spLink->SetWorkingDirectory(strWorkingDir);
	if (!strIconPath.IsEmpty())
		spLink->SetIconLocation(strIconPath, iIcon);

	spLink->SetShowCmd(iShowCmd);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -