You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
336 lines
13 KiB
336 lines
13 KiB
#include "SettingsMonitor.h" |
|
|
|
DWORD MonitorSettingsChanges(SettingsChangeParameters* params) |
|
{ |
|
HMODULE hModule = LoadLibraryW(L"Shlwapi.dll"); |
|
if (hModule) |
|
{ |
|
FARPROC SHRegGetValueFromHKCUHKLMFunc = GetProcAddress(hModule, "SHRegGetValueFromHKCUHKLM"); |
|
DWORD dwSize = sizeof(DWORD); |
|
LONG lRes = ERROR_SUCCESS; |
|
HKEY hKeyCU, hKeyLM; |
|
|
|
dwSize = sizeof(DWORD); |
|
DWORD dwInitialTaskbarAl = 0, dwTaskbarAl = 0, dwInitialTaskbarAlWas = 0; |
|
if (!SHRegGetValueFromHKCUHKLMFunc || SHRegGetValueFromHKCUHKLMFunc( |
|
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"), |
|
TEXT("TaskbarAl"), |
|
SRRF_RT_REG_DWORD, |
|
NULL, |
|
&dwInitialTaskbarAl, |
|
(LPDWORD)(&dwSize) |
|
) != ERROR_SUCCESS) |
|
{ |
|
dwInitialTaskbarAl = 0; |
|
} |
|
else |
|
{ |
|
dwInitialTaskbarAlWas = 1; |
|
} |
|
|
|
dwSize = sizeof(DWORD); |
|
DWORD dwInitialMaximumFrequentApps = 6, dwMaximumFrequentApps = 6, dwInitialMaximumFrequentAppsWas = 0; |
|
if (!SHRegGetValueFromHKCUHKLMFunc || SHRegGetValueFromHKCUHKLMFunc( |
|
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"), |
|
TEXT("Start_MaximumFrequentApps"), |
|
SRRF_RT_REG_DWORD, |
|
NULL, |
|
&dwInitialMaximumFrequentApps, |
|
(LPDWORD)(&dwSize) |
|
) != ERROR_SUCCESS) |
|
{ |
|
dwInitialMaximumFrequentApps = 6; |
|
} |
|
else |
|
{ |
|
dwInitialMaximumFrequentAppsWas = 1; |
|
} |
|
|
|
while (TRUE) |
|
{ |
|
lRes = RegOpenKeyExW( |
|
HKEY_CURRENT_USER, |
|
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"), |
|
0, |
|
KEY_READ, |
|
&hKeyCU |
|
); |
|
if (hKeyCU == NULL || hKeyCU == INVALID_HANDLE_VALUE) |
|
{ |
|
hKeyCU = NULL; |
|
} |
|
if (lRes != ERROR_SUCCESS) |
|
{ |
|
return 0; |
|
} |
|
HANDLE hEvHKCU = CreateEvent(NULL, FALSE, FALSE, NULL); |
|
if (hEvHKCU == NULL || hEvHKCU == INVALID_HANDLE_VALUE) |
|
{ |
|
hEvHKCU = NULL; |
|
return 0; |
|
} |
|
RegNotifyChangeKeyValue( |
|
hKeyCU, |
|
FALSE, |
|
REG_NOTIFY_CHANGE_LAST_SET, |
|
hEvHKCU, |
|
TRUE |
|
); |
|
|
|
lRes = RegOpenKeyExW( |
|
HKEY_LOCAL_MACHINE, |
|
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"), |
|
0, |
|
KEY_READ, |
|
&hKeyLM |
|
); |
|
if (hKeyLM == NULL || hKeyLM == INVALID_HANDLE_VALUE) |
|
{ |
|
hKeyLM = NULL; |
|
} |
|
if (lRes != ERROR_SUCCESS) |
|
{ |
|
return 0; |
|
} |
|
HANDLE hEvHKLM = CreateEvent(NULL, FALSE, FALSE, NULL); |
|
if (hEvHKLM == NULL || hEvHKLM == INVALID_HANDLE_VALUE) |
|
{ |
|
hEvHKLM = NULL; |
|
return 0; |
|
} |
|
RegNotifyChangeKeyValue( |
|
hKeyLM, |
|
FALSE, |
|
REG_NOTIFY_CHANGE_LAST_SET, |
|
hEvHKLM, |
|
TRUE |
|
); |
|
printf("!!! Setup monitor %d %d\n", hEvHKCU, hEvHKLM); |
|
|
|
HANDLE hEvents[2]; |
|
hEvents[0] = hEvHKCU; |
|
hEvents[1] = hEvHKLM; |
|
DWORD rv = WaitForMultipleObjects( |
|
2, |
|
hEvents, |
|
FALSE, |
|
INFINITE |
|
); |
|
if (rv == WAIT_OBJECT_0) |
|
{ |
|
dwSize = sizeof(DWORD); |
|
lRes = RegQueryValueExW( |
|
hKeyCU, |
|
TEXT("TaskbarAl"), |
|
0, |
|
NULL, |
|
&dwTaskbarAl, |
|
&dwSize |
|
); |
|
if (lRes != ERROR_SUCCESS && dwInitialTaskbarAlWas) |
|
{ |
|
if (params->TaskbarAlChangedCallback) |
|
{ |
|
void* p = 0; |
|
if (params->TaskbarAlChangedCallbackData) |
|
{ |
|
p = params->TaskbarAlChangedCallbackData; |
|
} |
|
params->TaskbarAlChangedCallback(p, dwTaskbarAl); |
|
} |
|
else |
|
{ |
|
exit(0); |
|
} |
|
dwInitialTaskbarAl = dwTaskbarAl; |
|
} |
|
if (lRes == ERROR_SUCCESS && dwTaskbarAl != dwInitialTaskbarAl) |
|
{ |
|
if (params->TaskbarAlChangedCallback) |
|
{ |
|
void* p = 0; |
|
if (params->TaskbarAlChangedCallbackData) |
|
{ |
|
p = params->TaskbarAlChangedCallbackData; |
|
} |
|
params->TaskbarAlChangedCallback(p, dwTaskbarAl); |
|
} |
|
else |
|
{ |
|
exit(0); |
|
} |
|
dwInitialTaskbarAl = dwTaskbarAl; |
|
} |
|
|
|
if (params->isStartMenuExperienceHost) |
|
{ |
|
dwSize = sizeof(DWORD); |
|
lRes = RegQueryValueExW( |
|
hKeyCU, |
|
TEXT("Start_MaximumFrequentApps"), |
|
0, |
|
NULL, |
|
&dwMaximumFrequentApps, |
|
&dwSize |
|
); |
|
if (lRes != ERROR_SUCCESS && dwInitialMaximumFrequentAppsWas) |
|
{ |
|
if (params->Start_MaximumRecentAppsChangedCallback) |
|
{ |
|
void* p = 0; |
|
if (params->Start_MaximumRecentAppsChangedCallbackData) |
|
{ |
|
p = params->Start_MaximumRecentAppsChangedCallbackData; |
|
} |
|
params->Start_MaximumRecentAppsChangedCallback(p, dwMaximumFrequentApps); |
|
} |
|
else |
|
{ |
|
exit(0); |
|
} |
|
dwInitialMaximumFrequentApps = dwMaximumFrequentApps; |
|
} |
|
if (lRes == ERROR_SUCCESS && dwMaximumFrequentApps != dwInitialMaximumFrequentApps) |
|
{ |
|
if (params->Start_MaximumRecentAppsChangedCallback) |
|
{ |
|
void* p = 0; |
|
if (params->Start_MaximumRecentAppsChangedCallbackData) |
|
{ |
|
p = params->Start_MaximumRecentAppsChangedCallbackData; |
|
} |
|
params->Start_MaximumRecentAppsChangedCallback(p, dwMaximumFrequentApps); |
|
} |
|
else |
|
{ |
|
exit(0); |
|
} |
|
dwInitialMaximumFrequentApps = dwMaximumFrequentApps; |
|
} |
|
} |
|
} |
|
else if (rv == WAIT_OBJECT_0 + 1) |
|
{ |
|
dwSize = sizeof(DWORD); |
|
lRes = RegQueryValueExW( |
|
hKeyCU, |
|
TEXT("TaskbarAl"), |
|
0, |
|
NULL, |
|
&dwTaskbarAl, |
|
&dwSize |
|
); |
|
if (lRes != ERROR_SUCCESS) |
|
{ |
|
dwSize = sizeof(DWORD); |
|
lRes = RegQueryValueExW( |
|
hKeyLM, |
|
TEXT("TaskbarAl"), |
|
0, |
|
NULL, |
|
&dwTaskbarAl, |
|
&dwSize |
|
); |
|
if (lRes != ERROR_SUCCESS && dwInitialTaskbarAlWas) |
|
{ |
|
if (params->TaskbarAlChangedCallback) |
|
{ |
|
void* p = 0; |
|
if (params->TaskbarAlChangedCallbackData) |
|
{ |
|
p = params->TaskbarAlChangedCallbackData; |
|
} |
|
params->TaskbarAlChangedCallback(p, dwTaskbarAl); |
|
} |
|
else |
|
{ |
|
exit(0); |
|
} |
|
dwInitialTaskbarAl = dwTaskbarAl; |
|
} |
|
if (lRes == ERROR_SUCCESS && dwTaskbarAl != dwInitialTaskbarAl) |
|
{ |
|
if (params->TaskbarAlChangedCallback) |
|
{ |
|
void* p = 0; |
|
if (params->TaskbarAlChangedCallbackData) |
|
{ |
|
p = params->TaskbarAlChangedCallbackData; |
|
} |
|
params->TaskbarAlChangedCallback(p, dwTaskbarAl); |
|
} |
|
else |
|
{ |
|
exit(0); |
|
} |
|
dwInitialTaskbarAl = dwTaskbarAl; |
|
} |
|
} |
|
|
|
if (params->isStartMenuExperienceHost) |
|
{ |
|
dwSize = sizeof(DWORD); |
|
lRes = RegQueryValueExW( |
|
hKeyCU, |
|
TEXT("Start_MaximumFrequentApps"), |
|
0, |
|
NULL, |
|
&dwMaximumFrequentApps, |
|
&dwSize |
|
); |
|
if (lRes != ERROR_SUCCESS) |
|
{ |
|
dwSize = sizeof(DWORD); |
|
lRes = RegQueryValueExW( |
|
hKeyLM, |
|
TEXT("Start_MaximumFrequentApps"), |
|
0, |
|
NULL, |
|
&dwMaximumFrequentApps, |
|
&dwSize |
|
); |
|
if (lRes != ERROR_SUCCESS && dwInitialMaximumFrequentAppsWas) |
|
{ |
|
if (params->Start_MaximumRecentAppsChangedCallback) |
|
{ |
|
void* p = 0; |
|
if (params->Start_MaximumRecentAppsChangedCallbackData) |
|
{ |
|
p = params->Start_MaximumRecentAppsChangedCallbackData; |
|
} |
|
params->Start_MaximumRecentAppsChangedCallback(p, dwMaximumFrequentApps); |
|
} |
|
else |
|
{ |
|
exit(0); |
|
} |
|
dwInitialMaximumFrequentApps = dwMaximumFrequentApps; |
|
} |
|
if (lRes == ERROR_SUCCESS && dwMaximumFrequentApps != dwInitialMaximumFrequentApps) |
|
{ |
|
if (params->Start_MaximumRecentAppsChangedCallback) |
|
{ |
|
void* p = 0; |
|
if (params->Start_MaximumRecentAppsChangedCallbackData) |
|
{ |
|
p = params->Start_MaximumRecentAppsChangedCallbackData; |
|
} |
|
params->Start_MaximumRecentAppsChangedCallback(p, dwMaximumFrequentApps); |
|
} |
|
else |
|
{ |
|
exit(0); |
|
} |
|
dwInitialMaximumFrequentApps = dwMaximumFrequentApps; |
|
} |
|
} |
|
} |
|
} |
|
|
|
if (hEvHKCU) CloseHandle(hEvHKCU); |
|
if (hEvHKLM) CloseHandle(hEvHKLM); |
|
if (hKeyCU) RegCloseKey(hKeyCU); |
|
if (hKeyLM) RegCloseKey(hKeyLM); |
|
} |
|
} |
|
} |