diff --git a/ExplorerPatcher/ExplorerPatcher.vcxproj b/ExplorerPatcher/ExplorerPatcher.vcxproj
index 31f56dd..d973142 100644
--- a/ExplorerPatcher/ExplorerPatcher.vcxproj
+++ b/ExplorerPatcher/ExplorerPatcher.vcxproj
@@ -117,6 +117,7 @@
true
$(SolutionDir)libs\funchook\build\Release\;$(SolutionDir)libs\Detours\lib.X64;%(AdditionalLibraryDirectories)
%(AdditionalDependencies)
+ Winmm.dll
@@ -147,6 +148,7 @@
true
$(SolutionDir)libs\funchook\build\Release\;$(SolutionDir)libs\Detours\lib.X64;%(AdditionalLibraryDirectories)
%(AdditionalDependencies)
+ Winmm.dll
@@ -174,6 +176,7 @@
true
$(SolutionDir)libs\funchook\build\Release\;$(SolutionDir)libs\Detours\lib.X64;%(AdditionalLibraryDirectories)
%(AdditionalDependencies)
+ Winmm.dll
@@ -201,6 +204,7 @@
true
$(SolutionDir)libs\funchook\build\Release\;$(SolutionDir)libs\Detours\lib.X64;%(AdditionalLibraryDirectories)
%(AdditionalDependencies)
+ Winmm.dll
@@ -284,7 +288,7 @@
true
true
-
+
true
true
diff --git a/ExplorerPatcher/StartupSound.c b/ExplorerPatcher/StartupSound.c
deleted file mode 100644
index 007cde4..0000000
--- a/ExplorerPatcher/StartupSound.c
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "StartupSound.h"
-
-DWORD PlayStartupSound(PlayStartupSoundParams* unused)
-{
- Sleep(2000);
- printf("Started \"Play startup sound\" thread.\n");
-
- HRESULT hr = CoInitialize(NULL);
-
- // this checks Software\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\LogonSoundPlayed
- // and then plays the startup sound
-
- AuthUILogonSound* ppv;
- hr = CoCreateInstance(
- &__uuidof_AuthUILogonSound,
- NULL,
- CLSCTX_INPROC_SERVER,
- &__uuidof_IAuthUILogonSound,
- &ppv
- );
- if (SUCCEEDED(hr))
- {
- ppv->lpVtbl->PlayIfNecessary(ppv, 1);
- ppv->lpVtbl->Release(ppv);
- }
-
- printf("Ended \"Play startup sound\" thread.\n");
- return 0;
-}
\ No newline at end of file
diff --git a/ExplorerPatcher/StartupSound.cpp b/ExplorerPatcher/StartupSound.cpp
new file mode 100644
index 0000000..8319e3d
--- /dev/null
+++ b/ExplorerPatcher/StartupSound.cpp
@@ -0,0 +1,390 @@
+#include "StartupSound.h"
+
+#include
+#pragma comment(lib, "Shlwapi.lib")
+#include
+#include
+#pragma comment(lib, "Winmm.lib")
+#include
+#pragma comment(lib, "Wtsapi32.lib")
+#include
+#include
+#include
+
+#include "def.h"
+
+BOOL AreLogonLogoffShutdownSoundsEnabled()
+{
+#if 0
+ DWORD dwValue = 0;
+ DWORD dwSize = sizeof(dwValue);
+ RegGetValueW(HKEY_CURRENT_USER, _T(REGPATH), L"LogonLogoffShutdownSounds", RRF_RT_DWORD, nullptr, &dwValue, &dwSize);
+ return dwValue != 0;
+#else
+ return FALSE;
+#endif
+}
+
+DWORD GetLastErrorError()
+{
+ DWORD result = GetLastError();
+ return result == ERROR_SUCCESS ? 1 : result;
+}
+
+HRESULT HRESULTFromLastErrorError()
+{
+ DWORD error = GetLastError();
+ if (error != ERROR_SUCCESS && (int)error <= 0)
+ return (HRESULT)GetLastErrorError();
+ else
+ return (HRESULT)((GetLastErrorError() & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000);
+}
+
+DWORD PlaySoundFileThreadProc(LPVOID pvData)
+{
+ PlaySoundW((LPCWSTR)pvData, nullptr, SND_NODEFAULT | SND_MEMORY | SND_SYSTEM);
+ LocalFree(pvData);
+ return 0;
+}
+
+HRESULT PlaySoundFile(HANDLE* phThread, const WCHAR* pszPath)
+{
+ HRESULT hr;
+
+ void* pvData = nullptr;
+ HANDLE hFile = CreateFileW(
+ pszPath,
+ GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_DELETE,
+ nullptr,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
+ nullptr
+ );
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ DWORD dwSize = GetFileSize(hFile, nullptr);
+ hr = E_OUTOFMEMORY;
+ if (dwSize != (DWORD)-1 && dwSize)
+ {
+ if (dwSize < 0x400000)
+ {
+ pvData = LocalAlloc(0, dwSize);
+ if (pvData)
+ {
+ DWORD dwRead;
+ if (ReadFile(hFile, pvData, dwSize, &dwRead, nullptr))
+ hr = dwSize == dwRead ? S_OK : HRESULT_FROM_WIN32(ERROR_IO_PENDING);
+ else
+ hr = HRESULTFromLastErrorError();
+ }
+ }
+ }
+ else
+ {
+ hr = HRESULTFromLastErrorError();
+ }
+ CloseHandle(hFile);
+ }
+ else
+ {
+ hr = HRESULTFromLastErrorError();
+ }
+ if (SUCCEEDED(hr))
+ {
+ HANDLE hThread = CreateThread(nullptr, 0, PlaySoundFileThreadProc, pvData, 0, nullptr);
+ if (hThread)
+ {
+ if (phThread)
+ *phThread = hThread;
+ else
+ CloseHandle(hThread);
+ return hr;
+ }
+ hr = HRESULTFromLastErrorError();
+ }
+ if (pvData)
+ LocalFree(pvData);
+ return hr;
+}
+
+typedef enum LOGONOFFSOUNDTYPE
+{
+ LOGONOFFSOUNDTYPE_LOGON,
+ LOGONOFFSOUNDTYPE_LOGOFF,
+ LOGONOFFSOUNDTYPE_EXIT,
+} LOGONOFFSOUNDTYPE;
+
+HRESULT PlayLogonLogoffSound(HANDLE* phThread, LOGONOFFSOUNDTYPE type)
+{
+ const WCHAR* szEventName;
+ switch (type)
+ {
+ case LOGONOFFSOUNDTYPE_LOGON:
+ szEventName = L"WindowsLogon";
+ break;
+ case LOGONOFFSOUNDTYPE_LOGOFF:
+ szEventName = L"WindowsLogoff";
+ break;
+ default:
+ szEventName = L"SystemExit";
+ break;
+ }
+
+ WCHAR szSubKey[MAX_PATH];
+ HRESULT hr = StringCchPrintfW(szSubKey, ARRAYSIZE(szSubKey), L"AppEvents\\Schemes\\Apps\\.Default\\%ws\\.Current", szEventName);
+ if (FAILED(hr))
+ return hr;
+
+ WCHAR szPath[MAX_PATH];
+ DWORD cbData = sizeof(szPath);
+ LSTATUS lStat = RegGetValueW(HKEY_CURRENT_USER, szSubKey, nullptr, REG_EXPAND_SZ, nullptr, szPath, &cbData);
+ if (lStat != ERROR_SUCCESS)
+ return HRESULT_FROM_WIN32(lStat);
+
+ return PlaySoundFile(phThread, szPath);
+}
+
+// https://stackoverflow.com/a/59810748
+bool IsSessionLocked()
+{
+ WTSINFOEXW* pInfo = NULL;
+ WTS_INFO_CLASS wtsic = WTSSessionInfoEx;
+ LPTSTR ppBuffer = NULL;
+ DWORD dwBytesReturned = 0;
+ LONG sessionFlags = WTS_SESSIONSTATE_UNKNOWN;
+
+ DWORD dwSessionID = WTSGetActiveConsoleSessionId();
+
+ if (WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, dwSessionID, wtsic, &ppBuffer, &dwBytesReturned))
+ {
+ if (dwBytesReturned > 0)
+ {
+ pInfo = (WTSINFOEXW*)ppBuffer;
+ if (pInfo->Level == 1)
+ {
+ sessionFlags = pInfo->Data.WTSInfoExLevel1.SessionFlags;
+ }
+ }
+ WTSFreeMemory(ppBuffer);
+ ppBuffer = NULL;
+ }
+
+ return (sessionFlags == WTS_SESSIONSTATE_LOCK);
+}
+
+HRESULT (*CLogonSound_PlayIfNecessaryFunc)(void* _this, LOGON_SOUND_CLIENT client);
+HRESULT CLogonSound_PlayIfNecessaryHook(void* _this, LOGON_SOUND_CLIENT client)
+{
+ HRESULT hr = CLogonSound_PlayIfNecessaryFunc(_this, client);
+ if (hr != S_OK && client == LSC_EXPLORER)
+ {
+ if (!IsSessionLocked())
+ PlayLogonLogoffSound(nullptr, LOGONOFFSOUNDTYPE_LOGON);
+ }
+ return hr;
+}
+
+HRESULT HookLogonSound()
+{
+ RETURN_IF_FAILED(CoInitialize(nullptr));
+
+ Microsoft::WRL::ComPtr logonSound;
+ RETURN_IF_FAILED(CoCreateInstance(__uuidof_AuthUILogonSound, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&logonSound)));
+
+ void** vtable = *(void***)logonSound.Get();
+ DWORD flOldProtect;
+ RETURN_HR_IF(E_FAIL, !VirtualProtect(&vtable[3], sizeof(void*), PAGE_EXECUTE_READWRITE, &flOldProtect));
+
+ CLogonSound_PlayIfNecessaryFunc = (decltype(CLogonSound_PlayIfNecessaryFunc))vtable[3];
+ vtable[3] = (void*)CLogonSound_PlayIfNecessaryHook;
+ VirtualProtect(&vtable[3], sizeof(void*), flOldProtect, &flOldProtect);
+
+ return S_OK;
+}
+
+LRESULT SHDefWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ if (IsWindowUnicode(hwnd))
+ {
+ return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+ }
+ else
+ {
+ return DefWindowProcA(hwnd, uMsg, wParam, lParam);
+ }
+}
+
+HWND g_hwndSound;
+
+class CSoundWnd
+{
+public:
+ CSoundWnd();
+
+ BOOL Init();
+ DWORD Release();
+
+protected:
+ static LRESULT CALLBACK s_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+ LRESULT v_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+private:
+ static DWORD s_CreateWindow(void* pvParam);
+ static DWORD s_ThreadProc(void* pvParam);
+
+ LONG m_refCount;
+ HWND m_hwnd;
+ HANDLE m_thread;
+};
+
+CSoundWnd::CSoundWnd()
+ : m_refCount(1)
+ , m_hwnd(nullptr)
+ , m_thread(nullptr)
+{
+}
+
+BOOL CSoundWnd::Init()
+{
+ SHCreateThread(s_ThreadProc, this, CTF_THREAD_REF | CTF_COINIT_STA | CTF_REF_COUNTED | CTF_NOADDREFLIB, s_CreateWindow);
+ g_hwndSound = m_hwnd;
+ return m_hwnd != nullptr;
+}
+
+DWORD CSoundWnd::Release()
+{
+ LONG refCount = InterlockedDecrement(&m_refCount);
+ if (refCount == 0 && this)
+ operator delete(this);
+ return refCount;
+}
+
+LRESULT CSoundWnd::s_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ CSoundWnd* pThis = (CSoundWnd*)GetWindowLongPtrW(hwnd, 0);
+ if (pThis)
+ return pThis->v_WndProc(hwnd, uMsg, wParam, lParam);
+ else
+ return SHDefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
+LRESULT CSoundWnd::v_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_QUERYENDSESSION:
+ {
+ if ((lParam & ENDSESSION_CRITICAL) == 0)
+ {
+ WCHAR sz[256];
+ LoadStringW(GetModuleHandleW(nullptr), 731, sz, ARRAYSIZE(sz)); // Playing logoff sound...
+ ShutdownBlockReasonCreate(m_hwnd, sz);
+ PlayLogonLogoffSound(&m_thread, (lParam & ENDSESSION_LOGOFF) != 0 ? LOGONOFFSOUNDTYPE_LOGOFF : LOGONOFFSOUNDTYPE_EXIT);
+ if (m_thread)
+ {
+ WaitForSingleObject(m_thread, INFINITE); // @MOD
+ CloseHandle(m_thread); // @MOD
+ }
+ }
+ return 1;
+ }
+ case WM_ENDSESSION:
+ {
+ /*if (wParam && (lParam & ENDSESSION_CRITICAL) == 0 && m_thread) // @MOD This doesn't work
+ {
+ WaitForSingleObject(m_thread, INFINITE);
+ CloseHandle(m_thread);
+ }*/
+ DestroyWindow(m_hwnd);
+ break;
+ }
+ case WM_NCDESTROY:
+ {
+ SetWindowLongW(hwnd, 0, 0);
+ g_hwndSound = nullptr;
+ m_hwnd = nullptr;
+ PostQuitMessage(0);
+ return 0;
+ }
+ }
+ return SHDefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
+extern "C" HWND (__stdcall *explorerframe_SHCreateWorkerWindowFunc)(
+ WNDPROC wndProc,
+ HWND hWndParent,
+ DWORD dwExStyle,
+ DWORD dwStyle,
+ HMENU hMenu,
+ LONG_PTR wnd_extra
+);
+
+DWORD CSoundWnd::s_CreateWindow(void* pvParam)
+{
+ CSoundWnd* pThis = (CSoundWnd*)pvParam;
+ InterlockedIncrement(&pThis->m_refCount);
+ pThis->m_hwnd = explorerframe_SHCreateWorkerWindowFunc(s_WndProc, nullptr, 0, 0, nullptr, (LONG_PTR)pThis);
+ return 0;
+}
+
+DWORD CSoundWnd::s_ThreadProc(void* pvParam)
+{
+ CSoundWnd* pThis = (CSoundWnd*)pvParam;
+ if (pThis->m_hwnd)
+ {
+ MSG Msg;
+ while (GetMessageW(&Msg, nullptr, 0, 0))
+ {
+ TranslateMessage(&Msg);
+ DispatchMessageW(&Msg);
+ }
+ }
+ pThis->Release();
+ return 0;
+}
+
+BOOL InitSoundWindow()
+{
+ BOOL bSuccess = FALSE;
+ CSoundWnd* soundWnd = new CSoundWnd();
+ if (soundWnd)
+ {
+ bSuccess = soundWnd->Init();
+ soundWnd->Release();
+ }
+ return bSuccess;
+}
+
+void TermSoundWindow()
+{
+ if (g_hwndSound)
+ {
+ PostMessageW(g_hwndSound, WM_CLOSE, 0, 0);
+ g_hwndSound = nullptr;
+ }
+}
+
+HRESULT SHPlaySound(LPCWSTR pszSound, DWORD dwFlags)
+{
+ HRESULT hr;
+ BOOL bDefault = (dwFlags & 1) != 0;
+ BOOL bSecondAttempt = FALSE;
+ while (true)
+ {
+ WCHAR szKey[MAX_PATH];
+ hr = StringCchPrintfW(szKey, MAX_PATH, L"AppEvents\\Schemes\\Apps\\%s\\%s\\.current", bDefault ? L".Default" : L"Explorer", pszSound);
+ if (SUCCEEDED(hr))
+ {
+ WCHAR pvData[MAX_PATH];
+ DWORD cbData = sizeof(pvData);
+ if (SHGetValueW(HKEY_CURRENT_USER, szKey, nullptr, nullptr, pvData, &cbData) == ERROR_SUCCESS && cbData && pvData[0])
+ hr = PlaySoundW(pszSound, nullptr, (!bDefault ? 0x400000 : 0) | (SND_ASYNC | SND_NODEFAULT | SND_NOSTOP | SND_NOWAIT | SND_ALIAS | SND_SENTRY | SND_SYSTEM)) ? S_OK : S_FALSE;
+ }
+ if (hr == S_OK || (dwFlags & 2) == 0 || bSecondAttempt)
+ break;
+ bDefault = !bDefault;
+ bSecondAttempt = TRUE;
+ }
+ return hr;
+}
diff --git a/ExplorerPatcher/StartupSound.h b/ExplorerPatcher/StartupSound.h
index 56d41f2..69ba40c 100644
--- a/ExplorerPatcher/StartupSound.h
+++ b/ExplorerPatcher/StartupSound.h
@@ -8,43 +8,33 @@ DEFINE_GUID(__uuidof_AuthUILogonSound,
0x1100, 0x4389, 0xAB, 0x44,
0x46, 0x4F, 0xAF, 0x00, 0x12, 0x88
);
-DEFINE_GUID(__uuidof_IAuthUILogonSound,
- 0xc35243ea,
- 0x4cfc, 0x435a, 0x91, 0xc2,
- 0x9d, 0xbd, 0xec, 0xbf, 0xfc, 0x95
-);
-
-typedef interface AuthUILogonSound AuthUILogonSound;
-typedef struct AuthUILogonSoundVtbl
+#ifdef __cplusplus
+enum LOGON_SOUND_CLIENT
{
- BEGIN_INTERFACE
-
- HRESULT(STDMETHODCALLTYPE* QueryInterface)(
- AuthUILogonSound* This,
- /* [in] */ REFIID riid,
- /* [annotation][iid_is][out] */
- _COM_Outptr_ void** ppvObject);
-
- ULONG(STDMETHODCALLTYPE* AddRef)(
- AuthUILogonSound* This);
-
- ULONG(STDMETHODCALLTYPE* Release)(
- AuthUILogonSound* This);
-
- HRESULT(STDMETHODCALLTYPE* PlayIfNecessary)(
- AuthUILogonSound* This,
- /* [in] */ INT64 a1);
-
- END_INTERFACE
-} AuthUILogonSoundVtbl;
+ LSC_LOGONUI,
+ LSC_EXPLORER,
+};
-interface AuthUILogonSound
+MIDL_INTERFACE("c35243ea-4cfc-435a-91c2-9dbdecbffc95")
+IAuthUILogonSound : IUnknown
{
- CONST_VTBL struct AuthUILogonSoundVtbl* lpVtbl;
+ virtual HRESULT STDMETHODCALLTYPE PlayIfNecessary(LOGON_SOUND_CLIENT client) = 0;
};
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+BOOL AreLogonLogoffShutdownSoundsEnabled();
+HRESULT HookLogonSound();
+BOOL InitSoundWindow();
+void TermSoundWindow();
+HRESULT SHPlaySound(LPCWSTR pszSound, DWORD dwFlags);
-typedef DWORD PlayStartupSoundParams;
+#ifdef __cplusplus
+}
+#endif
-DWORD PlayStartupSound(PlayStartupSoundParams* unused);
#endif
\ No newline at end of file
diff --git a/ExplorerPatcher/Taskbar10.cpp b/ExplorerPatcher/Taskbar10.cpp
index 43d21ff..f738602 100644
--- a/ExplorerPatcher/Taskbar10.cpp
+++ b/ExplorerPatcher/Taskbar10.cpp
@@ -39,6 +39,16 @@ public:
STDMETHODIMP InitializeWithTray(ITrayUIHost* host, ITrayUI** result) override
{
RETURN_IF_FAILED(explorer_TrayUI_CreateInstanceFunc(host, IID_ITrayUI, (void**)result));
+
+ // Fix delayed logon when using the Windows 10 taskbar on Windows 11 21H2.
+ // Not present in 51, present in 120 onwards. 65, 71, and 100 are not checked yet.
+ if (global_rovi.dwBuildNumber == 22000 && global_ubr >= 120)
+ {
+ void** vtable = *(void***)host;
+ void (*FireDesktopSwitchIfReady)(ITrayUIHost*, int) = (decltype(FireDesktopSwitchIfReady))vtable[78];
+ FireDesktopSwitchIfReady(host, 8);
+ }
+
return S_OK;
}
};
diff --git a/ExplorerPatcher/dllmain.c b/ExplorerPatcher/dllmain.c
index 98d2673..75be55a 100644
--- a/ExplorerPatcher/dllmain.c
+++ b/ExplorerPatcher/dllmain.c
@@ -85,7 +85,6 @@ DWORD bCenterMenus = TRUE;
DWORD bSkinMenus = TRUE;
DWORD bSkinIcons = TRUE;
DWORD bReplaceNetwork = FALSE;
-DWORD dwExplorerReadyDelay = 0;
DWORD bEnableArchivePlugin = FALSE;
DWORD bMonitorOverride = TRUE;
DWORD bOpenAtLogon = FALSE;
@@ -2623,6 +2622,39 @@ INT64 Shell_TrayWndSubclassProc(
g_bIsDesktopRaised = (lParam & 1) == 0;
break;
}
+ case WM_QUIT:
+ {
+ if (AreLogonLogoffShutdownSoundsEnabled())
+ {
+ TermSoundWindow();
+ }
+ break;
+ }
+ case 0x581:
+ {
+ if (AreLogonLogoffShutdownSoundsEnabled())
+ {
+ BOOL bLogoff = wParam != 0;
+ SHPlaySound(bLogoff ? L"WindowsLogoff" : L"WindowsLogon", 1);
+ }
+ break;
+ }
+ case 0x590:
+ {
+ if (AreLogonLogoffShutdownSoundsEnabled())
+ {
+ InitSoundWindow();
+ }
+ break;
+ }
+ case 0x5B4:
+ {
+ if (AreLogonLogoffShutdownSoundsEnabled())
+ {
+ TermSoundWindow();
+ }
+ break;
+ }
}
if (uMsg >= 0xC000 && uMsg <= 0xFFFF && uMsg == RegisterWindowMessageW(L"Windows11ContextMenu_" _T(EP_CLSID)))
@@ -4033,7 +4065,7 @@ HRESULT uxtheme_DwmExtendFrameIntoClientAreaHook(HWND hWnd, MARGINS* m)
return DwmExtendFrameIntoClientArea(hWnd, m);
}
-static HWND(__stdcall *explorerframe_SHCreateWorkerWindowFunc)(
+HWND(__stdcall *explorerframe_SHCreateWorkerWindowFunc)(
WNDPROC wndProc,
HWND hWndParent,
DWORD dwExStyle,
@@ -4270,7 +4302,7 @@ HRESULT pnidui_CoCreateInstanceHook(
);
if (dwVal)
{
- if (dwVal == 5 || dwVal == 6)
+ if ((dwVal == 5 || dwVal == 6) && IsWindows11() && !IsWindows11Version22H2Build1413OrHigher())
{
if (hCheckForegroundThread)
{
@@ -5726,7 +5758,7 @@ INT64 ShowDesktopSubclassProc(
#pragma endregion
-#pragma region "Notify shell ready (fixes delay at logon)"
+#pragma region "Notify shell ready"
#ifdef _WIN64
DWORD SignalShellReady(DWORD wait)
{
@@ -5761,21 +5793,8 @@ DWORD SignalShellReady(DWORD wait)
Sleep(100);
}
- if (!wait)
- {
- Sleep(600);
- }
- else
- {
- Sleep(wait);
- }
+ Sleep(600);
- HANDLE hEvent = CreateEventW(0, 0, 0, L"ShellDesktopSwitchEvent");
- if (hEvent)
- {
- printf(">>> Signal shell ready.\n");
- SetEvent(hEvent);
- }
SetEvent(hCanStartSws);
if (bOldTaskbar && (global_rovi.dwBuildNumber >= 22567))
{
@@ -6584,15 +6603,6 @@ void WINAPI LoadSettings(LPARAM lParam)
&dwSize
);
dwSize = sizeof(DWORD);
- RegQueryValueExW(
- hKey,
- TEXT("ExplorerReadyDelay"),
- 0,
- NULL,
- &dwExplorerReadyDelay,
- &dwSize
- );
- dwSize = sizeof(DWORD);
RegQueryValueExW(
hKey,
TEXT("ArchiveMenu"),
@@ -12828,39 +12838,29 @@ DWORD Inject(BOOL bIsExplorer)
+ if (AreLogonLogoffShutdownSoundsEnabled())
+ {
+ HookLogonSound();
+ }
+
rv = funchook_install(funchook, 0);
if (rv != 0)
{
FreeLibraryAndExitThread(hModule, rv);
return rv;
}
- funchook_destroy(funchook);
- funchook = NULL;
+ // funchook_destroy(funchook);
+ // funchook = NULL;
printf("Installed hooks.\n");
- /*HANDLE hEvent = CreateEventEx(
- 0,
- L"ShellDesktopSwitchEvent",
- CREATE_EVENT_MANUAL_RESET,
- EVENT_ALL_ACCESS
- );
- if (GetLastError() != ERROR_ALREADY_EXISTS)
- {
- printf("Created ShellDesktopSwitchEvent event.\n");
- ResetEvent(hEvent);
- }*/
-
if (IsWindows11())
{
if (bOldTaskbar)
{
- CreateThread(0, 0, PlayStartupSound, 0, 0, 0);
- printf("Play startup sound thread...\n");
- CreateThread(0, 0, SignalShellReady, dwExplorerReadyDelay, 0, 0);
- printf("Signal shell ready...\n");
+ CreateThread(0, 0, SignalShellReady, 0, 0, 0);
}
else
{
diff --git a/ep_gui/GUI.c b/ep_gui/GUI.c
index 4a08a60..8394f93 100644
--- a/ep_gui/GUI.c
+++ b/ep_gui/GUI.c
@@ -207,6 +207,34 @@ LSTATUS GUI_Internal_RegSetValueExW(
{
if (!lpValueName || wcsncmp(lpValueName, L"Virtualized_" _T(EP_CLSID), 50))
{
+ if (lpValueName && !wcscmp(lpValueName, L"LogonLogoffShutdownSounds"))
+ {
+ DWORD bExcluded = !*(const DWORD*)lpData;
+
+ HKEY localHKey = NULL;
+ RegOpenKeyExW(HKEY_CURRENT_USER, L"AppEvents\\EventLabels\\SystemExit", REG_OPTION_NON_VOLATILE, KEY_WRITE, &localHKey);
+ if (localHKey && localHKey != INVALID_HANDLE_VALUE)
+ {
+ RegSetValueExW(localHKey, L"ExcludeFromCPL", 0, REG_DWORD, &bExcluded, sizeof(DWORD));
+ RegCloseKey(localHKey);
+ }
+
+ localHKey = NULL;
+ RegOpenKeyExW(HKEY_CURRENT_USER, L"AppEvents\\EventLabels\\WindowsLogoff", REG_OPTION_NON_VOLATILE, KEY_WRITE, &localHKey);
+ if (localHKey && localHKey != INVALID_HANDLE_VALUE)
+ {
+ RegSetValueExW(localHKey, L"ExcludeFromCPL", 0, REG_DWORD, &bExcluded, sizeof(DWORD));
+ RegCloseKey(localHKey);
+ }
+
+ localHKey = NULL;
+ RegOpenKeyExW(HKEY_CURRENT_USER, L"AppEvents\\EventLabels\\WindowsLogon", REG_OPTION_NON_VOLATILE, KEY_WRITE, &localHKey);
+ if (localHKey && localHKey != INVALID_HANDLE_VALUE)
+ {
+ RegSetValueExW(localHKey, L"ExcludeFromCPL", 0, REG_DWORD, &bExcluded, sizeof(DWORD));
+ RegCloseKey(localHKey);
+ }
+ }
return RegSetValueExW(hKey, lpValueName, 0, dwType, lpData, cbData);
}
if (!wcscmp(lpValueName, L"Virtualized_" _T(EP_CLSID) L"_TaskbarPosition"))
diff --git a/ep_gui/resources/EPSettingsResources.h b/ep_gui/resources/EPSettingsResources.h
index f2c5fe1..e00bd26 100644
--- a/ep_gui/resources/EPSettingsResources.h
+++ b/ep_gui/resources/EPSettingsResources.h
@@ -330,6 +330,7 @@
#define IDS_OTHER_NOREDIRECT_PROGRAMS 1724
#define IDS_OTHER_NOREDIRECT_DATETIME 1725
#define IDS_OTHER_NOREDIRECT_TRAYICONS 1726
+#define IDS_OTHER_LOGONLOGOFFSHUTDOWNSOUNDS 1727
#define IDS_UPDATES 1801
#define IDS_UPDATES_POLICY 1802
@@ -361,19 +362,6 @@
#define IDS_ADV_SYMBOLS 1911
#define IDS_ADV_PINNEDITEMS 1912
#define IDS_ADV_REMOVEEXTRAGAP 1913
-#define IDS_ADV_DELAY 1914
-#define IDS_ADV_DELAY_0 1915
-#define IDS_ADV_DELAY_300 1916
-#define IDS_ADV_DELAY_600 1917
-#define IDS_ADV_DELAY_1000 1918
-#define IDS_ADV_DELAY_1500 1919
-#define IDS_ADV_DELAY_2000 1920
-#define IDS_ADV_DELAY_3000 1921
-#define IDS_ADV_DELAY_4000 1922
-#define IDS_ADV_DELAY_5000 1923
-#define IDS_ADV_DELAY_6000 1924
-#define IDS_ADV_DELAY_8000 1925
-#define IDS_ADV_DELAY_10000 1926
#define IDS_ADV_XAMLSOUNDS 1927
#define IDS_ABOUT 2001
diff --git a/ep_gui/resources/lang/ep_gui.en-US.rc b/ep_gui/resources/lang/ep_gui.en-US.rc
index ace9086..e02785c 100644
--- a/ep_gui/resources/lang/ep_gui.en-US.rc
+++ b/ep_gui/resources/lang/ep_gui.en-US.rc
@@ -366,6 +366,7 @@ BEGIN
IDS_OTHER_PWRBTNACTION_64 "Hibernate"
IDS_OTHER_PWRBTNACTION_2 "Shut down (default)"
IDS_OTHER_PWRBTNACTION_4 "Restart"
+ IDS_OTHER_LOGONLOGOFFSHUTDOWNSOUNDS "Enable logon, logoff, and shutdown sounds"
IDS_OTHER_NOREDIRECT "Prevent the following Control Panel links from being redirected to the Settings app:"
IDS_OTHER_NOREDIRECT_SYSTEM "System / About page"
IDS_OTHER_NOREDIRECT_PROGRAMS "Programs and Features"
@@ -404,19 +405,6 @@ BEGIN
IDS_ADV_SYMBOLS "Enable symbols download"
IDS_ADV_PINNEDITEMS "Pinned items act as quick launch (don't group with active apps)"
IDS_ADV_REMOVEEXTRAGAP "When the taskbar shows button labels, remove the extra gap around pinned items"
- IDS_ADV_DELAY "Supplementary delay at logon"
- IDS_ADV_DELAY_0 "None (default)"
- IDS_ADV_DELAY_300 "300 ms"
- IDS_ADV_DELAY_600 "600 ms"
- IDS_ADV_DELAY_1000 "1 second"
- IDS_ADV_DELAY_1500 "1.5 seconds"
- IDS_ADV_DELAY_2000 "2 seconds"
- IDS_ADV_DELAY_3000 "3 seconds"
- IDS_ADV_DELAY_4000 "4 seconds"
- IDS_ADV_DELAY_5000 "5 seconds"
- IDS_ADV_DELAY_6000 "6 seconds"
- IDS_ADV_DELAY_8000 "8 seconds"
- IDS_ADV_DELAY_10000 "10 seconds"
IDS_ADV_XAMLSOUNDS "Enable UI sounds in Explorer's XAML views"
IDS_ABOUT "About"
diff --git a/ep_gui/resources/settings.reg b/ep_gui/resources/settings.reg
index 59f56fe..7d72979 100644
--- a/ep_gui/resources/settings.reg
+++ b/ep_gui/resources/settings.reg
@@ -682,6 +682,11 @@
;x 2 %R:1720%
;x 4 %R:1721%
"Start_PowerButtonAction"=dword:00000002
+;s LogonLogoffShutdownSounds LogonLogoffShutdownSoundsAvailable
+[HKEY_CURRENT_USER\Software\ExplorerPatcher]
+;b %R:1727% *
+"LogonLogoffShutdownSounds"=dword:00000000
+;g LogonLogoffShutdownSounds
;t %R:1722%
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
;b %R:1723%
@@ -756,20 +761,6 @@
;b %R:1913% *
"RemoveExtraGapAroundPinnedItems"=dword:00000000
;g Advanced_Windows10
-;c 12 %R:1914% *
-;x 0 %R:1915%
-;x 300 %R:1916%
-;x 600 %R:1917%
-;x 1000 %R:1918%
-;x 1500 %R:1919%
-;x 2000 %R:1920%
-;x 3000 %R:1921%
-;x 4000 %R:1922%
-;x 5000 %R:1923%
-;x 6000 %R:1924%
-;x 8000 %R:1925%
-;x 10000 %R:1926%
-"ExplorerReadyDelay"=dword:00000000
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ExplorerPatcher]
;b %R:1927% *
"XamlSounds"=dword:00000000
diff --git a/ep_gui/resources/settings10.reg b/ep_gui/resources/settings10.reg
index d059660..e74e5f2 100644
--- a/ep_gui/resources/settings10.reg
+++ b/ep_gui/resources/settings10.reg
@@ -496,6 +496,11 @@
;x 2 %R:1720%
;x 4 %R:1721%
"Start_PowerButtonAction"=dword:00000002
+;s LogonLogoffShutdownSounds LogonLogoffShutdownSoundsAvailable
+[HKEY_CURRENT_USER\Software\ExplorerPatcher]
+;b %R:1727% *
+"LogonLogoffShutdownSounds"=dword:00000000
+;g LogonLogoffShutdownSounds
;t %R:1722%
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
;b %R:1723%