#include <windows.h>
#include <shellapi.h>
#include <shlobj.h>
#include <assert.h>
#include <tchar.h>
#pragma comment(lib, "shell32.lib")
bool create_link_file(
const wchar_t* application, // 快捷方式对应的程序
const wchar_t* argvs, // 传进程序的参数
const wchar_t* link, // 快捷方式的路径
const wchar_t* icon) // 快捷方式的图标
{
bool result = false;
HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
IShellLink* shell_link = NULL;
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&shell_link);
if (SUCCEEDED(hr))
{
// 设置程序路径
hr = shell_link->SetPath(application);
wchar_t t[0x100]{ 0 };
wcscpy_s(t, application);
wchar_t* p = wcsrchr(t, L'\\');
p[1] = 0;
// 设置工作目录
hr = shell_link->SetWorkingDirectory(t);
// 设置参数
hr = shell_link->SetArguments(argvs);
// 设置图标
hr = shell_link->SetIconLocation(icon, 0);
IPersistFile* persist_file = NULL;
hr = shell_link->QueryInterface(IID_IPersistFile, (void**)&persist_file);
if (SUCCEEDED(hr))
{
// 创建快捷方式
hr = persist_file->Save((link), FALSE);
if (SUCCEEDED(hr)) result = true;
persist_file->Release();
}
shell_link->Release();
}
CoUninitialize();
}
return result;
}
bool register_shell_extension(
const wchar_t* reg_type, // 注册表类型
const wchar_t* reg_name, // 注册表名称
const wchar_t* name, // 显示名称
const wchar_t* command, // 进程路径
const wchar_t* icon) // 显示图标
{
HKEY key;
wchar_t path[0x100]{ 0 };
wsprintfW(path, L"%ws\\shell\\%ws", reg_type, reg_name);
if (RegCreateKeyW(HKEY_CLASSES_ROOT, path, &key) == ERROR_SUCCESS)
{
// 显示的字符串
RegSetValueExW(key, 0, 0, REG_EXPAND_SZ, (LPBYTE)name, (wcslen(name) + 1) * sizeof(wchar_t));
// 显示的图标
RegSetValueExW(key, L"Icon", 0, REG_EXPAND_SZ, (LPBYTE)icon, (wcslen(icon) + 1) * sizeof(wchar_t));
RegCloseKey(key);
}
wsprintfW(path, L"%ws\\shell\\%ws\\Command", reg_type, reg_name);
if (RegCreateKeyW(HKEY_CLASSES_ROOT, path, &key) == ERROR_SUCCESS)
{
// 程序路径
RegSetValueExW(key, 0, 0, REG_EXPAND_SZ, (LPBYTE)command, (wcslen(command) + 1) * sizeof(wchar_t));
RegCloseKey(key);
}
return true;
}
int main(int argc, char* argv[])
{
// 添加注册表 右键菜单
register_shell_extension(L"exefile", L"MyTestA", L"用我的程序 `打开", L"\"c:\\windows\\regedit.exe\" \"%1\"", L"\"C:\\Users\\Administrator\\Desktop\\777.ico\",0");
// 定位桌面路径
LPITEMIDLIST lp{ 0 };
HRESULT result = SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &lp);
if (SUCCEEDED(result))
{
// 转化为字符串
wchar_t str[520]{ 0 };
if (SHGetPathFromIDListW(lp, str))
{
// 创建桌面图标
wcscat_s(str, L"\\CMGPAUSE.lnk");
create_link_file(L"C:\\Windows\\System32\\notepad.exe", L"C:\\setting.txt", str, L"C:\\Users\\Administrator\\Desktop\\777.ico");
}
}
return 0;
}
C++ 创建桌面快捷方式
最新推荐文章于 2023-11-08 17:57:58 发布