📄 hmhfunc.cpp
字号:
#include "stdafx.h"
#include "HMHFunc.h"
/*
获取快捷方式文件信息
FileName:快捷方式文件名
FilePath: 取得其指向的文件
CommandLine: 得其指向的命令行
WorkDir: 工作目录
IconFile: 其图标文件
IconIndex: 其图标文件的索引
返回1成功,否则返回0
*/
int HMHGetLinkInfo(LPCTSTR FileName,CString &FilePath,CString &CommandLine,CString &WorkDir,CString &IconPath,int &IconIndex)
{
HRESULT hres;
IShellLink *psl;
hres = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (void **)&psl);
if (SUCCEEDED (hres))
{
IPersistFile *ppf;
hres = psl->QueryInterface (IID_IPersistFile, (void **)&ppf);
if (SUCCEEDED (hres))
{
char LinkFile[MAX_PATH];
WORD wsz[MAX_PATH];
strcpy(LinkFile,FileName);
MultiByteToWideChar (CP_ACP, 0, LinkFile, -1, wsz, MAX_PATH);
hres=ppf->Load(wsz,STGM_READ);
if (hres==S_OK)
{
hres = psl->GetPath (FilePath.GetBuffer(MAX_PATH),MAX_PATH,NULL,0);
FilePath.ReleaseBuffer();
if ( !SUCCEEDED (hres))
return 0;
hres=psl->GetArguments(CommandLine.GetBuffer(MAX_PATH),MAX_PATH);
CommandLine.ReleaseBuffer();
if ( !SUCCEEDED (hres))
CommandLine.Empty();
hres=psl->GetWorkingDirectory(WorkDir.GetBuffer(MAX_PATH),MAX_PATH);
WorkDir.ReleaseBuffer();
if ( !SUCCEEDED (hres))
WorkDir.Empty();
hres=psl->GetIconLocation(IconPath.GetBuffer(MAX_PATH),MAX_PATH,&IconIndex);
IconPath.ReleaseBuffer();
if ( !SUCCEEDED (hres))
{
IconPath.Empty();
IconIndex=0;
}
}
ppf->Release ();
psl->Release ();
}
}
return 1;
}
/*
获取快捷方式文件 FileName 指向的文件路径FilePath
返回1成功,否则失败
*/
int HMHGetLinkInfo(LPCTSTR FileName,CString &FilePath)
{
CString Str;
int Index;
return HMHGetLinkInfo(FileName,FilePath,Str,Str,Str,Index);
}
/*
建立快捷图标
FileName:欲建立的快捷方式文件名(扩展名为lnk)
FilePath:建立的快捷方式指向的路径
CommandLine:快捷方式的命令行
WorkDir:工作目录
IconFile:图标文件
IconIndex:图标文件中的索引
*/
int HMHCreateLink(LPCTSTR FileName, LPCTSTR FilePath,LPCTSTR CommandLine,LPCTSTR WorkDir,LPCTSTR IconPath,int IconIndex)
{
HRESULT hres;
IShellLink* psl;
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
psl->SetPath(FilePath);
psl->SetArguments(CommandLine);
psl->SetWorkingDirectory(WorkDir);
psl->SetIconLocation(IconPath,IconIndex);
psl->SetShowCmd(SW_SHOW);
hres = psl->QueryInterface( IID_IPersistFile, (LPVOID *) &ppf);
if (SUCCEEDED(hres))
{
WORD wsz[MAX_PATH];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, FileName, -1, wsz,MAX_PATH);
hres = ppf->Save(wsz, TRUE);
if (hres != S_OK )
return 0;
ppf->Release();
}
psl->Release();
}
else
return 0;
return 1;
}
//建立Internet快捷方式
int HMHCreateInternetLink(LPCTSTR FileName, LPCTSTR InternetPath, LPCTSTR IconFile, int IconIndex)
{
CFile LinkFile;
CString String;
if (LinkFile.Open(FileName,CFile::modeCreate|CFile::modeWrite)==0)
return 0;
String="[InternetShortcut]\r\n";
LinkFile.Write((void*)(LPCTSTR)String,String.GetLength());
String.Format("Url=%s\r\n",InternetPath);
LinkFile.Write((void*)(LPCTSTR)String,String.GetLength());
if (IconFile!="")
{
String.Format("IconFile=%s,%d",IconFile,IconIndex);
LinkFile.Write((void*)(LPCTSTR)String,String.GetLength());
}
LinkFile.Close();
return 1;
}
//判断文件是否存在
BOOL HMHFileExist(LPCTSTR FileName)
{
CFileFind ff;
if (ff.FindFile(FileName)==0)
return FALSE;
else
return TRUE;
}
/*
返回Windows版本号
返回代号:
HMHWINDOWS31:Win32s on Windows 3.1.
HMHWINDOWS95:Win32 on Windows 95
HMHWINDOWS98:Win32 on Windows 98
HMHWINDOWSNT:Win32 on Windows NT
//4:Win32 on Windows CE
未知操作系统,返回-1
*/
HMHWindowsVer HMHGetWindowVer(void)
{
OSVERSIONINFO OsVer;
HMHWindowsVer nRes;
OsVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&OsVer))
{
switch(OsVer.dwPlatformId)
{
case VER_PLATFORM_WIN32s: //Win32s on Windows 3.1.
nRes=HMHWINDOWS31; //Win32s
break;
case VER_PLATFORM_WIN32_WINDOWS: //WIN32 on 95 or 98
//determine if Win95 or Win98
if (OsVer.dwMinorVersion == 0)
{
nRes=HMHWINDOWS95;//Windows95
}
else
{
nRes=HMHWINDOWS98;//Windows98
}
break;
case VER_PLATFORM_WIN32_NT: //Win32 on Windows NT.
nRes=HMHWINDOWSNT;//Windows NT
break;
/* case VER_PLATFORM_WIN32_CE: //Win32 on Windows CE
nRes=4;
break; */
default:
nRes=HMHWINDOWSNOTKNOW;
}
}
return nRes;
}
//将图标文件字符串 "xxxxx,n" 分解成文件名及图标索引
void HMHGetIconFile(const CString &IconFile, CString &IconFileName, int &IconIndex)
{
CString Str;
int Index;
IconIndex=0;
IconFileName=IconFile;
if ( (Index=IconFile.ReverseFind(','))!=-1 )
{
Str=IconFile.Right(IconFile.GetLength()-Index-1);
IconFileName=IconFile.Left(Index);
IconIndex=atoi(Str);
}
}
//返回文件FileName所在的目录,不包括'\\'
CString HMHGetFileAtDir(LPCTSTR FileName)
{
CString DirName=FileName;
int i=DirName.ReverseFind('\\');
if (i!=-1)
DirName=DirName.Left(i);
else
DirName.Empty();
return DirName;
}
//将数值转换为字符串
CString HMHNumToString(LONG Number)
{
char szTemp[255];
_ltoa(Number,szTemp,10);
return (CString)szTemp;
}
/*
重新启动或关闭Windows NT系统
PromptText:对话框提示信息
DelayTime:对话框显示时间
*/
BOOL HMHRestartWindowNT(BOOL Reboot,LPSTR PromptText,int DelayTime)
{
if (HMHGetWindowVer()==HMHWINDOWSNT)
{
HANDLE hToken; // handle to process token
TOKEN_PRIVILEGES tkp; // pointer to token structure
BOOL fResult; // system shutdown flag
// Get the current process token handle so we can get shutdown // privilege.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return 0;
// Get the LUID for shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
// Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError() != ERROR_SUCCESS)
return 0;
// Display the shutdown dialog box and start the time-out countdown.
fResult = InitiateSystemShutdown(
NULL, // shut down local computer
PromptText,
DelayTime, // time-out period
FALSE, // ask user to close apps
Reboot); // reboot after shutdown
if (!fResult)
{
return 0;
}
return 1;
}
return 0;
}
//返回系统描述文件夹 nFolder 的路径
CString HMHGetSpecifyFolderPath(const int nFolder)
{
int nSysFolder[]={CSIDL_DESKTOP,CSIDL_STARTMENU,CSIDL_FAVORITES,CSIDL_PERSONAL,CSIDL_RECENT,
CSIDL_SENDTO,CSIDL_STARTUP,CSIDL_PROGRAMS,CSIDL_TEMPLATES,CSIDL_FONTS,CSIDL_APPDATA,CSIDL_INTERNET_CACHE,CSIDL_NETWORK};
char *RegKeyName[]={"Desktop","Start Menu","Favorites","Personal","Recent",
"SendTo","Startup","Programs","Templates","Fonts","AppData","Cache","NetHood"};
CString FolderPath="";
ITEMIDLIST Dir1;
char Ddir[MAX_PATH];
LPITEMIDLIST Dir=&Dir1;
BOOL NoError=FALSE;
for (int i=0;i<sizeof(nSysFolder)/sizeof(int);i++)
{
if ( *(nSysFolder+i)==nFolder)
break;
}
if (i<sizeof(nSysFolder)/sizeof(int))
{
HKEY m_hKey;
DWORD dwSize=255,dwType=REG_SZ;
char String[256],StrKey[256];
strcpy(StrKey,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders");
if (HMHGetWindowVer()==HMHWINDOWSNT)
strcpy(StrKey,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders");
if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER,StrKey,NULL,KEY_ALL_ACCESS,&m_hKey))
{
if (ERROR_SUCCESS==::RegQueryValueEx(m_hKey,RegKeyName[i],0,&dwType,(BYTE *)String,&dwSize))
{
FolderPath=String;
NoError=TRUE;
}
}
}
if (NoError==FALSE)
{
if (::SHGetSpecialFolderLocation(NULL,nFolder,&Dir)==NOERROR)
{
::SHGetPathFromIDList(Dir,Ddir);
FolderPath=Ddir;
}
}
if ( ! (FolderPath.GetLength()>=3 && FolderPath.GetAt(2)=='\\'))
{
::ExpandEnvironmentStrings(FolderPath.GetBuffer(MAX_PATH),Ddir,MAX_PATH);
FolderPath.ReleaseBuffer();
FolderPath=Ddir;
}
return FolderPath;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -