Windows
小功能
隐藏桌面快捷方式小箭头
- 下面方法,
win7
,win10
,win11
测试可以 - 备注
- 这里是把一个空白
ico
资源文件打到DLL
里面了,资源ID
是101
,所以用GetCurrentDllPath
进行拼接
- 这里是把一个空白
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
bool __stdcall ToggleShortcutArrow(bool hide) { HKEY hKey; LSTATUS lResult; const TCHAR* keyPath = TEXT( "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Icons"); lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyPath, 0, KEY_WRITE | KEY_WOW64_64KEY, &hKey); if (lResult != ERROR_SUCCESS) { lResult = RegCreateKeyEx(HKEY_LOCAL_MACHINE, keyPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_WOW64_64KEY, NULL, &hKey, NULL); if (lResult != ERROR_SUCCESS) { return false; } } if (hide) { TCHAR szPath[MAX_PATH]; if (wintools_util::GetCurrentDllPath( szPath, sizeof(szPath) / sizeof(TCHAR)) == FALSE) { return false; } std::wstring tmp_str = szPath; tmp_str.append(L",-101"); lResult = RegSetValueEx(hKey, TEXT("29"), 0, REG_SZ, (const BYTE*)tmp_str.c_str(), (lstrlen(tmp_str.c_str()) + 1) * sizeof(TCHAR)); } else { lResult = RegDeleteValue(hKey, TEXT("29")); } RegCloseKey(hKey); if (lResult != ERROR_SUCCESS) { return false; } wintools_util::RestartExplorer(); return true; } |
控制桌面图标的显示或隐藏
- 下面方法,
win7
,win10
,win11
测试可以 Windows7
另外处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
bool WINAPI EnableDeskIco(EnDeskIco enDeskico, BOOL show) { BOOL hide = !show; LSTATUS result = ERROR_SUCCESS; std::wstring strCLSID = DeskicoCLSID[enDeskico]; if (IsWindows7OrGreater() && !IsWindows8OrGreater()) { const wchar_t* regPath1 = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIc" L"ons\\NewStartPanel"; if (enDeskico == PERSONAL_FOLDER) { DWORD value = hide ? 0 : 1; result = RegSetKeyValue( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", L"HideIcons", REG_DWORD, &value, sizeof(value)); wintools_util::RestartExplorer(); return result == ERROR_SUCCESS; } result = SHSetValue(HKEY_CURRENT_USER, regPath1, strCLSID.c_str(), REG_DWORD, &hide, sizeof(DWORD)); wintools_util::RestartExplorer(); return result == ERROR_SUCCESS; } else if (IsWindows8OrGreater()) { const wchar_t* regPath = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIc" L"ons\\NewStartPanel"; result = SHSetValue(HKEY_CURRENT_USER, regPath, strCLSID.c_str(), REG_DWORD, &hide, sizeof(DWORD)); if (result != ERROR_SUCCESS) { return false; } SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, NULL, NULL); return true; } return false; } |
Windows11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
enum EnDeskIco { DESK_RECYCLE_BIN, DESK_NETWORK, DESK_COMPUTER, DESK_DOCUMENT, DESK_CONTROL_PANEL, DESK_ONEDRIVE, }; std::map<int, std::wstring> DeskicoCLSID = { {DESK_DOCUMENT, L"{59031a47-3f72-44a7-89c5-5595fe6b30ee}"}, {DESK_COMPUTER, L"{20D04FE0-3AEA-1069-A2D8-08002B30309D}"}, {DESK_NETWORK, L"{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}"}, {DESK_RECYCLE_BIN, L"{645FF040-5081-101B-9F08-00AA002F954E}"}, {DESK_CONTROL_PANEL, L"{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}"}, {DESK_ONEDRIVE, L"{018D5C66-4533-4307-9B53-224DE2ED1FE6}"}, }; BOOL EnableDeskIco(EnDeskIco enDeskico, BOOL show) { std::wstring strCLSID = DeskicoCLSID[enDeskico]; const wchar_t* regPath = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcon" L"s\\NewStartPanel"; BOOL hide = !show; LSTATUS result = SHSetValue(HKEY_CURRENT_USER, regPath, strCLSID.c_str(), REG_DWORD, &hide, sizeof(DWORD)); if (result != ERROR_SUCCESS) { std::wcout << L"设置HideDesktopIcons失败" << result << std::endl; return FALSE; } SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, NULL, NULL); return TRUE; } |
控制UAC
- 需要重启电脑
- 下面方法,
win7
,win10
,win11
测试可以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
BOOL EnAbleUAC(BOOL enable) { const wchar_t* regPath = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"; BOOL value = enable; // 0表示禁用UAC LSTATUS result = SHSetValue(HKEY_LOCAL_MACHINE, regPath, L"EnableLUA", REG_DWORD, &value, sizeof(DWORD)); if (result != ERROR_SUCCESS) { std::wcout << L"设置UAC失败" << result << std::endl; return FALSE; } return TRUE; } |
- 单进程启动见下述
控制任务栏搜索按钮
- 概述
- 任务栏搜索框集成应该是
Windows10
之后的功能 Windows7
的搜索,是在explorer
里面Windows8
的搜索,好像是全屏的,不在任务栏这里
- 任务栏搜索框集成应该是
- 选项
0
:禁用1
:启用并显示为搜索图标按钮2
:启用并显示为搜索框
- 下面方法,
win10
,win11
测试可以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
bool WINAPI DisableTaskbarSearch(search_mode mode) { HKEY hKey; LONG result; if (wintools_util::IsWindows10OrLater0()) { result = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Search", 0, KEY_WRITE, &hKey); if (result == ERROR_SUCCESS) { DWORD tmp_mode = static_cast<DWORD>(mode); RegSetValueExW(hKey, L"SearchboxTaskbarMode", 0, REG_DWORD, (BYTE*)&tmp_mode, sizeof(tmp_mode)); RegCloseKey(hKey); } } wintools_util::RestartExplorer(); return true; } |
控制任务栏兴趣与咨询(小组件)
- 概述
- 是
Windows10
之后的功能 Windows10
叫做兴趣与咨询,Windows11
叫做小组件
- 是
- 下面的方法,
win10
可以,win11
没效果- 选项如下:
0
:显示图标和文本1
:仅显示图标(小图标)2
:关闭不显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
bool DisableInterestFeature(bool enable) { HKEY hKey; RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Feeds", 0, KEY_WRITE, &hKey); DWORD value = enable ? 1 : 0; // 0=禁用,1=启用 RegSetValueEx(hKey, L"ShellFeedsTaskbarViewMode", 0, REG_DWORD, (BYTE*)&value, sizeof(value)); RegCloseKey(hKey); // 刷新系统设置 SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Policy", SMTO_ABORTIFHUNG, 1000, NULL); return true; } |
- 下面的方法,
win11
经验证是可以的- 选项:
0
:隐藏1
:显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
bool DisableInterestFeatureWin11(bool enable) { HKEY hKey; LPCWSTR subKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"; LPCWSTR valueName = L"TaskbarDa"; DWORD valueData = enable ? 1 : 0; LONG result = RegCreateKeyExW(HKEY_CURRENT_USER, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); if (result != ERROR_SUCCESS) { return false; } result = RegSetValueExW(hKey, valueName, 0, REG_DWORD, (const BYTE*)&valueData, sizeof(valueData)); RegCloseKey(hKey); if (result != ERROR_SUCCESS) { return false; } return true; } |
- 综合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
bool DisableInterestFeatureNewTest(bool enable) { if (IsWindows11OrLater0()) { HKEY hKey; LPCWSTR subKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"; LPCWSTR valueName = L"TaskbarDa"; DWORD valueData = enable ? 1 : 0; LONG result = RegCreateKeyExW(HKEY_CURRENT_USER, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); if (result != ERROR_SUCCESS) { return false; } result = RegSetValueExW(hKey, valueName, 0, REG_DWORD, (const BYTE*)&valueData, sizeof(valueData)); RegCloseKey(hKey); if (result != ERROR_SUCCESS) { return false; } return true; } else if (IsWindows10OrLater0()) { return DisableInterestFeature(enable); } return false; } |
- 上面的方法,发现在个别电脑上会存在读写注册表权限问题,下面方面来处理
ComSetRegDWordValue
见下述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
bool WINAPI DisableWin10InterestFeature(bool enable) { HKEY hKey; LSTATUS res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Policies\\Microsoft\\Windows\\Windows Feeds", 0, KEY_WRITE, &hKey); if (res != ERROR_SUCCESS) { res = RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"SOFTWARE\\Policies\\Microsoft\\Windows\\Windows Feeds", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS | KEY_WOW64_64KEY, NULL, &hKey, NULL); if (res != ERROR_SUCCESS) { return false; } } DWORD value = enable ? 1 : 0; if (enable) { res = RegDeleteValueW(hKey, L"EnableFeeds"); if (res != ERROR_SUCCESS) { return false; } } else { res = RegSetValueEx(hKey, L"EnableFeeds", 0, REG_DWORD, (BYTE*)&value, sizeof(value)); if (res != ERROR_SUCCESS) { return false; } } RegCloseKey(hKey); wintools_util::RestartExplorer(); return true; } bool WINAPI DisableInterestFeature(bool enable) { if (wintools_util::IsWindows11OrLater0()) { return wintools_util::ComSetRegDWordValue( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", L"TaskbarDa", (enable ? 1 : 0)); } else if (wintools_util::IsWindows10OrLater0()) { return DisableWin10InterestFeature(enable); } return false; } |
- 监控其他产品,发现修改的地方不一样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
bool WINAPI DisableWin10InterestFeature(bool enable) { if (logger) { logger->info("DisableWin10InterestFeature : enable is {}", (int)enable); logger->flush(); } // guan 0 kai 1 HKEY hKey; LSTATUS res = RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Feeds", 0, KEY_WRITE, &hKey); if (res != ERROR_SUCCESS) { res = RegCreateKeyExW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Feeds", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS | KEY_WOW64_64KEY, NULL, &hKey, NULL); if (res != ERROR_SUCCESS) { if (logger) { logger->info("DisableWin10InterestFeature : create windowsfeeds failed."); logger->flush(); } return false; } } DWORD value = enable ? 0 : 1; res = RegSetValueEx(hKey, L"ShellFeedsTaskbarViewMode", 0, REG_DWORD, (BYTE*)&value, sizeof(value)); if (res != ERROR_SUCCESS) { if (logger) { logger->info("DisableWin10InterestFeature : set EnableFeeds failed."); logger->flush(); } return false; } RegCloseKey(hKey); wintools_util::RestartExplorer(); return true; } |
控制任务栏搜索中的广告
- 下面方法,
win10
,win11
测试可以 - 选项
true
:显示false
:不显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
bool WINAPI DisableTaskbarSearchDynamicContent(bool enable) { if (wintools_util::IsWindows10OrLater0()) { HKEY hKey; LONG result; result = RegOpenKeyExW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Feeds\\DSB", 0, KEY_WRITE, &hKey); if (result != ERROR_SUCCESS) { DWORD disposition = 0; RegCreateKeyExW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Feeds\\DSB", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &disposition); } DWORD tmp = enable ? 1 : 0; RegSetValueExW(hKey, L"ShowDynamicContent", 0, REG_DWORD, (BYTE*)&tmp, sizeof(tmp)); RegCloseKey(hKey); result = RegOpenKeyExW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\SearchSettings", 0, KEY_WRITE, &hKey); if (result != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } RegSetValueExW(hKey, L"IsDynamicSearchBoxEnabled", 0, REG_DWORD, (BYTE*)&tmp, sizeof(tmp)); RegCloseKey(hKey); wintools_util::RestartExplorer(); return true; } return false; } |
显示所有隐藏文件
- 下面方法,
win7
,win10
,win11
测试都可以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
bool show_hidden_files(bool show) { HKEY hKey; LPCWSTR subKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"; LONG result = RegCreateKeyExW(HKEY_CURRENT_USER, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); if (result != ERROR_SUCCESS) { return false; } LPCWSTR valueName = L"Hidden"; DWORD valueData = show ? 1 : 0; result = RegSetValueExW(hKey, valueName, 0, REG_DWORD, (const BYTE*)&valueData, sizeof(valueData)); if (result != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } if (IsWindows10OrLater0()) { SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); } else { SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Policy", SMTO_ABORTIFHUNG, 5000, nullptr); } HWND hwnd = nullptr; while ((hwnd = FindWindowExW(nullptr, hwnd, L"CabinetWClass", nullptr)) != nullptr) { PostMessageW(hwnd, WM_COMMAND, 0xA220, 0); // 发送刷新命令 } return true; } |
超级显示所有隐藏文件
- 在显示隐藏文件的基础上,还显示隐藏的系统文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
bool suppershow_hidden_files(bool show) { HKEY hKey; LPCWSTR subKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"; LONG result = RegCreateKeyExW(HKEY_CURRENT_USER, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); if (result != ERROR_SUCCESS) { return false; } LPCWSTR valueName = L"Hidden"; DWORD valueData = show ? 1 : 0; result = RegSetValueExW(hKey, valueName, 0, REG_DWORD, (const BYTE*)&valueData, sizeof(valueData)); if (result != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } valueName = L"ShowSuperHidden"; result = RegSetValueExW(hKey, valueName, 0, REG_DWORD, (const BYTE*)&valueData, sizeof(valueData)); if (result != ERROR_SUCCESS) { return false; } if (IsWindows10OrLater0()) { SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); } else { SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Policy", SMTO_ABORTIFHUNG, 5000, nullptr); } HWND hwnd = nullptr; while ((hwnd = FindWindowExW(nullptr, hwnd, L"CabinetWClass", nullptr)) != nullptr) { PostMessageW(hwnd, WM_COMMAND, 0xA220, 0); } return true; } |
显示文件扩展名
- 下面方法,
win7
,win10
,win11
测试都可以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
bool WINAPI show_all_files_ext(bool show) { HKEY hKey; LPCWSTR subKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"; LONG result = RegCreateKeyExW(HKEY_CURRENT_USER, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); if (result != ERROR_SUCCESS) { return false; } LPCWSTR valueName = L"HideFileExt"; DWORD valueData = show ? 0 : 1; result = RegSetValueExW(hKey, valueName, 0, REG_DWORD, (const BYTE*)&valueData, sizeof(valueData)); if (result != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } RegCloseKey(hKey); if (wintools_util::IsWindows10OrLater0()) { SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); } else { SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Policy", SMTO_ABORTIFHUNG, 5000, nullptr); } HWND hwnd = nullptr; while ((hwnd = FindWindowExW(nullptr, hwnd, L"CabinetWClass", nullptr)) != nullptr) { PostMessageW(hwnd, WM_COMMAND, 0xA220, 0); } wintools_util::RestartExplorer(); return true; } |
显示秒数
win10
,win11
测试可行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
bool WINAPI show_second_in_systemclock(bool show) { if (logger) { logger->info("show_second_in_systemclock is {}", (int)show); logger->flush(); } HKEY hKey; LPCWSTR subKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"; LONG result = RegCreateKeyExW(HKEY_CURRENT_USER, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); if (result != ERROR_SUCCESS) { return false; } LPCWSTR valueName = L"ShowSecondsInSystemClock"; DWORD valueData = show ? 1 : 0; result = RegSetValueExW(hKey, valueName, 0, REG_DWORD, (const BYTE*)&valueData, sizeof(valueData)); if (result != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } RegCloseKey(hKey); wintools_util::RestartExplorer(); return true; } |
win11右键菜单修改为win10形式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
bool WINAPI RestoreWin10ContextMenu(bool restore) { if (!wintools_util::IsWindows11OrLater0()) { if (logger) { logger->info("RestoreWin10ContextMenu not win11"); logger->flush(); } return false; } HKEY hKey; LONG result; const wchar_t* clsidPath = L"Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}"; if (restore) { result = RegCreateKeyExW(HKEY_CURRENT_USER, clsidPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_WOW64_64KEY, NULL, &hKey, NULL); if (result != ERROR_SUCCESS) { return false; } HKEY hSubKey; result = RegCreateKeyEx(hKey, L"InprocServer32", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_WOW64_64KEY, NULL, &hSubKey, NULL); if (result != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } wchar_t empty[] = L""; result = RegSetValueEx(hSubKey, L"", 0, REG_SZ, (BYTE*)empty, sizeof(empty)); if (result != ERROR_SUCCESS) { RegCloseKey(hSubKey); RegCloseKey(hKey); return false; } RegCloseKey(hSubKey); RegCloseKey(hKey); } else { HKEY hKeyTmp; result = RegOpenKeyExW(HKEY_CURRENT_USER, clsidPath, 0, KEY_WRITE | KEY_WOW64_64KEY, &hKeyTmp); if (result != ERROR_SUCCESS) { return false; } result = RegDeleteTreeW(hKeyTmp, L"InprocServer32"); RegCloseKey(hKeyTmp); if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) { return false; } } wintools_util::RestartExplorer(); return true; } |
关闭开机磁盘扫描检测
- 触发检测
1 2 3 4 5 |
# 管理员权限运行: chkntfs /d # 恢复默认设置 fsutil dirty set C: # 标记C盘为"脏盘"(模拟异常关机) shutdown /r /t 0 # 立即重启 |
- 注意
- 以管理员启动
cmd
,这个命令会导致BootExecute
的值恢复默认设置
- 以管理员启动
1 |
chkntfs /d # 恢复默认设置(不可随便执行) |
- 实现
- 下面方法,
win7
,win10
,win11
测试都可以
- 下面方法,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
bool enable_disk_check(bool enable) { HKEY hKey; LONG result; const wchar_t* clsidPath = L"SYSTEM\\CurrentControlSet\\Control\\Session Manager"; if (enable) { result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, clsidPath, 0, KEY_WRITE | KEY_WOW64_64KEY, &hKey); if (result != ERROR_SUCCESS) { return false; } wchar_t empty[] = L""; result = RegSetValueEx(hKey, L"BootExecute", 0, REG_SZ, (BYTE*)empty, sizeof(empty)); if (result != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } RegCloseKey(hKey); } else { HKEY hKey; result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, clsidPath, 0, KEY_WRITE | KEY_WOW64_64KEY, &hKey); if (result != ERROR_SUCCESS) { return false; } wchar_t content[] = L"autocheck autochk *"; result = RegSetValueEx(hKey, L"BootExecute", 0, REG_SZ, (BYTE*)content, sizeof(content)); if (result != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } } return true; } |
禁用或启用Windows
自动更新
Windows7
,Windows10
,Windows11
1 2 3 4 5 |
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\ // DWORD // 0启用,1禁用 NoAutoUpdate 1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
bool wintools_util::SetRegistrySettings(bool enable) { HKEY hKey; DWORD disposition; LONG result = RegCreateKeyEx(HKEY_LOCAL_MACHINE, REG_WU_PATH, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &disposition); if (result != ERROR_SUCCESS) { return false; } HKEY hSubKey; result = RegCreateKeyEx(hKey, L"AU", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hSubKey, &disposition); RegCloseKey(hKey); if (result != ERROR_SUCCESS) { return false; } DWORD value = enable ? 1 : 0; result = RegSetValueEx(hSubKey, L"NoAutoUpdate", 0, REG_DWORD, (const BYTE*)&value, sizeof(value)); RegCloseKey(hSubKey); if (result != ERROR_SUCCESS) { return false; } return true; } void wintools_util::RestartServices(const TCHAR* service_name) { SC_HANDLE scManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (!scManager) { return; } SC_HANDLE service = OpenService(scManager, service_name, SERVICE_START | SERVICE_STOP | SERVICE_CHANGE_CONFIG); if (!service) { DWORD err = GetLastError(); CloseServiceHandle(scManager); return; } SERVICE_STATUS status; if (!ControlService(service, SERVICE_CONTROL_STOP, &status)) { DWORD err = GetLastError(); if (err != ERROR_SERVICE_NOT_ACTIVE) { /*CloseServiceHandle(service); CloseServiceHandle(scManager); return false*/; } } if (!StartService(service, 0, NULL)) { DWORD err = GetLastError(); } CloseServiceHandle(service); CloseServiceHandle(scManager); } bool WINAPI DisableWindowsAU(bool disable) { bool res = wintools_util::SetRegistrySettings(disable); wintools_util::RestartServices(SERVICE_WU); return res; } |
- 关于修改注册表
wuauserv
服务在启动时会读取注册表中的NoAutoUpdate
值,并将其缓存到内存中- 后续即使注册表被修改,服务也不会主动重新读取旧配置,除非被显式重启
- 关于
wuauserv
(自动更新服务)- 所有自动更新的任务(如检查更新、下载补丁)均由
wuauserv
调度执行
- 所有自动更新的任务(如检查更新、下载补丁)均由
辅助函数
是否win10
以后
win11
的版本是10.0.22000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
bool IsWindows10OrLater0() { using RtlGetVersionPtr = NTSTATUS(WINAPI*)(PRTL_OSVERSIONINFOW); auto RtlGetVersion = reinterpret_cast<RtlGetVersionPtr>( GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlGetVersion")); if (!RtlGetVersion) return false; RTL_OSVERSIONINFOW info = {sizeof(info)}; if (SUCCEEDED(RtlGetVersion(&info))) { return (info.dwMajorVersion > 10) || (info.dwMajorVersion == 10 && info.dwMinorVersion >= 0); } return false; } |
是否win11
以后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
bool IsWindows11OrLater0() { using RtlGetVersionPtr = NTSTATUS(WINAPI*)(PRTL_OSVERSIONINFOW); auto RtlGetVersion = reinterpret_cast<RtlGetVersionPtr>( GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlGetVersion")); if (!RtlGetVersion) return false; RTL_OSVERSIONINFOW info = {sizeof(info)}; if (SUCCEEDED(RtlGetVersion(&info))) { return (info.dwMajorVersion > 10) || ((info.dwMajorVersion == 10) && (info.dwMinorVersion >= 0) && (info.dwBuildNumber >= 22000)); } return false; } |
重启Explore
- 下面这个方法只杀了
explorer
,但是没有重启的逻辑- 好像
win8
以后,explorer
有自己拉起的机制,因而适用
- 好像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void RestartExplorer() { HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap != INVALID_HANDLE_VALUE) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hProcessSnap, &pe32)) { do { if (_wcsicmp(pe32.szExeFile, L"explorer.exe") == 0) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID); if (hProcess) { TerminateProcess(hProcess, 0); CloseHandle(hProcess); } } } while (Process32Next(hProcessSnap, &pe32)); } CloseHandle(hProcessSnap); } } |
- 在
win7
上进行了额外的处理- 测试观察到,
win7
上也有重新拉起的能力 - 但是在个别情况下,没拉起来,导致任务栏会是一直黑的
- 下面代码,会重新拉起
explorer
,且不启动资源管理器
- 测试观察到,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
void wintools_util::RestartExplorer() { HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap != INVALID_HANDLE_VALUE) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hProcessSnap, &pe32)) { do { if (_wcsicmp(pe32.szExeFile, L"explorer.exe") == 0) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID); if (hProcess) { TerminateProcess(hProcess, 0); CloseHandle(hProcess); } } } while (Process32Next(hProcessSnap, &pe32)); } CloseHandle(hProcessSnap); } if (IsWindows7OrGreater() && !IsWindows8OrGreater()) { SHELLEXECUTEINFO sei = {sizeof(sei)}; sei.lpFile = L"explorer.exe"; sei.lpParameters = L"/noucheck"; sei.nShow = SW_HIDE; sei.fMask = SEE_MASK_NO_CONSOLE | SEE_MASK_NOASYNC; sei.lpVerb = L"open"; if (!ShellExecuteEx(&sei)) { DWORD err = GetLastError(); } } } |
检测服务状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
enum ServiceStatus { SERVICE_EXISTS, SERVICE_DELETED, SERVICE_MARKED_FOR_DELETE }; ServiceStatus GetServiceStatus(const wchar_t* serviceName) { SC_HANDLE scManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); if (!scManager) { return SERVICE_DELETED; } SC_HANDLE hService = OpenService(scManager, serviceName, SERVICE_QUERY_STATUS); if (hService) { // 服务存在 CloseServiceHandle(hService); CloseServiceHandle(scManager); return SERVICE_EXISTS; } DWORD err = GetLastError(); CloseServiceHandle(scManager); if (err == ERROR_SERVICE_DOES_NOT_EXIST) { return SERVICE_DELETED; } else if (err == ERROR_SERVICE_MARKED_FOR_DELETE) { return SERVICE_MARKED_FOR_DELETE; } return SERVICE_DELETED; } void CheckServiceStatus(const wchar_t* serviceName) { ServiceStatus status = GetServiceStatus(serviceName); switch (status) { case SERVICE_EXISTS: std::wcout << L"服务存在: " << serviceName << std::endl; break; case SERVICE_DELETED: std::wcout << L"服务已被删除: " << serviceName << std::endl; break; case SERVICE_MARKED_FOR_DELETE: std::wcout << L"服务被标记为删除: " << serviceName << std::endl; break; } } |
检测服务是否被删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
bool IsServiceDeleted(const wchar_t* serviceName) { SC_HANDLE scManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); if (!scManager) { return false; } SC_HANDLE hService = OpenService(scManager, serviceName, SERVICE_QUERY_STATUS); if (hService) { CloseServiceHandle(hService); CloseServiceHandle(scManager); return false; } DWORD err = GetLastError(); CloseServiceHandle(scManager); return (err == ERROR_SERVICE_DOES_NOT_EXIST); } |
动态库路径
- 当前
exe
或者dll
中调用,返回的是当前exe
或dll
的路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
bool wintools_util::GetCurrentDllPath(TCHAR* szPath, DWORD cchPath) { if (szPath == nullptr || cchPath == 0) { return false; } HMODULE hModule = nullptr; BOOL bSuccess = GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)GetCurrentDllPath, &hModule ); if (!bSuccess || hModule == nullptr) { return false; } DWORD cchRequired = GetModuleFileNameW(hModule, szPath, cchPath ); if (cchRequired == 0 || cchRequired >= cchPath) { return false; } return true; } |
GetLocalAppDataPath
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
std::wstring wintools_util::GetLocalAppDataPath() { const GUID FOLDERID_LocalAppData = { 0xF6D09F0C, 0x4BD7, 0x4684, {0x87, 0x28, 0x03, 0xF6, 0x3F, 0x11, 0x47, 0x38}}; wchar_t* pPath = nullptr; HRESULT hr = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &pPath); if (SUCCEEDED(hr)) { std::wstring tmp(pPath); CoTaskMemFree(pPath); return tmp; } wchar_t path[MAX_PATH] = {0}; hr = SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, path); if (SUCCEEDED(hr)) { return std::wstring(path); } return L""; } |
互斥量进程单实例
- 对
1619
(权限及子进程监控相关)内容的helper
实现进行了简化安全属性 - 优化版本
- 默认情况下,
SECURITY_ATTRIBUTES
的lpSecurityDescriptor
设为NULL
时,系统会使用默认安全策略(允许当前用户访问),无需手动配置SECURITY_DESCRIPTOR
- 默认情况下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
HANDLE InitAppMutex() { HANDLE hMutex = NULL; // 使用默认安全属性(无需自定义SECURITY_DESCRIPTOR) SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), // 结构体大小 NULL, // 默认安全描述符 FALSE // 不继承句柄 }; hMutex = CreateMutex(&sa, FALSE, L"Local\\uac_helper"); if (hMutex == NULL) { DWORD dwLastError = GetLastError(); return NULL; } DWORD dwLastError = GetLastError(); if (dwLastError == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); return NULL; } return hMutex; } |
单进程相关
- 实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
// UACHelper.cpp : 定义应用程序的入口点。 // #include "framework.h" #include "UACHelper.h" #include <shlwapi.h> #include <windows.h> #include <iostream> #include <set> #include <vector> #pragma comment(lib, "Shlwapi.lib") HANDLE InitAppMutex() { HANDLE hMutex = NULL; SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, FALSE}; hMutex = CreateMutex(&sa, FALSE, L"Local\\uac_helper"); if (hMutex == NULL) { DWORD dwLastError = GetLastError(); return NULL; } DWORD dwLastError = GetLastError(); if (dwLastError == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); return NULL; } return hMutex; } BOOL EnAbleUAC(BOOL enable) { const wchar_t* regPath = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"; BOOL value = enable; LSTATUS result = SHSetValue(HKEY_LOCAL_MACHINE, regPath, L"EnableLUA", REG_DWORD, &value, sizeof(DWORD)); if (result != ERROR_SUCCESS) { std::wcout << L"设置UAC失败" << result << std::endl; return FALSE; } return TRUE; } int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { ::MessageBox(NULL, L"2", L"1", MB_OK); if (lpCmdLine == NULL) { return -1; } if (!*lpCmdLine) { return -1; } HANDLE hd = InitAppMutex(); if (hd == NULL) { return -1; } BOOL isAdmin = FALSE; SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY; PSID adminSid = nullptr; if (!AllocateAndInitializeSid(&sia, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &adminSid)) { CloseHandle(hd); return 1; } if (!CheckTokenMembership(nullptr, adminSid, &isAdmin)) { FreeSid(adminSid); CloseHandle(hd); return 1; } FreeSid(adminSid); if (!isAdmin) { CloseHandle(hd); return 1; } BOOL bRet = 0; std::wstring tmp = lpCmdLine; if (tmp.find(L"enable") != std::wstring::npos) { bRet = EnAbleUAC(TRUE); } else if (tmp.find(L"disable") != std::wstring::npos) { bRet = EnAbleUAC(FALSE); } CloseHandle(hd); return bRet ? 0 : 1; } |
- 调起方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
bool WINAPI EnAbleUAC(BOOL enable) { TCHAR szPath[MAX_PATH]; if (wintools_util::GetCurrentDllPath(szPath, sizeof(szPath) / sizeof(TCHAR)) == FALSE) { return false; } PathRemoveFileSpec(szPath); std::wstring tPath = szPath; tPath.append(L"\\UACHelper.exe"); std::wstring tmp_str; if (enable) { tmp_str = L"enable"; } else { tmp_str = L"disable"; } std::wstring cmd = tPath + L" " + tmp_str; wchar_t buf[MAX_PATH]; wcscpy_s(buf, cmd.c_str()); SHELLEXECUTEINFO execInfo = {0}; execInfo.cbSize = sizeof(SHELLEXECUTEINFO); execInfo.fMask = SEE_MASK_NOCLOSEPROCESS; execInfo.hwnd = NULL; execInfo.lpVerb = L"runas"; execInfo.lpFile = tPath.c_str(); execInfo.lpParameters = buf; execInfo.lpDirectory = NULL; execInfo.nShow = SW_SHOW; execInfo.hInstApp = NULL; execInfo.hProcess = NULL; do { if (!ShellExecuteEx(&execInfo)) { DWORD dwError = GetLastError(); break; } if (execInfo.hProcess == NULL) { break; } WaitForSingleObject(execInfo.hProcess, INFINITE); DWORD exitCode; if (GetExitCodeProcess(execInfo.hProcess, &exitCode)) { CloseHandle(execInfo.hProcess); return (exitCode == 0) ? true : false; } } while (false); return false; } |
COM
方式读写注册表
- 这里的实现为什么用到了这个标识
init_here
- 在单独测试的过程中,没有发现问题
- 在用
electron
项目加载这个dll
,调试发现,CoInitializeEx
这里会调用失败,显示COM
已经初始化了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
bool wintools_util::ComSetRegDWordValue(HKEY hKey, LPCWSTR subKeyName, LPCWSTR valueName, DWORD value) { HRESULT hr = NULL; bool init_here = false; if (!IsCOMInitialized()) { hr = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hr)) { return false; } init_here = true; } IWbemLocator* pLoc = NULL; hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc); if (FAILED(hr)) { if (init_here) { CoUninitialize(); } return false; } IWbemServices* pSvc = NULL; hr = pLoc->ConnectServer(_bstr_t(L"ROOT\\DEFAULT"), NULL, NULL, 0, NULL, 0, 0, &pSvc); if (FAILED(hr)) { pLoc->Release(); if (init_here) { CoUninitialize(); } return false; } hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE); if (FAILED(hr)) { pSvc->Release(); pLoc->Release(); if (init_here) { CoUninitialize(); } return false; } IWbemClassObject* pClass = NULL; hr = pSvc->GetObject(_bstr_t(L"StdRegProv"), 0, NULL, &pClass, NULL); if (FAILED(hr)) { pSvc->Release(); pLoc->Release(); if (init_here) { CoUninitialize(); } return false; } IWbemClassObject* pInParams = NULL; hr = pClass->GetMethod(L"SetDWORDValue", 0, &pInParams, NULL); if (FAILED(hr)) { pClass->Release(); pSvc->Release(); pLoc->Release(); if (init_here) { CoUninitialize(); } return false; } VARIANT var; VariantInit(&var); var.vt = VT_I4; if (hKey == HKEY_CLASSES_ROOT) { var.lVal = 0x80000000; } else if (hKey == HKEY_CURRENT_USER) { var.lVal = 0x80000001; } else if (hKey == HKEY_LOCAL_MACHINE) { var.lVal = 0x80000002; } hr = pInParams->Put(L"hDefKey", 0, &var, 0); var.vt = VT_BSTR; var.bstrVal = _bstr_t(subKeyName); hr = pInParams->Put(L"sSubKeyName", 0, &var, 0); var.vt = VT_BSTR; var.bstrVal = _bstr_t(valueName); hr = pInParams->Put(L"sValueName", 0, &var, 0); var.vt = VT_I4; var.lVal = 0; var.lVal = value; hr = pInParams->Put(L"uValue", 0, &var, 0); IWbemClassObject* pOutParams = NULL; hr = pSvc->ExecMethod(_bstr_t(L"StdRegProv"), _bstr_t(L"SetDWORDValue"), 0, NULL, pInParams, &pOutParams, NULL); pInParams->Release(); if (pOutParams) { pOutParams->Release(); } pClass->Release(); pSvc->Release(); pLoc->Release(); if (init_here) { CoUninitialize(); } return SUCCEEDED(hr); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
bool wintools_util::ComGetRegDWordValue(HKEY hKey, LPCWSTR subKeyName, LPCWSTR valueName, DWORD& ret) { bool res = false; HRESULT hr = NULL; bool init_here = false; if (!IsCOMInitialized()) { hr = CoInitializeEx(0, COINIT_APARTMENTTHREADED); if (FAILED(hr)) { return false; } init_here = true; } IWbemLocator* pLoc = NULL; hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc); if (FAILED(hr)) { if (init_here) { CoUninitialize(); } return false; } IWbemServices* pSvc = NULL; hr = pLoc->ConnectServer(_bstr_t(L"ROOT\\DEFAULT"), NULL, NULL, 0, NULL, 0, 0, &pSvc); if (FAILED(hr)) { pLoc->Release(); if (init_here) { CoUninitialize(); } return false; } hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE); if (FAILED(hr)) { pSvc->Release(); pLoc->Release(); if (init_here) { CoUninitialize(); } return false; } IWbemClassObject* pClass = NULL; hr = pSvc->GetObject(_bstr_t(L"StdRegProv"), 0, NULL, &pClass, NULL); if (FAILED(hr)) { pSvc->Release(); pLoc->Release(); if (init_here) { CoUninitialize(); } return false; } IWbemClassObject* pInParams = NULL; hr = pClass->GetMethod(L"GetDWORDValue", 0, &pInParams, NULL); if (FAILED(hr)) { pClass->Release(); pSvc->Release(); pLoc->Release(); if (init_here) { CoUninitialize(); } return false; } VARIANT var; VariantInit(&var); var.vt = VT_I4; if (hKey == HKEY_CLASSES_ROOT) { var.lVal = 0x80000000; } else if (hKey == HKEY_CURRENT_USER) { var.lVal = 0x80000001; } else if (hKey == HKEY_LOCAL_MACHINE) { var.lVal = 0x80000002; } hr = pInParams->Put(L"hDefKey", 0, &var, 0); var.vt = VT_BSTR; var.bstrVal = _bstr_t(subKeyName); hr = pInParams->Put(L"sSubKeyName", 0, &var, 0); var.vt = VT_BSTR; var.bstrVal = _bstr_t(valueName); hr = pInParams->Put(L"sValueName", 0, &var, 0); IWbemClassObject* pOutParams = NULL; hr = pSvc->ExecMethod(_bstr_t(L"StdRegProv"), _bstr_t(L"GetDWORDValue"), 0, NULL, pInParams, &pOutParams, NULL); pInParams->Release(); if (FAILED(hr) || !pOutParams) { pClass->Release(); pSvc->Release(); pLoc->Release(); if (init_here) { CoUninitialize(); } return false; } VARIANT retVal; VariantInit(&retVal); hr = pOutParams->Get(L"ReturnValue", 0, &retVal, NULL, NULL); if (SUCCEEDED(hr) && retVal.vt == VT_I4) { if (retVal.lVal == 0) { VARIANT uValue; VariantInit(&uValue); hr = pOutParams->Get(L"uValue", 0, &uValue, NULL, NULL); if (SUCCEEDED(hr) && uValue.vt == VT_I4) { ret = uValue.lVal; VariantClear(&uValue); VariantClear(&retVal); pOutParams->Release(); pClass->Release(); pSvc->Release(); pLoc->Release(); if (init_here) { CoUninitialize(); } } else { VariantClear(&uValue); return false; } } else { return false; } } else { VariantClear(&retVal); pOutParams->Release(); pClass->Release(); pSvc->Release(); pLoc->Release(); if (init_here) { CoUninitialize(); } return false; } return true; } |
注册表判断子键是否存在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
bool wintools_util::DoesSubKeyExist(HKEY hParentKey, LPCWSTR subKeyName) { if (hParentKey == nullptr) { return false; } DWORD index = 0; DWORD nameSize = 256; std::vector<WCHAR> keyName; while (true) { keyName.resize(nameSize / sizeof(WCHAR)); LSTATUS lResult = RegEnumKeyW(hParentKey, index, keyName.data(), nameSize); if (lResult == ERROR_SUCCESS) { if (_wcsicmp(keyName.data(), subKeyName) == 0) { return true; } index++; } else if (lResult == ERROR_NO_MORE_ITEMS) { break; } else if (lResult == ERROR_MORE_DATA) { continue; } else { return false; } } return false; } |
注册表判断值是否存在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
bool wintools_util::DoesValueExist(HKEY hRootKey, LPCWSTR subKeyPath, LPCWSTR valueName, DWORD targetType) { HKEY hKey = nullptr; LSTATUS lResult = RegOpenKeyExW(hRootKey, subKeyPath, 0, KEY_READ | KEY_WOW64_64KEY, &hKey); if (lResult != ERROR_SUCCESS) { return false; } DWORD dwType = 0; DWORD cbData = 0; lResult = RegQueryValueExW(hKey, valueName, nullptr, &dwType, nullptr, &cbData); if (lResult != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } if (dwType != targetType) { RegCloseKey(hKey); return false; } if (targetType == REG_SZ) { std::wstring value; value.resize(cbData / sizeof(wchar_t)); lResult = RegQueryValueExW(hKey, valueName, nullptr, &dwType, reinterpret_cast<LPBYTE>(&value[0]), &cbData); if (lResult != ERROR_SUCCESS || value.empty()) { RegCloseKey(hKey); return false; } } else if (targetType == REG_DWORD) { DWORD value = 0; lResult = RegQueryValueExW(hKey, valueName, nullptr, &dwType, reinterpret_cast<LPBYTE>(&value), &cbData); if (lResult != ERROR_SUCCESS || cbData != sizeof(DWORD)) { RegCloseKey(hKey); return false; } } else if (targetType == REG_BINARY) { std::vector<BYTE> binaryData(cbData); lResult = RegQueryValueExW(hKey, valueName, nullptr, &dwType, binaryData.data(), &cbData); if (lResult != ERROR_SUCCESS || binaryData.size() != cbData) { RegCloseKey(hKey); return false; } } else { RegCloseKey(hKey); return false; } RegCloseKey(hKey); return true; } |
桌面路径
1 2 3 4 |
bool wintools_util::GetDesktopPath(WCHAR* path, DWORD size) { return SHGetFolderPathW(NULL, CSIDL_DESKTOP, NULL, SHGFP_TYPE_CURRENT, path) == S_OK; } |
COM
是否初始化
1 2 3 4 5 |
bool wintools_util::IsCOMInitialized() { APTTYPE aptType; APTTYPEQUALIFIER aptQualifier; return SUCCEEDED(CoGetApartmentType(&aptType, &aptQualifier)); } |
关于任务栏创建监控
TaskbarCreated
对应的消息
1 |
msg_taskbar_restart_ = RegisterWindowMessage(TEXT("TaskbarCreated")); |
- 消息映射函数
1 2 3 4 |
BEGIN_MSG_MAP_EX(MessageLoop) MESSAGE_HANDLER(msg_taskbar_restart_, OnTaskbarCreated) //REGISTERED_MESSAGE_HANDLER_EX(msg_taskbar_restart_, OnTaskbarCreated) END_MSG_MAP() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
LRESULT MessageLoop::OnTaskbarCreated(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { /*if (cb_) { cb_("taskbar"); }*/ /*if (!flag.load()) { flag.store(true); }*/ //::MessageBox(NULL, L"OnTaskbarCreated", L"OnTaskbarCreated", MB_OK); return 0; } |
声明:本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Soui一03/17
- ♥ WTL 概述03/10
- ♥ Windows 核心编程 _ 内核对象:同步异步设备IO08/24
- ♥ Windows 核心编程 _ 进程三06/19
- ♥ X86_64汇编学习记述三08/08
- ♥ COM组件_207/22