📄 mtlweb.h
字号:
#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 + -