最近再做一个工具软件,可以向指定的程序通过快捷键发送一个字符串,需要显示当前正在运行的程序。
1.首先通过CreateToolhelp32Snapshot创建进程快照
2.然后在里面通过进程的ID调用QueryFullProcessImageName获取程序的完整路径,
这个参数需要进程的句柄,所以要开启调试权限,管理员权限,这个函数需要vista ,server2008以上的版本
3.通过函数SHGetFileInfo获取程序里面的icon,用于显示
4.通过GetFileVersionInfo获取可执行文件的描述,这里需要设置语言,比如中英文等。
在MFC里面使用listctrl显示
主要代码:
// 获取进程icon
SHFILEINFO shFileInfo = { 0 };
DWORD_PTR dwRet = ::SHGetFileInfo(lpszPath, 0, &shFileInfo, sizeof(SHFILEINFO), SHGFI_ICON);
// 获取文件描述
dataSize = GetFileVersionInfoSizeW(filePath, 0);
//获取可执行文件中的语言,例如有中文的、英文的、繁体的等
VerQueryValueW(pData, _T("\\VarFileInfo\\Translation"), (LPVOID*)&lpTranslation, &cbTranslation)
//获取系统当前显示的语言,然后在循环里面,对比语言,选择想要获取的文件描述
LANGID languageId = GetUserDefaultUILanguage();
for (size_t i = 0; i < cbTranslation / sizeof(struct LANGANDCODEPAGE); i++){
wsprintf(pSubBlock, L"\\StringFileInfo\\%04x%04x\\FileDescription",
lpTranslation[i].wLanguage, lpTranslation[i].wCodepage);
if (languageId == lpTranslation[i].wLanguage)
{
VerQueryValueW(pData, pSubBlock, &pCurrent, &cbSize);
break;
}
}
例如: