diff --git a/ExplorerPatcher/GUI.c b/ExplorerPatcher/GUI.c index f53839a..3111418 100644 --- a/ExplorerPatcher/GUI.c +++ b/ExplorerPatcher/GUI.c @@ -1296,6 +1296,52 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt) } if (!bOk) continue; } + else if (!wcsncmp(text, L"%SPOTLIGHTINFOTIP1%", 18)) + { + DWORD dwDataSize = MAX_LINE_LENGTH; + RegGetValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}", L"InfoTip", RRF_RT_REG_SZ, NULL, text, &dwDataSize); + WCHAR* pC = wcschr(text, L'\r'); + if (pC) pC[0] = 0; + } + else if (!wcsncmp(text, L"%SPOTLIGHTINFOTIP2%", 18)) + { + DWORD dwDataSize = MAX_LINE_LENGTH; + RegGetValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}", L"InfoTip", RRF_RT_REG_SZ, NULL, text, &dwDataSize); + WCHAR* pC = wcschr(text, L'\r'); + if (pC) + { + int d = (pC - text) + 1; + for (int i = d; i < wcslen(text); ++i) + { + text[i - d] = text[i]; + } + pC = wcschr(text, L'\r'); + if (pC) + { + pC[0] = 0; + } + } + } + else if (!wcsncmp(text, L"%SPOTLIGHTCLICK%", 16)) + { + DWORD dwDataSize = MAX_LINE_LENGTH; + RegQueryValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}", text, &dwDataSize); + } + else if (!wcsncmp(text, L"%SPOTLIGHTDISLIKE%", 18)) + { + DWORD dwDataSize = MAX_LINE_LENGTH; + RegQueryValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}\\shell\\SpotlightDislike", text, &dwDataSize); + } + else if (!wcsncmp(text, L"%SPOTLIGHTLIKE%", 15)) + { + DWORD dwDataSize = MAX_LINE_LENGTH; + RegQueryValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}\\shell\\SpotlightLike", text, &dwDataSize); + } + else if (!wcsncmp(text, L"%SPOTLIGHTNEXT%", 15)) + { + DWORD dwDataSize = MAX_LINE_LENGTH; + RegQueryValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}\\shell\\SpotlightNext", text, &dwDataSize); + } if (bResetLastHeading) { wcscpy_s(lastHeading, MAX_LINE_LENGTH, text); @@ -2257,6 +2303,30 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt) psfDesktop->lpVtbl->Release(psfDesktop); } } + else if (!strncmp(line + 1, "spotlight_menu", 14)) + { + POINT p; + p.x = rcText.left; + p.y = rcText.bottom; + ClientToScreen(hwnd, &p); + SpotlightHelper(SPOP_OPENMENU, hwnd, NULL, &p); + } + else if (!strncmp(line + 1, "spotlight_click", 15)) + { + SpotlightHelper(SPOP_CLICKMENU_OPEN, hwnd, NULL, &p); + } + else if (!strncmp(line + 1, "spotlight_next", 14)) + { + SpotlightHelper(SPOP_CLICKMENU_NEXTPIC, hwnd, NULL, &p); + } + else if (!strncmp(line + 1, "spotlight_like", 14)) + { + SpotlightHelper(SPOP_CLICKMENU_LIKE, hwnd, NULL, &p); + } + else if (!strncmp(line + 1, "spotlight_dislike", 17)) + { + SpotlightHelper(SPOP_CLICKMENU_DISLIKE, hwnd, NULL, &p); + } } } dwMaxHeight += dwLineHeight * dy; diff --git a/ExplorerPatcher/dllmain.c b/ExplorerPatcher/dllmain.c index b91a979..87807ba 100644 --- a/ExplorerPatcher/dllmain.c +++ b/ExplorerPatcher/dllmain.c @@ -154,6 +154,9 @@ DWORD dwTaskbarSmallIcons = FALSE; DWORD dwShowTaskViewButton = FALSE; DWORD dwSearchboxTaskbarMode = FALSE; DWORD dwTaskbarDa = FALSE; +DWORD bDisableSpotlightIcon = FALSE; +DWORD dwSpotlightDesktopMenuMask = 0; +DWORD dwSpotlightUpdateSchedule = 0; int Code = 0; HRESULT InjectStartFromExplorer(); void InvokeClockFlyout(); @@ -809,7 +812,11 @@ LRESULT CALLBACK EP_Service_Window_WndProc( } return 0; } - + else if (uMsg == WM_TIMER && wParam == 100) + { + if (IsSpotlightEnabled()) SpotlightHelper(SPOP_CLICKMENU_NEXTPIC, hWnd, NULL, NULL); + printf("Refreshed Spotlight\n"); + } return DefWindowProcW(hWnd, uMsg, wParam, lParam); } DWORD EP_ServiceWindowThread(DWORD unused) @@ -839,6 +846,7 @@ DWORD EP_ServiceWindowThread(DWORD unused) ); if (hWndServiceWindow) { + if (IsSpotlightEnabled() && dwSpotlightUpdateSchedule) SetTimer(hWndServiceWindow, 100, dwSpotlightUpdateSchedule * 1000, NULL); if (bClockFlyoutOnWinC) { RegisterHotKey(hWndServiceWindow, 1, MOD_WIN | MOD_NOREPEAT, 'C'); @@ -5664,12 +5672,13 @@ DWORD WindowSwitcher(DWORD unused) #pragma region "Load Settings from registry" -#define REFRESHUI_NONE 0b00000 -#define REFRESHUI_GLOM 0b00001 -#define REFRESHUI_ORB 0b00010 -#define REFRESHUI_PEOPLE 0b00100 -#define REFRESHUI_TASKBAR 0b01000 -#define REFRESHUI_CENTER 0b10000 +#define REFRESHUI_NONE 0b000000 +#define REFRESHUI_GLOM 0b000001 +#define REFRESHUI_ORB 0b000010 +#define REFRESHUI_PEOPLE 0b000100 +#define REFRESHUI_TASKBAR 0b001000 +#define REFRESHUI_CENTER 0b010000 +#define REFRESHUI_SPOTLIGHT 0b100000 void WINAPI LoadSettings(LPARAM lParam) { BOOL bIsExplorer = LOWORD(lParam); @@ -6323,6 +6332,55 @@ void WINAPI LoadSettings(LPARAM lParam) ); dwTemp = FALSE; dwSize = sizeof(DWORD); + RegQueryValueExW( + hKey, + TEXT("SpotlightDisableIcon"), + 0, + NULL, + &dwTemp, + &dwSize + ); + if (dwTemp != bDisableSpotlightIcon) + { + bDisableSpotlightIcon = dwTemp; + if (IsSpotlightEnabled()) dwRefreshUIMask |= REFRESHUI_SPOTLIGHT; + } + dwSize = sizeof(DWORD); + RegQueryValueExW( + hKey, + TEXT("SpotlightDesktopMenuMask"), + 0, + NULL, + &dwSpotlightDesktopMenuMask, + &dwSize + ); + dwTemp = 0; + dwSize = sizeof(DWORD); + RegQueryValueExW( + hKey, + TEXT("SpotlightUpdateSchedule"), + 0, + NULL, + &dwTemp, + &dwSize + ); + if (dwTemp != dwSpotlightUpdateSchedule) + { + dwSpotlightUpdateSchedule = dwTemp; + if (IsSpotlightEnabled() && hWndServiceWindow) + { + if (dwSpotlightUpdateSchedule) + { + SetTimer(hWndServiceWindow, 100, dwSpotlightUpdateSchedule * 1000, NULL); + } + else + { + KillTimer(hWndServiceWindow, 100); + } + } + } + dwTemp = FALSE; + dwSize = sizeof(DWORD); RegQueryValueExW( hKey, TEXT("PinnedItemsActAsQuickLaunch"), @@ -6941,6 +6999,16 @@ void WINAPI LoadSettings(LPARAM lParam) FixUpCenteredTaskbar(); #endif } + if (dwRefreshUIMask & REFRESHUI_SPOTLIGHT) + { + DWORD dwAttributes = 0; dwTemp = sizeof(DWORD); + RegGetValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}\\ShellFolder", L"Attributes", RRF_RT_DWORD, NULL, &dwAttributes, &dwTemp); + if (bDisableSpotlightIcon) dwAttributes |= SFGAO_NONENUMERATED; + else dwAttributes &= ~SFGAO_NONENUMERATED; + RegSetKeyValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}\\ShellFolder", L"Attributes", REG_DWORD, &dwAttributes, sizeof(DWORD)); + SHFlushSFCache(); + SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); + } } } @@ -9106,6 +9174,68 @@ BOOL SHELL32_CanDisplayWin8CopyDialogHook() #pragma endregion +#pragma region "Windows Spotlight customization" + +HKEY hKeySpotlight1 = NULL; +HKEY hKeySpotlight2 = NULL; + +LSTATUS shell32_RegCreateKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD Reserved, LPWSTR lpClass, DWORD dwOptions, REGSAM samDesired, const LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition) +{ + if (bDisableSpotlightIcon && hKey == HKEY_CURRENT_USER && !_wcsicmp(lpSubKey, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}")) + { + LSTATUS lRes = RegCreateKeyExW(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition); + if (lRes == ERROR_SUCCESS) hKeySpotlight1 = *phkResult; + return lRes; + } + else if (hKeySpotlight1 && hKey == hKeySpotlight1 && !_wcsicmp(lpSubKey, L"ShellFolder")) + { + LSTATUS lRes = RegCreateKeyExW(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition); + if (lRes == ERROR_SUCCESS) hKeySpotlight2 = *phkResult; + return lRes; + } + return RegCreateKeyExW(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition); +} + +LSTATUS shell32_RegSetValueExW(HKEY hKey, LPCWSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE* lpData, DWORD cbData) +{ + if (hKeySpotlight1 && hKeySpotlight2 && hKey == hKeySpotlight2 && !_wcsicmp(lpValueName, L"Attributes")) + { + hKeySpotlight1 = NULL; + hKeySpotlight2 = NULL; + DWORD dwAttributes = *(DWORD*)lpData | SFGAO_NONENUMERATED; + SHFlushSFCache(); + return RegSetValueExW(hKey, lpValueName, Reserved, dwType, &dwAttributes, cbData); + } + return RegSetValueExW(hKey, lpValueName, Reserved, dwType, lpData, cbData); +} + +BOOL shell32_DeleteMenu(HMENU hMenu, UINT uPosition, UINT uFlags) +{ + if (uPosition == 0x7053 && IsSpotlightEnabled() && dwSpotlightDesktopMenuMask) + { + SpotlightHelper(dwSpotlightDesktopMenuMask, GetDesktopWindow(), hMenu, NULL); + } + return DeleteMenu(hMenu, uPosition, uFlags); +} + +BOOL shell32_TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, int nReserved, HWND hWnd, const RECT* prcRect) +{ + BOOL bRet = TrackPopupMenuHook(hMenu, uFlags, x, y, nReserved, hWnd, prcRect); + if (IsSpotlightEnabled() && dwSpotlightDesktopMenuMask) + { + MENUITEMINFOW mii; + mii.cbSize = sizeof(MENUITEMINFOW); + mii.fMask = MIIM_FTYPE | MIIM_DATA; + if (GetMenuItemInfoW(hMenu, bRet, FALSE, &mii) && mii.dwItemData >= SPOP_CLICKMENU_FIRST && mii.dwItemData <= SPOP_CLICKMENU_LAST) + { + SpotlightHelper(mii.dwItemData, hWnd, hMenu, NULL); + } + } + return bRet; +} +#pragma endregion + + DWORD InjectBasicFunctions(BOOL bIsExplorer, BOOL bInstall) { //Sleep(150); @@ -9129,7 +9259,14 @@ DWORD InjectBasicFunctions(BOOL bIsExplorer, BOOL bInstall) { if (bInstall) { - VnPatchIAT(hShell32, "user32.dll", "TrackPopupMenu", TrackPopupMenuHook); + if (DoesOSBuildSupportSpotlight()) + { + VnPatchIAT(hShell32, "user32.dll", "TrackPopupMenu", shell32_TrackPopupMenu); + } + else + { + VnPatchIAT(hShell32, "user32.dll", "TrackPopupMenu", TrackPopupMenuHook); + } VnPatchIAT(hShell32, "user32.dll", "SystemParametersInfoW", DisableImmersiveMenus_SystemParametersInfoW); if (!bIsExplorer) { @@ -9975,6 +10112,14 @@ DWORD Inject(BOOL bIsExplorer) pClassFactory->lpVtbl->Release(pClassFactory); } } + + // Disable Windows Spotlight icon + if (DoesOSBuildSupportSpotlight()) + { + VnPatchIAT(hShell32, "API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL", "RegCreateKeyExW", shell32_RegCreateKeyExW); + VnPatchIAT(hShell32, "API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL", "RegSetValueExW", shell32_RegSetValueExW); + VnPatchIAT(hShell32, "user32.dll", "DeleteMenu", shell32_DeleteMenu); + } } printf("Setup shell32 functions done\n"); diff --git a/ExplorerPatcher/settings.reg b/ExplorerPatcher/settings.reg index af971bb..620f431 100644 --- a/ExplorerPatcher/settings.reg +++ b/ExplorerPatcher/settings.reg @@ -516,6 +516,54 @@ +;s Spotlight_SpotlightOSCheck DoesOSBuildSupportSpotlight +;T Spotlight +[HKEY_CURRENT_USER\Software\ExplorerPatcher] +;t When using Windows spotlight as desktop background: +;b Hide the "Learn about this picture" icon +"SpotlightDisableIcon"=dword:00000000 +;c 8 Desktop context menu items +;x 0 No items +;x 32 Switch to the next picture +;x 48 Learn about and switch to next picture +;x 288 Info and switch to next picture +;x 800 Info, copyright, and switch to next picture +;x 304 Info, learn about, and switch to next picture +;x 816 Info, copyright, learn about, and switch to next picture +;x 1008 All items +"SpotlightDesktopMenuMask"=dword:00000000 +;c 11 Update frequency +;x 0 Let Windows decide the best schedule (default) +;x 60 Every minute +;x 300 Every 5 minutes +;x 900 Every 15 minutes +;x 1200 Every 20 minutes +;x 1800 Every half an hour +;x 3600 Every hour +;x 7200 Every couple of hours +;x 21600 Every 6 hours +;x 43200 Every 12 hours +;x 86400 Once a day +"SpotlightUpdateSchedule"=dword:00000000 +;s Spotlight_SpotlightEnabledCheck IsSpotlightEnabled +;u %SPOTLIGHTCLICK% +;spotlight_click +;t %SPOTLIGHTINFOTIP1% +;t %SPOTLIGHTINFOTIP2% +;u %SPOTLIGHTNEXT% +;spotlight_next +;u %SPOTLIGHTLIKE% +;spotlight_like +;u %SPOTLIGHTDISLIKE% +;spotlight_dislike +;;;u Show more options +;;;spotlight_menu +;g Spotlight_SpotlightEnabledCheck +;g Spotlight_SpotlightOSCheck + + + + ;T Other [HKEY_CURRENT_USER\Software\ExplorerPatcher] ;b Remember last used section in this window diff --git a/ExplorerPatcher/utility.c b/ExplorerPatcher/utility.c index 96985fb..541babd 100644 --- a/ExplorerPatcher/utility.c +++ b/ExplorerPatcher/utility.c @@ -1466,3 +1466,158 @@ BOOL IsConnectedToInternet() } return connectedStatus; } + +BOOL DoesOSBuildSupportSpotlight() +{ + return global_rovi.dwBuildNumber >= 22000 && global_ubr >= 706; +} + +BOOL IsSpotlightEnabled() +{ + HKEY hKey = NULL; + BOOL bRet = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2CC5CA98-6485-489A-920E-B3E88A6CCCE3}", 0, KEY_READ, &hKey) == ERROR_SUCCESS; + if (bRet) RegCloseKey(hKey); + return bRet; +} + +const int spop_insertmenu_ops[] = { SPOP_INSERTMENU_OPEN, SPOP_INSERTMENU_NEXTPIC, 0, SPOP_INSERTMENU_LIKE, SPOP_INSERTMENU_DISLIKE }; +void SpotlightHelper(DWORD dwOp, HWND hWnd, HMENU hMenu, LPPOINT pPt) +{ + HRESULT hr = S_OK; + LPITEMIDLIST pidl = NULL; + SFGAOF sfgao = 0; + if (SUCCEEDED(hr = SHParseDisplayName(L"::{2CC5CA98-6485-489A-920E-B3E88A6CCCE3}", NULL, &pidl, 0, &sfgao))) + { + IShellFolder* psf = NULL; + LPCITEMIDLIST pidlChild; + if (SUCCEEDED(hr = SHBindToParent(pidl, &IID_IShellFolder, (void**)&psf, &pidlChild))) + { + IContextMenu* pcm = NULL; + if (SUCCEEDED(hr = psf->lpVtbl->GetUIObjectOf(psf, hWnd, 1, &pidlChild, &IID_IContextMenu, NULL, &pcm))) + { + HMENU hMenu2 = CreatePopupMenu(); + if (hMenu2) + { + if (SUCCEEDED(hr = pcm->lpVtbl->QueryContextMenu(pcm, hMenu2, 0, SCRATCH_QCM_FIRST, SCRATCH_QCM_LAST, CMF_NORMAL))) + { + if (dwOp == SPOP_OPENMENU) + { + int iCmd = TrackPopupMenuEx(hMenu2, TPM_RETURNCMD, pPt->x, pPt->y, hWnd, NULL); + if (iCmd > 0) + { + CMINVOKECOMMANDINFOEX info = { 0 }; + info.cbSize = sizeof(info); + info.fMask = CMIC_MASK_UNICODE | CMIC_MASK_PTINVOKE; + info.hwnd = hWnd; + info.lpVerb = MAKEINTRESOURCEA(iCmd - SCRATCH_QCM_FIRST); + info.lpVerbW = MAKEINTRESOURCEW(iCmd - SCRATCH_QCM_FIRST); + info.nShow = SW_SHOWNORMAL; + info.ptInvoke = *pPt; + pcm->lpVtbl->InvokeCommand(pcm, &info); + } + } + else if (!(dwOp & ~SPOP_INSERTMENU_ALL)) + { + MENUITEMINFOW mii; + int i = -1; + while (1) + { + if (i == -1 ? ((dwOp & SPOP_INSERTMENU_INFOTIP1) || (dwOp & SPOP_INSERTMENU_INFOTIP2)) : (dwOp & spop_insertmenu_ops[i])) + { + mii.cbSize = sizeof(MENUITEMINFOW); + mii.fMask = MIIM_FTYPE | MIIM_STRING; + mii.cch = 0; + mii.dwTypeData = NULL; + if (i <= 0 ? + (i == 0 ? + !RegQueryValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}", NULL, &mii.cch) : + !RegGetValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}", L"InfoTip", RRF_RT_REG_SZ, NULL, NULL, &mii.cch) + ) : + GetMenuItemInfoW(hMenu2, i, TRUE, &mii)) + { + WCHAR* buf = malloc(++mii.cch * sizeof(WCHAR)); + if (buf) + { + mii.dwTypeData = buf; + if (i <= 0 ? + (i == 0 ? + !RegQueryValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}", mii.dwTypeData, &mii.cch) : + !RegGetValueW(HKEY_CURRENT_USER, L"Software\\Classes\\CLSID\\{2cc5ca98-6485-489a-920e-b3e88a6ccce3}", L"InfoTip", RRF_RT_REG_SZ, NULL, mii.dwTypeData, &mii.cch) + ) : + GetMenuItemInfoW(hMenu2, i, TRUE, &mii)) + { + if (i == -1) + { + WCHAR* pC = wcschr(mii.dwTypeData, L'\r'); + if (pC) + { + pC[0] = 0; + + mii.fMask = MIIM_ID | MIIM_STRING | MIIM_DATA | MIIM_STATE; + mii.wID = 3999 + i - 1; + mii.dwItemData = SPOP_CLICKMENU_FIRST + i - 1; + mii.fType = MFT_STRING; + mii.fState = MFS_DISABLED; + if (dwOp & SPOP_INSERTMENU_INFOTIP1) + { + InsertMenuItemW(hMenu, GetMenuItemCount(hMenu) - 1, TRUE, &mii); + } + + pC++; + WCHAR* pC2 = wcschr(pC, L'\r'); + if (pC2) + { + pC2[0] = 0; + } + mii.dwTypeData = pC; + } + } + mii.fMask = MIIM_ID | MIIM_STRING | MIIM_DATA | (i == -1 ? MIIM_STATE : 0); + mii.wID = 3999 + i; + mii.dwItemData = SPOP_CLICKMENU_FIRST + i; + mii.fType = MFT_STRING; + if (i == -1) mii.fState = MFS_DISABLED; + if (i != -1 || (i == -1 && (dwOp & SPOP_INSERTMENU_INFOTIP2))) + { + InsertMenuItemW(hMenu, GetMenuItemCount(hMenu) - 1, TRUE, &mii); + } + } + free(buf); + } + } + } + i++; + if (i >= ARRAYSIZE(spop_insertmenu_ops)) break; + } + mii.fMask = MIIM_FTYPE | MIIM_DATA; + mii.dwItemData = 0; + mii.fType = MFT_SEPARATOR; + InsertMenuItemW(hMenu, GetMenuItemCount(hMenu) - 1, TRUE, &mii); + } + else if (dwOp >= SPOP_CLICKMENU_FIRST && dwOp <= SPOP_CLICKMENU_LAST) + { + MENUITEMINFOW mii; + mii.cbSize = sizeof(MENUITEMINFOW); + mii.fMask = MIIM_ID; + if (GetMenuItemInfoW(hMenu2, dwOp - SPOP_CLICKMENU_FIRST, TRUE, &mii)) + { + CMINVOKECOMMANDINFOEX info = { 0 }; + info.cbSize = sizeof(info); + info.fMask = CMIC_MASK_UNICODE; + info.hwnd = hWnd; + info.lpVerb = MAKEINTRESOURCEA(mii.wID - SCRATCH_QCM_FIRST); + info.lpVerbW = MAKEINTRESOURCEW(mii.wID - SCRATCH_QCM_FIRST); + info.nShow = SW_SHOWNORMAL; + pcm->lpVtbl->InvokeCommand(pcm, &info); + } + } + } + DestroyMenu(hMenu2); + } + pcm->lpVtbl->Release(pcm); + } + psf->lpVtbl->Release(psf); + } + CoTaskMemFree(pidl); + } +} diff --git a/ExplorerPatcher/utility.h b/ExplorerPatcher/utility.h index a9384a7..61db46a 100644 --- a/ExplorerPatcher/utility.h +++ b/ExplorerPatcher/utility.h @@ -560,4 +560,28 @@ BOOL DownloadAndInstallWebView2Runtime(); BOOL DownloadFile(LPCWSTR wszURL, DWORD dwSize, LPCWSTR wszPath); BOOL IsConnectedToInternet(); + +#define SCRATCH_QCM_FIRST 1 +#define SCRATCH_QCM_LAST 0x7FFF + +#define SPOP_OPENMENU 1 +#define SPOP_INSERTMENU_ALL 0b1111110000 +#define SPOP_INSERTMENU_OPEN 0b0000010000 +#define SPOP_INSERTMENU_NEXTPIC 0b0000100000 +#define SPOP_INSERTMENU_LIKE 0b0001000000 +#define SPOP_INSERTMENU_DISLIKE 0b0010000000 +#define SPOP_INSERTMENU_INFOTIP1 0b0100000000 +#define SPOP_INSERTMENU_INFOTIP2 0b1000000000 +#define SPOP_CLICKMENU_FIRST 40000 +#define SPOP_CLICKMENU_OPEN 40000 +#define SPOP_CLICKMENU_NEXTPIC 40001 +#define SPOP_CLICKMENU_LIKE 40002 +#define SPOP_CLICKMENU_DISLIKE 40003 +#define SPOP_CLICKMENU_LAST 40003 + +BOOL DoesOSBuildSupportSpotlight(); + +BOOL IsSpotlightEnabled(); + +void SpotlightHelper(DWORD dwOp, HWND hWnd, HMENU hMenu, LPPOINT pPt); #endif