mirror of
https://github.com/valinet/ExplorerPatcher.git
synced 2024-11-27 17:00:59 +01:00
Implemented weather taskbar widget
This commit is contained in:
parent
677b19663d
commit
5d4466147d
7
.github/workflows/build.yml
vendored
7
.github/workflows/build.yml
vendored
@ -79,6 +79,13 @@ jobs:
|
||||
C:\msys64\usr\bin\unix2dos.exe SimpleWindowSwitcher/sws_def.h
|
||||
exit /b 0
|
||||
|
||||
- name: Setup NuGet
|
||||
uses: nuget/setup-nuget@v1
|
||||
|
||||
- name: Restore NuGet packages
|
||||
run: |
|
||||
nuget restore ExplorerPatcher.sln
|
||||
|
||||
- name: Build funchook
|
||||
shell: powershell
|
||||
run: |
|
||||
|
@ -2,6 +2,14 @@
|
||||
|
||||
This document includes the same release notes as in the [Releases](https://github.com/valinet/ExplorerPatcher/releases) section on GitHub.
|
||||
|
||||
## 22000.469.42
|
||||
|
||||
Tested on OS build 22000.434.
|
||||
|
||||
#### New features
|
||||
|
||||
* Implemented Weather widget for the classic taskbar, similar to what is available in the more recent updates to Windows 10. Read more about it [here](https://github.com/valinet/ExplorerPatcher/wiki/Weather).
|
||||
|
||||
## 22000.469.41
|
||||
|
||||
Tested on OS build 22000.434.
|
||||
|
@ -4,6 +4,10 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
VisualStudioVersion = 17.0.31903.59
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ExplorerPatcher", "ExplorerPatcher\ExplorerPatcher.vcxproj", "{DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE} = {AF02ABAC-EAEB-471C-9957-73D430B8B4DE}
|
||||
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E} = {314A50C1-F0A0-4D0C-89E1-AD8F3951043E}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ep_generate_release_description", "ep_generate_release_description\ep_generate_release_description.vcxproj", "{C362CFBE-7C6B-4457-8D01-839818D42ECB}"
|
||||
EndProject
|
||||
@ -13,6 +17,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ep_setup", "ep_setup\ep_set
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9} = {DB3E4319-2969-42B6-B7E8-BB57AA8C9FA9}
|
||||
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87} = {1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}
|
||||
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E} = {314A50C1-F0A0-4D0C-89E1-AD8F3951043E}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ep_setup_patch", "ep_setup_patch\ep_setup_patch.vcxproj", "{0C13E5F3-106B-4836-A7C2-8E5808A6ED78}"
|
||||
@ -22,6 +27,13 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ep_setup_patch", "ep_setup_
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ep_dwm", "ep_dwm\ep_dwm\ep_dwm.vcxproj", "{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ep_weather_host", "ep_weather_host\ep_weather_host.vcxproj", "{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE} = {AF02ABAC-EAEB-471C-9957-73D430B8B4DE}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ep_weather_host_stub", "ep_weather_host_stub\ep_weather_host_stub.vcxproj", "{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|amd64 = Debug|amd64
|
||||
@ -64,10 +76,22 @@ Global
|
||||
{0C13E5F3-106B-4836-A7C2-8E5808A6ED78}.Release|IA-32.ActiveCfg = Release|Win32
|
||||
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Debug|amd64.ActiveCfg = Debug|x64
|
||||
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Debug|amd64.Build.0 = Debug|x64
|
||||
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Debug|IA-32.ActiveCfg = Debug|x64
|
||||
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Debug|IA-32.ActiveCfg = Debug|Win32
|
||||
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Release|amd64.ActiveCfg = Release|x64
|
||||
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Release|amd64.Build.0 = Release|x64
|
||||
{1ECCAB38-61B6-4C85-BBB5-2E2232DA3A87}.Release|IA-32.ActiveCfg = Release|Win32
|
||||
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Debug|amd64.ActiveCfg = Debug|x64
|
||||
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Debug|amd64.Build.0 = Debug|x64
|
||||
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Debug|IA-32.ActiveCfg = Debug|Win32
|
||||
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Release|amd64.ActiveCfg = Release|x64
|
||||
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Release|amd64.Build.0 = Release|x64
|
||||
{314A50C1-F0A0-4D0C-89E1-AD8F3951043E}.Release|IA-32.ActiveCfg = Release|Win32
|
||||
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Debug|amd64.ActiveCfg = Debug|x64
|
||||
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Debug|amd64.Build.0 = Debug|x64
|
||||
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Debug|IA-32.ActiveCfg = Debug|Win32
|
||||
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Release|amd64.ActiveCfg = Release|x64
|
||||
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Release|amd64.Build.0 = Release|x64
|
||||
{AF02ABAC-EAEB-471C-9957-73D430B8B4DE}.Release|IA-32.ActiveCfg = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -623,10 +623,18 @@ LSTATUS GUI_RegQueryValueExW(
|
||||
LPDWORD lpcbData
|
||||
)
|
||||
{
|
||||
DWORD dwSize = lpcbData ? *(DWORD*)lpcbData : sizeof(DWORD);
|
||||
LSTATUS lRes = GUI_Internal_RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);
|
||||
if (AuditFile)
|
||||
{
|
||||
fwprintf(AuditFile, L"%s\"%s\"=dword:%08x\n", (lpValueName && wcsncmp(lpValueName, L"Virtualized_" _T(EP_CLSID), 50)) ? L"" : L";", lpValueName, *(DWORD*)lpData);
|
||||
if (dwSize != sizeof(DWORD))
|
||||
{
|
||||
fwprintf(AuditFile, L"%s\"%s\"=\"%s\"\n", (lpValueName && wcsncmp(lpValueName, L"Virtualized_" _T(EP_CLSID), 50)) ? L"" : L";", lpValueName, lpData);
|
||||
}
|
||||
else
|
||||
{
|
||||
fwprintf(AuditFile, L"%s\"%s\"=dword:%08x\n", (lpValueName && wcsncmp(lpValueName, L"Virtualized_" _T(EP_CLSID), 50)) ? L"" : L";", lpValueName, *(DWORD*)lpData);
|
||||
}
|
||||
}
|
||||
return lRes;
|
||||
}
|
||||
@ -1831,6 +1839,13 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
wprintf(L"%s %d\n", wszName, dwVal);
|
||||
GUI_RegSetValueExW(NULL, wszName, 0, RRF_RT_DWORD, &dwVal, sizeof(DWORD));
|
||||
}
|
||||
else
|
||||
{
|
||||
WCHAR* wszTitle = malloc(MAX_LINE_LENGTH * sizeof(WCHAR));
|
||||
wchar_t* x = wcschr(ddd + 2, L'"');
|
||||
x[0] = 0;
|
||||
//wprintf(L">>> %s\n", ddd + 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
free(line2);
|
||||
@ -1840,6 +1855,10 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!strncmp(line + 1, "update_weather", 14))
|
||||
{
|
||||
PostMessageW(FindWindowW(_T(EPW_WEATHER_CLASSNAME), NULL), EP_WEATHER_WM_FETCH_DATA, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
dwMaxHeight += dwLineHeight * dy;
|
||||
@ -1848,7 +1867,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
tabOrder++;
|
||||
}
|
||||
}
|
||||
else if (!strncmp(line, ";l ", 3) || !strncmp(line, ";y ", 3) || !strncmp(line, ";c ", 3) || !strncmp(line, ";z ", 3) || !strncmp(line, ";b ", 3) || !strncmp(line, ";i ", 3) || !strncmp(line, ";d ", 3) || !strncmp(line, ";v ", 3))
|
||||
else if (!strncmp(line, ";l ", 3) || !strncmp(line, ";y ", 3) || !strncmp(line, ";c ", 3) || !strncmp(line, ";w ", 3) || !strncmp(line, ";z ", 3) || !strncmp(line, ";b ", 3) || !strncmp(line, ";i ", 3) || !strncmp(line, ";d ", 3) || !strncmp(line, ";v ", 3))
|
||||
{
|
||||
ZeroMemory(text, (MAX_LINE_LENGTH + 3) * sizeof(wchar_t));
|
||||
text[0] = L'\u2795';
|
||||
@ -1867,9 +1886,14 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
if (x) *x = 0;
|
||||
x = wcschr(text, L'\r');
|
||||
if (x) *x = 0;
|
||||
if (!strncmp(line, ";c ", 3) || !strncmp(line, ";z ", 3) || !strncmp(line, ";b ", 3) || !strncmp(line, ";i ", 3) || !strncmp(line, ";d ", 3) || !strncmp(line, ";v ", 3))
|
||||
if (!strncmp(line, ";w ", 3) || !strncmp(line, ";c ", 3) || !strncmp(line, ";z ", 3) || !strncmp(line, ";b ", 3) || !strncmp(line, ";i ", 3) || !strncmp(line, ";d ", 3) || !strncmp(line, ";v ", 3))
|
||||
{
|
||||
WCHAR* wszTitle = NULL;
|
||||
WCHAR* wszPrompt = NULL;
|
||||
WCHAR* wszDefault = NULL;
|
||||
WCHAR* wszFallbackDefault = NULL;
|
||||
HMENU hMenu = NULL;
|
||||
BOOL bInput = !strncmp(line, ";w ", 3);
|
||||
BOOL bChoice = !strncmp(line, ";c ", 3);
|
||||
BOOL bChoiceLefted = !strncmp(line, ";z ", 3);
|
||||
BOOL bInvert = !strncmp(line, ";i ", 3);
|
||||
@ -1930,6 +1954,43 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
free(miText);
|
||||
}
|
||||
}
|
||||
else if (bInput)
|
||||
{
|
||||
wszTitle = malloc(MAX_LINE_LENGTH * sizeof(WCHAR));
|
||||
wszPrompt = malloc(MAX_LINE_LENGTH * sizeof(WCHAR));
|
||||
wszDefault = malloc(MAX_LINE_LENGTH * sizeof(WCHAR));
|
||||
wszFallbackDefault = malloc(MAX_LINE_LENGTH * sizeof(WCHAR));
|
||||
char* l = malloc(MAX_LINE_LENGTH * sizeof(char));
|
||||
numChRd = getline(&l, &bufsiz, f);
|
||||
char* p = l;
|
||||
p = strchr(p + 1, '\r');
|
||||
if (p) *p = 0;
|
||||
p = strchr(p + 1, '\n');
|
||||
if (p) *p = 0;
|
||||
MultiByteToWideChar(
|
||||
CP_UTF8,
|
||||
MB_PRECOMPOSED,
|
||||
l + 1,
|
||||
numChRd - 1,
|
||||
wszPrompt,
|
||||
MAX_LINE_LENGTH
|
||||
);
|
||||
numChRd = getline(&l, &bufsiz, f);
|
||||
p = l;
|
||||
p = strchr(p + 1, '\r');
|
||||
if (p) *p = 0;
|
||||
p = strchr(p + 1, '\n');
|
||||
if (p) *p = 0;
|
||||
MultiByteToWideChar(
|
||||
CP_UTF8,
|
||||
MB_PRECOMPOSED,
|
||||
l + 1,
|
||||
numChRd - 1,
|
||||
wszFallbackDefault,
|
||||
MAX_LINE_LENGTH
|
||||
);
|
||||
free(l);
|
||||
}
|
||||
numChRd = getline(&line, &bufsiz, f);
|
||||
if (!strncmp(line, ";\"Virtualized_" EP_CLSID, 52))
|
||||
{
|
||||
@ -2011,14 +2072,47 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
DWORD value = FALSE;
|
||||
|
||||
//wprintf(L"%s %s %s\n", section, name, d + 1);
|
||||
if (!wcsncmp(d + 1, L"dword:", 6))
|
||||
if (!bInput && !wcsncmp(d + 1, L"dword:", 6))
|
||||
{
|
||||
wchar_t* x = wcschr(d + 1, L':');
|
||||
x++;
|
||||
value = wcstol(x, NULL, 16);
|
||||
}
|
||||
if (bInput)
|
||||
{
|
||||
wchar_t* x = wcschr(d + 2, L'"');
|
||||
x[0] = 0;
|
||||
wcscpy_s(wszDefault, MAX_LINE_LENGTH, d + 2);
|
||||
}
|
||||
|
||||
if (!bJustCheck)
|
||||
if (bInput)
|
||||
{
|
||||
dwSize = MAX_LINE_LENGTH;
|
||||
GUI_RegCreateKeyExW(
|
||||
bIsHKLM ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
||||
wcschr(section, L'\\') + 1,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_READ | (hDC ? 0 : (!bIsHKLM ? KEY_WRITE : 0)),
|
||||
NULL,
|
||||
& hKey,
|
||||
& dwDisposition
|
||||
);
|
||||
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
hKey = NULL;
|
||||
}
|
||||
GUI_RegQueryValueExW(
|
||||
hKey,
|
||||
name,
|
||||
0,
|
||||
NULL,
|
||||
wszDefault,
|
||||
&dwSize
|
||||
);
|
||||
}
|
||||
else if (!bJustCheck)
|
||||
{
|
||||
GUI_RegCreateKeyExW(
|
||||
bIsHKLM ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
||||
@ -2067,7 +2161,28 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
}
|
||||
value = hKey;
|
||||
}
|
||||
if (bInvert || bBool || bJustCheck)
|
||||
if (bInput)
|
||||
{
|
||||
wcscpy_s(wszTitle, MAX_LINE_LENGTH, text + 3);
|
||||
wcscat_s(
|
||||
text,
|
||||
MAX_LINE_LENGTH,
|
||||
L" : "
|
||||
);
|
||||
if (wszDefault[0] == 0)
|
||||
{
|
||||
wcscat_s(text, MAX_LINE_LENGTH, wszFallbackDefault);
|
||||
}
|
||||
else
|
||||
{
|
||||
wcscat_s(
|
||||
text,
|
||||
MAX_LINE_LENGTH,
|
||||
wszDefault
|
||||
);
|
||||
}
|
||||
}
|
||||
else if (bInvert || bBool || bJustCheck)
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
@ -2254,7 +2369,23 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
else
|
||||
{
|
||||
DWORD val = 0;
|
||||
if (bChoice || bChoiceLefted)
|
||||
if (bInput)
|
||||
{
|
||||
WCHAR* wszAnswer = malloc(MAX_LINE_LENGTH * sizeof(WCHAR));
|
||||
InputBox(FALSE, hwnd, wszPrompt, wszTitle, wszDefault, wszAnswer, MAX_LINE_LENGTH);
|
||||
GUI_RegSetValueExW(
|
||||
hKey,
|
||||
name,
|
||||
0,
|
||||
REG_SZ,
|
||||
wszAnswer,
|
||||
(wcslen(wszAnswer) + 1) * sizeof(WCHAR)
|
||||
);
|
||||
Sleep(100);
|
||||
PostMessageW(FindWindowW(_T(EPW_WEATHER_CLASSNAME), NULL), EP_WEATHER_WM_FETCH_DATA, 0, 0);
|
||||
free(wszAnswer);
|
||||
}
|
||||
else if (bChoice || bChoiceLefted)
|
||||
{
|
||||
RECT rcTemp;
|
||||
rcTemp = rcText;
|
||||
@ -2298,7 +2429,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
{
|
||||
value = _this->section + 1;
|
||||
}
|
||||
if (!(bChoice || bChoiceLefted) || ((bChoice || bChoiceLefted) && val))
|
||||
if (!bInput && (!(bChoice || bChoiceLefted) || ((bChoice || bChoiceLefted) && val)))
|
||||
{
|
||||
GUI_RegSetValueExW(
|
||||
hKey,
|
||||
@ -2332,6 +2463,22 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
}
|
||||
DestroyMenu(hMenu);
|
||||
}
|
||||
if (wszTitle)
|
||||
{
|
||||
free(wszTitle);
|
||||
}
|
||||
if (wszPrompt)
|
||||
{
|
||||
free(wszPrompt);
|
||||
}
|
||||
if (wszDefault)
|
||||
{
|
||||
free(wszDefault);
|
||||
}
|
||||
if (wszFallbackDefault)
|
||||
{
|
||||
free(wszFallbackDefault);
|
||||
}
|
||||
}
|
||||
if (hDC && (!strncmp(line, ";l ", 3) || !strncmp(line, ";y ", 3)))
|
||||
{
|
||||
@ -2477,6 +2624,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
if (text[0] == L'\u2714') dwType = 1;
|
||||
else if (text[0] == L'\u274C') dwType = 2;
|
||||
else if (text[accLen - 1] == 56405) dwType = 3;
|
||||
else if (!strstr(line, "dword")) dwType = 5;
|
||||
WCHAR accText[1000], accText2[1000];
|
||||
ZeroMemory(accText, 1000 * sizeof(wchar_t));
|
||||
ZeroMemory(accText2, 1000 * sizeof(wchar_t));
|
||||
@ -2494,7 +2642,8 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
||||
(dwType == 2 ? L"Disabled" :
|
||||
(dwType == 3 ? L"Link" :
|
||||
(dwType == 4 ? L"Button" :
|
||||
L"List")))
|
||||
(dwType == 5 ? L"Input" :
|
||||
L"List"))))
|
||||
);
|
||||
accLen = wcslen(accText);
|
||||
unsigned int j = 0;
|
||||
@ -2935,10 +3084,10 @@ static LRESULT CALLBACK GUI_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
|
||||
return 0;
|
||||
}
|
||||
// this should be determined from the file, but for now it works
|
||||
else if (wParam >= '1' && wParam <= '9')
|
||||
else if (wParam >= '1' && wParam <= '9' || wParam == '0')
|
||||
{
|
||||
_this->tabOrder = 0;
|
||||
GUI_SetSection(_this, TRUE, wParam - '1');
|
||||
GUI_SetSection(_this, TRUE, wParam == '0' ? 9 : wParam - '1');
|
||||
_this->bShouldAnnounceSelected = TRUE;
|
||||
InvalidateRect(hWnd, NULL, FALSE);
|
||||
return 0;
|
||||
@ -2983,6 +3132,14 @@ static LRESULT CALLBACK GUI_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
|
||||
SetTimer(hWnd, GUI_TIMER_READ_HELP, 200, NULL);
|
||||
return 0;
|
||||
}
|
||||
else if (wParam == 'Z')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else if (wParam == 'X')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if (uMsg == WM_NCMOUSELEAVE && IsThemeActive())
|
||||
{
|
||||
@ -3187,7 +3344,7 @@ __declspec(dllexport) int ZZGUI(HWND hWnd, HINSTANCE hInstance, LPSTR lpszCmdLin
|
||||
return 0;
|
||||
}
|
||||
|
||||
HRESULT hr = CoInitialize(0);
|
||||
HRESULT hr = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
|
||||
|
||||
HKEY hKey = NULL;
|
||||
DWORD dwSize = sizeof(DWORD);
|
||||
|
@ -24,6 +24,7 @@ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
|
||||
#include "getline.h"
|
||||
#include "fmemopen.h"
|
||||
#include "utility.h"
|
||||
#include "../ep_weather_host/ep_weather.h"
|
||||
|
||||
#define MAX_LINE_LENGTH 2000
|
||||
extern HMODULE hModule;
|
||||
|
@ -77,6 +77,7 @@ LRESULT CALLBACK OpenStartOnCurentMonitorThreadHook(
|
||||
MSG* msg = (MSG*)lParam;
|
||||
if (GetSystemMetrics(SM_CMONITORS) >= 2 && msg->message == WM_SYSCOMMAND && (msg->wParam & 0xFFF0) == SC_TASKLIST)
|
||||
{
|
||||
printf("Position Start\n");
|
||||
if (bMonitorOverride)
|
||||
{
|
||||
goto finish;
|
||||
@ -102,6 +103,7 @@ LRESULT CALLBACK OpenStartOnCurentMonitorThreadHook(
|
||||
POINT pt;
|
||||
pt.x = GET_X_LPARAM(pts);
|
||||
pt.y = GET_Y_LPARAM(pts);
|
||||
printf("!! %d %d\n", pt.x, pt.y);
|
||||
HMONITOR monitor = MonitorFromPoint(
|
||||
pt,
|
||||
MONITOR_DEFAULTTONULL
|
||||
@ -131,12 +133,7 @@ DWORD OpenStartOnCurentMonitorThread(OpenStartOnCurentMonitorThreadParams* unuse
|
||||
HWND g_ProgWin = NULL;
|
||||
while (!g_ProgWin)
|
||||
{
|
||||
g_ProgWin = FindWindowEx(
|
||||
NULL,
|
||||
NULL,
|
||||
L"Progman",
|
||||
NULL
|
||||
);
|
||||
g_ProgWin = GetShellWindow();
|
||||
if (!g_ProgWin)
|
||||
{
|
||||
Sleep(100);
|
||||
|
@ -31,6 +31,11 @@
|
||||
#endif
|
||||
#include <valinet/hooking/iatpatch.h>
|
||||
#include <valinet/utility/memmem.h>
|
||||
#include "../ep_weather_host/ep_weather.h"
|
||||
#ifdef _WIN64
|
||||
#include "../ep_weather_host/ep_weather_host_h.h"
|
||||
IEPWeather* epw = NULL;
|
||||
#endif
|
||||
|
||||
#define WINX_ADJUST_X 5
|
||||
#define WINX_ADJUST_Y 5
|
||||
@ -99,6 +104,13 @@ BYTE* lpShouldDisplayCCButton = NULL;
|
||||
HMONITOR hMonitorList[MAX_NUM_MONITORS];
|
||||
DWORD dwMonitorCount = 0;
|
||||
HANDLE hCanStartSws = NULL;
|
||||
DWORD dwWeatherViewMode = EP_WEATHER_VIEW_ICONTEXT;
|
||||
DWORD dwWeatherTemperatureUnit = EP_WEATHER_TUNIT_CELSIUS;
|
||||
DWORD dwWeatherUpdateSchedule = EP_WEATHER_UPDATE_NORMAL;
|
||||
WCHAR* wszWeatherTerm = NULL;
|
||||
WCHAR* wszWeatherLanguage = NULL;
|
||||
WCHAR* wszEPWeatherKillswitch = NULL;
|
||||
HANDLE hEPWeatherKillswitch = NULL;
|
||||
int Code = 0;
|
||||
HRESULT InjectStartFromExplorer();
|
||||
void InvokeClockFlyout();
|
||||
@ -3552,10 +3564,639 @@ HRESULT WINAPI Widgets_GetTooltipTextHook(__int64 a1, __int64 a2, __int64 a3, WC
|
||||
}
|
||||
}
|
||||
|
||||
/*int WINAPI explorer_LoadStringWHook(HINSTANCE hInstance, UINT uID, WCHAR* lpBuffer, UINT cchBufferMax)
|
||||
{
|
||||
WCHAR wszBuffer[MAX_PATH];
|
||||
if (hInstance == GetModuleHandle(NULL) && uID == 912)// && SUCCEEDED(epw->lpVtbl->GetTitle(epw, MAX_PATH, wszBuffer)))
|
||||
{
|
||||
//sws_error_PrintStackTrace();
|
||||
int rez = LoadStringW(hInstance, uID, lpBuffer, cchBufferMax);
|
||||
//wprintf(L"%s\n", lpBuffer);
|
||||
return rez;
|
||||
}
|
||||
else
|
||||
{
|
||||
return LoadStringW(hInstance, uID, lpBuffer, cchBufferMax);
|
||||
}
|
||||
}*/
|
||||
|
||||
void stub1(void* i)
|
||||
{
|
||||
}
|
||||
|
||||
HWND PeopleButton_LastHWND = NULL;
|
||||
|
||||
BOOL explorer_DeleteMenu(HMENU hMenu, UINT uPosition, UINT uFlags)
|
||||
{
|
||||
if (uPosition == 621 && uFlags == 0) // when removing News and interests
|
||||
{
|
||||
DeleteMenu(hMenu, 449, 0); // remove Cortana menu
|
||||
DeleteMenu(hMenu, 435, 0); // remove People menu
|
||||
}
|
||||
return DeleteMenu(hMenu, uPosition, uFlags);
|
||||
}
|
||||
|
||||
SIZE (*PeopleButton_CalculateMinimumSizeFunc)(void*, SIZE*);
|
||||
SIZE WINAPI PeopleButton_CalculateMinimumSizeHook(void* _this, SIZE* pSz)
|
||||
{
|
||||
SIZE ret = PeopleButton_CalculateMinimumSizeFunc(_this, pSz);
|
||||
int mul = 1;
|
||||
if (epw)
|
||||
{
|
||||
switch (dwWeatherViewMode)
|
||||
{
|
||||
case EP_WEATHER_VIEW_ICONTEXT:
|
||||
mul = 4;
|
||||
break;
|
||||
case EP_WEATHER_VIEW_ICONTEMP:
|
||||
mul = 2;
|
||||
break;
|
||||
case EP_WEATHER_VIEW_ICONONLY:
|
||||
mul = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//printf(">> %d %d\n", pSz->cx, pSz->cy);
|
||||
pSz->cx = pSz->cx * mul;
|
||||
if (pSz->cy && epw)
|
||||
{
|
||||
BOOL bIsInitialized = TRUE;
|
||||
HRESULT hr = epw->lpVtbl->IsInitialized(epw, &bIsInitialized);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
int rt = MulDiv(48, pSz->cy, 60);
|
||||
if (!bIsInitialized)
|
||||
{
|
||||
epw->lpVtbl->SetTerm(epw, MAX_PATH * sizeof(WCHAR), wszWeatherTerm);
|
||||
epw->lpVtbl->SetLanguage(epw, MAX_PATH * sizeof(WCHAR), wszWeatherLanguage);
|
||||
if (FAILED(epw->lpVtbl->Initialize(epw, wszEPWeatherKillswitch, bAllocConsole, EP_WEATHER_PROVIDER_GOOGLE, rt, rt, dwWeatherTemperatureUnit, dwWeatherUpdateSchedule * 1000, pSz->cy / 48.0)))
|
||||
{
|
||||
epw->lpVtbl->Release(epw);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
epw->lpVtbl->SetIconSize(epw, rt, rt);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hr == 0x800706ba) // RPC server is unavailable
|
||||
{
|
||||
epw = NULL;
|
||||
InvalidateRect(PeopleButton_LastHWND, NULL, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int PeopleBand_MulDivHook(int nNumber, int nNumerator, int nDenominator)
|
||||
{
|
||||
//printf("<< %d %d %d\n", nNumber, nNumerator, nDenominator);
|
||||
int mul = 1;
|
||||
if (epw)
|
||||
{
|
||||
switch (dwWeatherViewMode)
|
||||
{
|
||||
case EP_WEATHER_VIEW_ICONTEXT:
|
||||
mul = 4;
|
||||
break;
|
||||
case EP_WEATHER_VIEW_ICONTEMP:
|
||||
mul = 2;
|
||||
break;
|
||||
case EP_WEATHER_VIEW_ICONONLY:
|
||||
mul = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return MulDiv(nNumber * mul, nNumerator, nDenominator);
|
||||
}
|
||||
|
||||
DWORD epw_cbTemperature = 0;
|
||||
DWORD epw_cbUnit = 0;
|
||||
DWORD epw_cbCondition = 0;
|
||||
DWORD epw_cbImage = 0;
|
||||
WCHAR* epw_wszTemperature = NULL;
|
||||
WCHAR* epw_wszUnit = NULL;
|
||||
WCHAR* epw_wszCondition = NULL;
|
||||
char* epw_pImage = NULL;
|
||||
__int64 (*PeopleBand_DrawTextWithGlowFunc)(
|
||||
HDC hdc,
|
||||
const unsigned __int16* a2,
|
||||
int a3,
|
||||
struct tagRECT* a4,
|
||||
unsigned int a5,
|
||||
unsigned int a6,
|
||||
unsigned int a7,
|
||||
unsigned int dy,
|
||||
unsigned int a9,
|
||||
int a10,
|
||||
int(__stdcall* a11)(HDC, unsigned __int16*, int, struct tagRECT*, unsigned int, __int64),
|
||||
__int64 a12);
|
||||
__int64 __fastcall PeopleBand_DrawTextWithGlowHook(
|
||||
HDC hdc,
|
||||
const unsigned __int16* a2,
|
||||
int a3,
|
||||
struct tagRECT* a4,
|
||||
unsigned int a5,
|
||||
unsigned int a6,
|
||||
unsigned int a7,
|
||||
unsigned int dy,
|
||||
unsigned int a9,
|
||||
int a10,
|
||||
int(__stdcall* a11)(HDC, unsigned __int16*, int, struct tagRECT*, unsigned int, __int64),
|
||||
__int64 a12)
|
||||
{
|
||||
if (a5 == 0x21 && epw)
|
||||
{
|
||||
BOOL bUseCachedData = InSendMessage();
|
||||
HRESULT hr = S_OK;
|
||||
if (bUseCachedData ? TRUE : SUCCEEDED(hr = epw->lpVtbl->LockData(epw)))
|
||||
{
|
||||
UINT dpiX = 0, dpiY = 0;
|
||||
HRESULT hr = GetDpiForMonitor(MonitorFromWindow(PeopleButton_LastHWND, MONITOR_DEFAULTTOPRIMARY), MDT_DEFAULT, &dpiX, &dpiY);
|
||||
BOOL bShouldUnlockData = TRUE;
|
||||
DWORD cbTemperature = 0;
|
||||
DWORD cbUnit = 0;
|
||||
DWORD cbCondition = 0;
|
||||
DWORD cbImage = 0;
|
||||
BOOL bEmptyData = FALSE;
|
||||
if (bUseCachedData ? TRUE : SUCCEEDED(hr = epw->lpVtbl->GetDataSizes(epw, &cbTemperature, &cbUnit, &cbCondition, &cbImage)))
|
||||
{
|
||||
if (cbTemperature && cbUnit && cbCondition && cbImage)
|
||||
{
|
||||
epw_cbTemperature = cbTemperature;
|
||||
epw_cbUnit = cbUnit;
|
||||
epw_cbCondition = cbCondition;
|
||||
epw_cbImage = cbImage;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!bUseCachedData)
|
||||
{
|
||||
bEmptyData = TRUE;
|
||||
if (bShouldUnlockData)
|
||||
{
|
||||
epw->lpVtbl->UnlockData(epw);
|
||||
bShouldUnlockData = FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bEmptyData = !epw_wszTemperature || !epw_wszUnit || !epw_wszCondition;
|
||||
}
|
||||
bUseCachedData = TRUE;
|
||||
}
|
||||
if (!bUseCachedData)
|
||||
{
|
||||
if (epw_wszTemperature)
|
||||
{
|
||||
free(epw_wszTemperature);
|
||||
}
|
||||
epw_wszTemperature = calloc(1, epw_cbTemperature);
|
||||
if (epw_wszUnit)
|
||||
{
|
||||
free(epw_wszUnit);
|
||||
}
|
||||
epw_wszUnit = calloc(1, epw_cbUnit);
|
||||
if (epw_wszCondition)
|
||||
{
|
||||
free(epw_wszCondition);
|
||||
}
|
||||
epw_wszCondition = calloc(1, epw_cbCondition);
|
||||
if (epw_pImage)
|
||||
{
|
||||
free(epw_pImage);
|
||||
}
|
||||
epw_pImage = calloc(1, epw_cbImage);
|
||||
}
|
||||
if (bUseCachedData ? TRUE : SUCCEEDED(hr = epw->lpVtbl->GetData(epw, epw_cbTemperature, epw_wszTemperature, epw_cbUnit, epw_wszUnit, epw_cbCondition, epw_wszCondition, epw_cbImage, epw_pImage)))
|
||||
{
|
||||
if (!bUseCachedData)
|
||||
{
|
||||
epw->lpVtbl->UnlockData(epw);
|
||||
bShouldUnlockData = FALSE;
|
||||
}
|
||||
|
||||
LOGFONTW logFont;
|
||||
ZeroMemory(&logFont, sizeof(logFont));
|
||||
NONCLIENTMETRICS ncm;
|
||||
ZeroMemory(&ncm, sizeof(NONCLIENTMETRICS));
|
||||
ncm.cbSize = sizeof(NONCLIENTMETRICS);
|
||||
SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);
|
||||
logFont = ncm.lfCaptionFont;
|
||||
logFont.lfHeight = -14 * (dpiX / 96.0);
|
||||
if (bEmptyData)
|
||||
{
|
||||
DWORD dwVal = 1, dwSize = sizeof(DWORD);
|
||||
RegGetValueW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", L"TaskbarSmallIcons", RRF_RT_DWORD, NULL, &dwVal, &dwSize);
|
||||
if (!dwVal)
|
||||
{
|
||||
logFont.lfHeight *= 1.6;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEXT)
|
||||
{
|
||||
//logFont.lfHeight = -12 * (dpiX / 96.0);
|
||||
}
|
||||
}
|
||||
HFONT hFont = CreateFontIndirectW(&logFont);
|
||||
if (hFont)
|
||||
{
|
||||
HDC hDC = CreateCompatibleDC(0);
|
||||
if (hDC)
|
||||
{
|
||||
COLORREF rgbColor = RGB(0, 0, 0);
|
||||
if (ShouldSystemUseDarkMode && ShouldSystemUseDarkMode())
|
||||
{
|
||||
rgbColor = RGB(255, 255, 255);
|
||||
}
|
||||
HFONT hOldFont = SelectFont(hDC, hFont);
|
||||
if (bEmptyData)
|
||||
{
|
||||
RECT rcText;
|
||||
SetRect(&rcText, 0, 0, a4->right, a4->bottom);
|
||||
SIZE size;
|
||||
size.cx = rcText.right - rcText.left;
|
||||
size.cy = rcText.bottom - rcText.top;
|
||||
DWORD dwTextFlags = DT_SINGLELINE | DT_VCENTER | DT_HIDEPREFIX | DT_CENTER;
|
||||
HBITMAP hBitmap = sws_WindowHelpers_CreateAlphaTextBitmap(L"\U0001f4f0", hFont, dwTextFlags, size, rgbColor);
|
||||
if (hBitmap)
|
||||
{
|
||||
HBITMAP hOldBMP = SelectBitmap(hDC, hBitmap);
|
||||
BITMAP BMInf;
|
||||
GetObjectW(hBitmap, sizeof(BITMAP), &BMInf);
|
||||
|
||||
BLENDFUNCTION bf;
|
||||
bf.BlendOp = AC_SRC_OVER;
|
||||
bf.BlendFlags = 0;
|
||||
bf.SourceConstantAlpha = 0xFF;
|
||||
bf.AlphaFormat = AC_SRC_ALPHA;
|
||||
GdiAlphaBlend(hdc, 0, 0, BMInf.bmWidth, BMInf.bmHeight, hDC, 0, 0, BMInf.bmWidth, BMInf.bmHeight, bf);
|
||||
|
||||
SelectBitmap(hDC, hOldBMP);
|
||||
DeleteBitmap(hBitmap);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DWORD dwTextFlags = DT_SINGLELINE | DT_VCENTER | DT_HIDEPREFIX;
|
||||
|
||||
WCHAR wszText1[MAX_PATH];
|
||||
swprintf_s(wszText1, MAX_PATH, L"%s %s", epw_wszTemperature, dwWeatherTemperatureUnit == EP_WEATHER_TUNIT_FAHRENHEIT ? L"\u00B0F" : L"\u00B0C");// epw_wszUnit);
|
||||
RECT rcText1;
|
||||
SetRect(&rcText1, 0, 0, a4->right, a4->bottom);
|
||||
DrawTextW(hDC, wszText1, -1, &rcText1, dwTextFlags | DT_CALCRECT);
|
||||
rcText1.bottom = a4->bottom;
|
||||
WCHAR wszText2[MAX_PATH];
|
||||
swprintf_s(wszText2, MAX_PATH, L"%s", epw_wszCondition);
|
||||
RECT rcText2;
|
||||
SetRect(&rcText2, 0, 0, a4->right, a4->bottom);
|
||||
DrawTextW(hDC, wszText2, -1, &rcText2, dwTextFlags | DT_CALCRECT);
|
||||
rcText2.bottom = a4->bottom;
|
||||
|
||||
dwTextFlags |= DT_END_ELLIPSIS;
|
||||
|
||||
int addend = 0;
|
||||
//int rt = MulDiv(48, a4->bottom, 60);
|
||||
int rt = sqrt(epw_cbImage / 4);
|
||||
int p = 0;// MulDiv(rt, 4, 64);
|
||||
int margin_h = MulDiv(12, dpiX, 144);
|
||||
|
||||
switch (dwWeatherViewMode)
|
||||
{
|
||||
case EP_WEATHER_VIEW_ICONTEXT:
|
||||
addend = (rcText1.right - rcText1.left) + margin_h + (rcText2.right - rcText2.left) + margin_h;
|
||||
break;
|
||||
case EP_WEATHER_VIEW_ICONTEMP:
|
||||
addend = (rcText1.right - rcText1.left) + margin_h;
|
||||
break;
|
||||
case EP_WEATHER_VIEW_ICONONLY:
|
||||
addend = 0;
|
||||
break;
|
||||
}
|
||||
int margin_v = (a4->bottom - rt) / 2;
|
||||
int total_h = (margin_h - p) + rt + (margin_h - p) + addend;
|
||||
if (total_h > a4->right)
|
||||
{
|
||||
int diff = total_h - a4->right;
|
||||
rcText2.right -= diff - 2;
|
||||
switch (dwWeatherViewMode)
|
||||
{
|
||||
case EP_WEATHER_VIEW_ICONTEXT:
|
||||
addend = (rcText1.right - rcText1.left) + margin_h + (rcText2.right - rcText2.left) + margin_h;
|
||||
break;
|
||||
case EP_WEATHER_VIEW_ICONTEMP:
|
||||
addend = (rcText1.right - rcText1.left) + margin_h;
|
||||
break;
|
||||
case EP_WEATHER_VIEW_ICONONLY:
|
||||
addend = 0;
|
||||
break;
|
||||
}
|
||||
total_h = (margin_h - p) + rt + (margin_h - p) + addend;
|
||||
}
|
||||
|
||||
int start_x = (a4->right - total_h) / 2;
|
||||
|
||||
HBITMAP hBitmap = NULL, hOldBitmap = NULL;
|
||||
void* pvBits = NULL;
|
||||
SIZE size;
|
||||
|
||||
BITMAPINFOHEADER BMIH;
|
||||
ZeroMemory(&BMIH, sizeof(BITMAPINFOHEADER));
|
||||
BMIH.biSize = sizeof(BITMAPINFOHEADER);
|
||||
BMIH.biWidth = rt;
|
||||
BMIH.biHeight = -rt;
|
||||
BMIH.biPlanes = 1;
|
||||
BMIH.biBitCount = 32;
|
||||
BMIH.biCompression = BI_RGB;
|
||||
hBitmap = CreateDIBSection(hDC, &BMIH, 0, &pvBits, NULL, 0);
|
||||
if (hBitmap)
|
||||
{
|
||||
memcpy(pvBits, epw_pImage, epw_cbImage);
|
||||
hOldBitmap = SelectBitmap(hDC, hBitmap);
|
||||
|
||||
BLENDFUNCTION bf;
|
||||
bf.BlendOp = AC_SRC_OVER;
|
||||
bf.BlendFlags = 0;
|
||||
bf.SourceConstantAlpha = 0xFF;
|
||||
bf.AlphaFormat = AC_SRC_ALPHA;
|
||||
GdiAlphaBlend(hdc, start_x + (margin_h - p), margin_v, rt, rt, hDC, 0, 0, rt, rt, bf);
|
||||
|
||||
SelectBitmap(hDC, hOldBitmap);
|
||||
DeleteBitmap(hBitmap);
|
||||
}
|
||||
|
||||
if (dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEMP || dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEXT)
|
||||
{
|
||||
size.cx = rcText1.right - rcText1.left;
|
||||
size.cy = rcText1.bottom - rcText1.top;
|
||||
hBitmap = sws_WindowHelpers_CreateAlphaTextBitmap(wszText1, hFont, dwTextFlags, size, rgbColor);
|
||||
if (hBitmap)
|
||||
{
|
||||
HBITMAP hOldBMP = SelectBitmap(hDC, hBitmap);
|
||||
BITMAP BMInf;
|
||||
GetObjectW(hBitmap, sizeof(BITMAP), &BMInf);
|
||||
|
||||
BLENDFUNCTION bf;
|
||||
bf.BlendOp = AC_SRC_OVER;
|
||||
bf.BlendFlags = 0;
|
||||
bf.SourceConstantAlpha = 0xFF;
|
||||
bf.AlphaFormat = AC_SRC_ALPHA;
|
||||
GdiAlphaBlend(hdc, start_x + (margin_h - p) + rt + (margin_h - p), 0, BMInf.bmWidth, BMInf.bmHeight, hDC, 0, 0, BMInf.bmWidth, BMInf.bmHeight, bf);
|
||||
|
||||
SelectBitmap(hDC, hOldBMP);
|
||||
DeleteBitmap(hBitmap);
|
||||
}
|
||||
}
|
||||
|
||||
if (dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEXT)
|
||||
{
|
||||
size.cx = rcText2.right - rcText2.left;
|
||||
size.cy = rcText2.bottom - rcText2.top;
|
||||
hBitmap = sws_WindowHelpers_CreateAlphaTextBitmap(wszText2, hFont, dwTextFlags, size, rgbColor);
|
||||
if (hBitmap)
|
||||
{
|
||||
HBITMAP hOldBMP = SelectBitmap(hDC, hBitmap);
|
||||
BITMAP BMInf;
|
||||
GetObjectW(hBitmap, sizeof(BITMAP), &BMInf);
|
||||
|
||||
BLENDFUNCTION bf;
|
||||
bf.BlendOp = AC_SRC_OVER;
|
||||
bf.BlendFlags = 0;
|
||||
bf.SourceConstantAlpha = 0xFF;
|
||||
bf.AlphaFormat = AC_SRC_ALPHA;
|
||||
GdiAlphaBlend(hdc, start_x + (margin_h - p) + rt + (margin_h - p) + (rcText1.right - rcText1.left) + margin_h, 0, BMInf.bmWidth, BMInf.bmHeight, hDC, 0, 0, BMInf.bmWidth, BMInf.bmHeight, bf);
|
||||
|
||||
SelectBitmap(hDC, hOldBMP);
|
||||
DeleteBitmap(hBitmap);
|
||||
}
|
||||
}
|
||||
}
|
||||
SelectFont(hDC, hOldFont);
|
||||
DeleteDC(hDC);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*free(epw_pImage);
|
||||
free(epw_wszCondition);
|
||||
free(epw_wszUnit);
|
||||
free(epw_wszTemperature);*/
|
||||
}
|
||||
if (!bUseCachedData && bShouldUnlockData)
|
||||
{
|
||||
epw->lpVtbl->UnlockData(epw);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//printf("444444444444 0x%x\n", hr);
|
||||
if (hr == 0x800706ba) // RPC server is unavailable
|
||||
{
|
||||
epw = NULL;
|
||||
InvalidateRect(PeopleButton_LastHWND, NULL, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
//printf("hr %x\n", hr);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
return PeopleBand_DrawTextWithGlowFunc(hdc, a2, a3, a4, a5, a6, a7, dy, a9, a10, a11, a12);
|
||||
}
|
||||
}
|
||||
|
||||
void(*PeopleButton_ShowTooltipFunc)(__int64 a1, unsigned __int8 bShow) = 0;
|
||||
void WINAPI PeopleButton_ShowTooltipHook(__int64 _this, unsigned __int8 bShow)
|
||||
{
|
||||
if (epw)
|
||||
{
|
||||
if (bShow)
|
||||
{
|
||||
HRESULT hr = epw->lpVtbl->LockData(epw);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
WCHAR wszBuffer[MAX_PATH];
|
||||
ZeroMemory(wszBuffer, sizeof(WCHAR) * MAX_PATH);
|
||||
epw->lpVtbl->GetTitle(epw, sizeof(WCHAR) * MAX_PATH, wszBuffer, dwWeatherViewMode);
|
||||
if (wcsstr(wszBuffer, L"(null)"))
|
||||
{
|
||||
HMODULE hModule = GetModuleHandleW(L"pnidui.dll");
|
||||
if (hModule)
|
||||
{
|
||||
LoadStringW(hModule, 35, wszBuffer, MAX_PATH);
|
||||
}
|
||||
}
|
||||
TTTOOLINFOW ti;
|
||||
ZeroMemory(&ti, sizeof(TTTOOLINFOW));
|
||||
ti.cbSize = sizeof(TTTOOLINFOW);
|
||||
ti.hwnd = *((INT64*)_this + 1);
|
||||
ti.uId = *((INT64*)_this + 1);
|
||||
ti.lpszText = wszBuffer;
|
||||
SendMessageW((HWND) * ((INT64*)_this + 10), TTM_UPDATETIPTEXTW, 0, (LPARAM)&ti);
|
||||
epw->lpVtbl->UnlockData(epw);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WCHAR wszBuffer[MAX_PATH];
|
||||
ZeroMemory(wszBuffer, sizeof(WCHAR) * MAX_PATH);
|
||||
LoadStringW(GetModuleHandle(NULL), 912, wszBuffer, MAX_PATH);
|
||||
if (wszBuffer[0])
|
||||
{
|
||||
TTTOOLINFOW ti;
|
||||
ZeroMemory(&ti, sizeof(TTTOOLINFOW));
|
||||
ti.cbSize = sizeof(TTTOOLINFOW);
|
||||
ti.hwnd = *((INT64*)_this + 1);
|
||||
ti.uId = *((INT64*)_this + 1);
|
||||
ti.lpszText = wszBuffer;
|
||||
SendMessageW((HWND) * ((INT64*)_this + 10), TTM_UPDATETIPTEXTW, 0, (LPARAM)&ti);
|
||||
}
|
||||
}
|
||||
if (PeopleButton_ShowTooltipFunc)
|
||||
{
|
||||
return PeopleButton_ShowTooltipFunc(_this, bShow);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
__int64 (*PeopleButton_OnClickFunc)(__int64 a1, __int64 a2) = 0;
|
||||
__int64 PeopleButton_OnClickHook(__int64 a1, __int64 a2)
|
||||
{
|
||||
if (epw)
|
||||
{
|
||||
HWND hWnd = NULL;
|
||||
if (SUCCEEDED(epw->lpVtbl->GetWindowHandle(epw, &hWnd)) && hWnd)
|
||||
{
|
||||
if (IsWindowVisible(hWnd))
|
||||
{
|
||||
if (GetForegroundWindow() != hWnd)
|
||||
{
|
||||
SwitchToThisWindow(hWnd, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
epw->lpVtbl->Hide(epw);
|
||||
//printf("HR %x\n", PostMessageW(hWnd, EP_WEATHER_WM_FETCH_DATA, 0, 0));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RECT rcButton;
|
||||
GetWindowRect(PeopleButton_LastHWND, &rcButton);
|
||||
POINT pButton;
|
||||
pButton.x = rcButton.left;
|
||||
pButton.y = rcButton.top;
|
||||
|
||||
RECT rcWindow;
|
||||
GetWindowRect(hWnd, &rcWindow);
|
||||
|
||||
POINT pNewWindow;
|
||||
|
||||
RECT rc;
|
||||
UINT tbPos = GetTaskbarLocationAndSize(pButton, &rc);
|
||||
if (tbPos == TB_POS_BOTTOM)
|
||||
{
|
||||
pNewWindow.y = rcButton.top - (rcWindow.bottom - rcWindow.top);
|
||||
}
|
||||
else if (tbPos == TB_POS_TOP)
|
||||
{
|
||||
pNewWindow.y = rcButton.bottom;
|
||||
}
|
||||
else if (tbPos == TB_POS_LEFT)
|
||||
{
|
||||
pNewWindow.x = rcButton.right;
|
||||
}
|
||||
if (tbPos == TB_POS_RIGHT)
|
||||
{
|
||||
pNewWindow.x = rcButton.left - (rcWindow.right - rcWindow.left);
|
||||
}
|
||||
|
||||
if (tbPos == TB_POS_BOTTOM || tbPos == TB_POS_TOP)
|
||||
{
|
||||
pNewWindow.x = rcButton.left + ((rcButton.right - rcButton.left) / 2) - ((rcWindow.right - rcWindow.left) / 2);
|
||||
|
||||
HMONITOR hMonitor = MonitorFromPoint(pButton, MONITOR_DEFAULTTOPRIMARY);
|
||||
if (hMonitor)
|
||||
{
|
||||
MONITORINFO mi;
|
||||
mi.cbSize = sizeof(MONITORINFO);
|
||||
if (GetMonitorInfoW(hMonitor, &mi))
|
||||
{
|
||||
if (mi.rcWork.right < pNewWindow.x + (rcWindow.right - rcWindow.left))
|
||||
{
|
||||
pNewWindow.x = mi.rcWork.right - (rcWindow.right - rcWindow.left);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (tbPos == TB_POS_LEFT || tbPos == TB_POS_RIGHT)
|
||||
{
|
||||
pNewWindow.y = rcButton.top + ((rcButton.bottom - rcButton.top) / 2) - ((rcWindow.bottom - rcWindow.top) / 2);
|
||||
|
||||
HMONITOR hMonitor = MonitorFromPoint(pButton, MONITOR_DEFAULTTOPRIMARY);
|
||||
if (hMonitor)
|
||||
{
|
||||
MONITORINFO mi;
|
||||
mi.cbSize = sizeof(MONITORINFO);
|
||||
if (GetMonitorInfoW(hMonitor, &mi))
|
||||
{
|
||||
if (mi.rcWork.bottom < pNewWindow.y + (rcWindow.bottom - rcWindow.top))
|
||||
{
|
||||
pNewWindow.y = mi.rcWork.bottom - (rcWindow.bottom - rcWindow.top);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SetWindowPos(hWnd, NULL, pNewWindow.x, pNewWindow.y, 0, 0, SWP_NOSIZE, SWP_SHOWWINDOW | SWP_FRAMECHANGED);
|
||||
|
||||
epw->lpVtbl->Show(epw);
|
||||
|
||||
SwitchToThisWindow(hWnd, TRUE);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PeopleButton_OnClickFunc)
|
||||
{
|
||||
return PeopleButton_OnClickFunc(a1, a2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
INT64 PeopleButton_SubclassProc(
|
||||
_In_ HWND hWnd,
|
||||
_In_ UINT uMsg,
|
||||
_In_ WPARAM wParam,
|
||||
_In_ LPARAM lParam,
|
||||
UINT_PTR uIdSubclass,
|
||||
DWORD_PTR dwRefData
|
||||
)
|
||||
{
|
||||
if (uMsg == WM_NCDESTROY)
|
||||
{
|
||||
RemoveWindowSubclass(hWnd, PeopleButton_SubclassProc, PeopleButton_SubclassProc);
|
||||
if (epw)
|
||||
{
|
||||
epw->lpVtbl->Release(epw);
|
||||
epw = NULL;
|
||||
PeopleButton_LastHWND = NULL;
|
||||
}
|
||||
}
|
||||
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
|
||||
static BOOL(*SetChildWindowNoActivateFunc)(HWND);
|
||||
BOOL explorer_SetChildWindowNoActivateHook(HWND hWnd)
|
||||
{
|
||||
@ -3597,13 +4238,38 @@ BOOL explorer_SetChildWindowNoActivateHook(HWND hWnd)
|
||||
*(uintptr_t*)(Instance + 160) = ToggleTaskView; // OnClick
|
||||
VirtualProtect(Instance + 160, sizeof(uintptr_t), dwOldProtect, &dwOldProtect);
|
||||
}
|
||||
/*else if (!wcscmp(wszComponentName, L"PeopleButton"))
|
||||
else if (!wcscmp(wszComponentName, L"PeopleButton"))
|
||||
{
|
||||
DWORD dwOldProtect;
|
||||
|
||||
uintptr_t PeopleButton_Instance = *((uintptr_t*)GetWindowLongPtrW(hWnd, 0) + 17);
|
||||
|
||||
VirtualProtect(PeopleButton_Instance + 32, sizeof(uintptr_t), PAGE_READWRITE, &dwOldProtect);
|
||||
if (!PeopleButton_CalculateMinimumSizeFunc) PeopleButton_CalculateMinimumSizeFunc = *(uintptr_t*)(PeopleButton_Instance + 32);
|
||||
*(uintptr_t*)(PeopleButton_Instance + 32) = PeopleButton_CalculateMinimumSizeHook; // CalculateMinimumSize
|
||||
VirtualProtect(PeopleButton_Instance + 32, sizeof(uintptr_t), dwOldProtect, &dwOldProtect);
|
||||
|
||||
VirtualProtect(Instance + 224, sizeof(uintptr_t), PAGE_READWRITE, &dwOldProtect);
|
||||
if (!PeopleButton_ShowTooltipFunc) PeopleButton_ShowTooltipFunc = *(uintptr_t*)(Instance + 224);
|
||||
*(uintptr_t*)(Instance + 224) = PeopleButton_ShowTooltipHook; // OnTooltipShow
|
||||
VirtualProtect(Instance + 224, sizeof(uintptr_t), dwOldProtect, &dwOldProtect);
|
||||
|
||||
VirtualProtect(Instance + 160, sizeof(uintptr_t), PAGE_READWRITE, &dwOldProtect);
|
||||
*(uintptr_t*)(Instance + 160) = ToggleMainClockFlyout; // OnClick
|
||||
if (!PeopleButton_OnClickFunc) PeopleButton_OnClickFunc = *(uintptr_t*)(Instance + 160);
|
||||
*(uintptr_t*)(Instance + 160) = PeopleButton_OnClickHook; // OnClick
|
||||
VirtualProtect(Instance + 160, sizeof(uintptr_t), dwOldProtect, &dwOldProtect);
|
||||
}*/
|
||||
|
||||
PeopleButton_LastHWND = hWnd;
|
||||
SetWindowSubclass(hWnd, PeopleButton_SubclassProc, PeopleButton_SubclassProc, 0);
|
||||
|
||||
if (!epw)
|
||||
{
|
||||
if (SUCCEEDED(CoCreateInstance(&CLSID_EPWeather, NULL, CLSCTX_LOCAL_SERVER, &IID_IEPWeather, &epw)) && epw)
|
||||
{
|
||||
epw->lpVtbl->SetNotifyWindow(epw, hWnd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return SetChildWindowNoActivateFunc(hWnd);
|
||||
@ -4568,6 +5234,108 @@ void WINAPI LoadSettings(LPARAM lParam)
|
||||
&bDisableOfficeHotkeys,
|
||||
&dwSize
|
||||
);
|
||||
|
||||
#ifdef _WIN64
|
||||
DWORD dwOldWeatherTemperatureUnit = dwWeatherTemperatureUnit;
|
||||
dwSize = sizeof(DWORD);
|
||||
RegQueryValueExW(
|
||||
hKey,
|
||||
TEXT("WeatherTemperatureUnit"),
|
||||
0,
|
||||
NULL,
|
||||
&dwWeatherTemperatureUnit,
|
||||
&dwSize
|
||||
);
|
||||
if (dwWeatherTemperatureUnit != dwOldWeatherTemperatureUnit && epw)
|
||||
{
|
||||
epw->lpVtbl->SetTemperatureUnit(epw, dwWeatherTemperatureUnit);
|
||||
HWND hWnd = NULL;
|
||||
if (SUCCEEDED(epw->lpVtbl->GetWindowHandle(epw, &hWnd)) && hWnd)
|
||||
{
|
||||
SendMessageW(hWnd, EP_WEATHER_WM_FETCH_DATA, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
DWORD dwOldWeatherViewMode = dwWeatherViewMode;
|
||||
dwSize = sizeof(DWORD);
|
||||
RegQueryValueExW(
|
||||
hKey,
|
||||
TEXT("WeatherViewMode"),
|
||||
0,
|
||||
NULL,
|
||||
&dwWeatherViewMode,
|
||||
&dwSize
|
||||
);
|
||||
if (dwWeatherViewMode != dwOldWeatherViewMode && PeopleButton_LastHWND)
|
||||
{
|
||||
ToggleTaskbarAutohide();
|
||||
ToggleTaskbarAutohide();
|
||||
InvalidateRect(PeopleButton_LastHWND, NULL, TRUE);
|
||||
}
|
||||
|
||||
DWORD dwOldUpdateSchedule = dwWeatherUpdateSchedule;
|
||||
dwSize = sizeof(DWORD);
|
||||
RegQueryValueExW(
|
||||
hKey,
|
||||
TEXT("WeatherContentUpdateMode"),
|
||||
0,
|
||||
NULL,
|
||||
&dwWeatherUpdateSchedule,
|
||||
&dwSize
|
||||
);
|
||||
if (dwWeatherUpdateSchedule != dwOldUpdateSchedule && epw)
|
||||
{
|
||||
epw->lpVtbl->SetUpdateSchedule(epw, dwWeatherUpdateSchedule * 1000);
|
||||
}
|
||||
|
||||
dwSize = MAX_PATH * sizeof(WCHAR);
|
||||
if (RegQueryValueExW(
|
||||
hKey,
|
||||
TEXT("WeatherLocation"),
|
||||
0,
|
||||
NULL,
|
||||
wszWeatherTerm,
|
||||
&dwSize
|
||||
))
|
||||
{
|
||||
wcscpy_s(wszWeatherTerm, MAX_PATH, L"");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (wszWeatherTerm[0] == 0)
|
||||
{
|
||||
wcscpy_s(wszWeatherTerm, MAX_PATH, L"");
|
||||
}
|
||||
}
|
||||
if (epw)
|
||||
{
|
||||
epw->lpVtbl->SetTerm(epw, MAX_PATH * sizeof(WCHAR), wszWeatherTerm);
|
||||
}
|
||||
dwSize = MAX_PATH * sizeof(WCHAR);
|
||||
if (RegQueryValueExW(
|
||||
hKey,
|
||||
TEXT("WeatherLanguage"),
|
||||
0,
|
||||
NULL,
|
||||
wszWeatherLanguage,
|
||||
&dwSize
|
||||
))
|
||||
{
|
||||
wcscpy_s(wszWeatherLanguage, MAX_PATH, L"en");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (wszWeatherLanguage[0] == 0)
|
||||
{
|
||||
wcscpy_s(wszWeatherLanguage, MAX_PATH, L"en");
|
||||
}
|
||||
}
|
||||
if (epw)
|
||||
{
|
||||
epw->lpVtbl->SetLanguage(epw, MAX_PATH * sizeof(WCHAR), wszWeatherLanguage);
|
||||
}
|
||||
#endif
|
||||
|
||||
dwTemp = TASKBARGLOMLEVEL_DEFAULT;
|
||||
dwSize = sizeof(DWORD);
|
||||
RegQueryValueExW(
|
||||
@ -6534,6 +7302,12 @@ DWORD Inject(BOOL bIsExplorer)
|
||||
|
||||
int rv;
|
||||
|
||||
if (bIsExplorer)
|
||||
{
|
||||
wszWeatherLanguage = malloc(sizeof(WCHAR) * MAX_PATH);
|
||||
wszWeatherTerm = malloc(sizeof(WCHAR) * MAX_PATH);
|
||||
}
|
||||
|
||||
LoadSettings(MAKELPARAM(bIsExplorer, FALSE));
|
||||
|
||||
#ifdef _WIN64
|
||||
@ -6724,6 +7498,13 @@ DWORD Inject(BOOL bIsExplorer)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
wszEPWeatherKillswitch = calloc(sizeof(WCHAR), MAX_PATH);
|
||||
rand_string(wszEPWeatherKillswitch, MAX_PATH / 2);
|
||||
wcscat_s(wszEPWeatherKillswitch, MAX_PATH, _T(EP_Weather_Killswitch));
|
||||
hEPWeatherKillswitch = CreateMutexW(NULL, TRUE, wszEPWeatherKillswitch);
|
||||
|
||||
|
||||
#ifdef _WIN64
|
||||
hCanStartSws = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||
hWin11AltTabInitialized = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||
@ -6798,6 +7579,7 @@ DWORD Inject(BOOL bIsExplorer)
|
||||
VnPatchIAT(hExplorer, "uxtheme.dll", "OpenThemeDataForDpi", explorer_OpenThemeDataForDpi);
|
||||
VnPatchIAT(hExplorer, "uxtheme.dll", "DrawThemeBackground", explorer_DrawThemeBackground);
|
||||
VnPatchIAT(hExplorer, "uxtheme.dll", "CloseThemeData", explorer_CloseThemeData);
|
||||
//VnPatchIAT(hExplorer, "api-ms-win-core-libraryloader-l1-2-0.dll", "LoadStringW", explorer_LoadStringWHook);
|
||||
if (bClassicThemeMitigations)
|
||||
{
|
||||
/*explorer_SetWindowThemeFunc = SetWindowTheme;
|
||||
@ -6827,6 +7609,10 @@ DWORD Inject(BOOL bIsExplorer)
|
||||
{
|
||||
VnPatchIAT(hExplorer, "API-MS-WIN-NTUSER-RECTANGLE-L1-1-0.DLL", "SetRect", explorer_SetRect);
|
||||
}
|
||||
if (bOldTaskbar)
|
||||
{
|
||||
VnPatchIAT(hExplorer, "USER32.DLL", "DeleteMenu", explorer_DeleteMenu);
|
||||
}
|
||||
|
||||
|
||||
#ifdef USE_PRIVATE_INTERFACES
|
||||
@ -6870,7 +7656,13 @@ DWORD Inject(BOOL bIsExplorer)
|
||||
SetPreferredAppMode = GetProcAddress(hUxtheme, (LPCSTR)0x87);
|
||||
AllowDarkModeForWindow = GetProcAddress(hUxtheme, (LPCSTR)0x85);
|
||||
ShouldAppsUseDarkMode = GetProcAddress(hUxtheme, (LPCSTR)0x84);
|
||||
ShouldSystemUseDarkMode = GetProcAddress(hUxtheme, (LPCSTR)0x8A);
|
||||
GetThemeName = GetProcAddress(hUxtheme, (LPCSTR)0x4A);
|
||||
PeopleBand_DrawTextWithGlowFunc = GetProcAddress(hUxtheme, (LPCSTR)0x7E);
|
||||
if (bOldTaskbar)
|
||||
{
|
||||
VnPatchIAT(hExplorer, "uxtheme.dll", (LPCSTR)0x7E, PeopleBand_DrawTextWithGlowHook);
|
||||
}
|
||||
printf("Setup uxtheme functions done\n");
|
||||
|
||||
|
||||
@ -7067,6 +7859,16 @@ DWORD Inject(BOOL bIsExplorer)
|
||||
|
||||
|
||||
|
||||
HANDLE hPeopleBand = LoadLibraryW(L"PeopleBand.dll");
|
||||
if (hPeopleBand)
|
||||
{
|
||||
VnPatchIAT(hPeopleBand, "api-ms-win-core-largeinteger-l1-1-0.dll", "MulDiv", PeopleBand_MulDivHook);
|
||||
printf("Setup peopleband functions done\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
rv = funchook_install(funchook, 0);
|
||||
if (rv != 0)
|
||||
{
|
||||
|
@ -1,67 +1,49 @@
|
||||
/*-
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
/*
|
||||
* Copyright (c) 2017 Joachim Nilsson <troglobit@gmail.com>
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of Novell nor the names of its contributors may
|
||||
* be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "fmemopen.h"
|
||||
|
||||
FILE*
|
||||
fmemopen(void* buf, size_t size, const char* mode)
|
||||
FILE* fmemopen(void* buf, size_t len, const char* type)
|
||||
{
|
||||
char temppath[MAX_PATH + 1];
|
||||
char tempnam[MAX_PATH + 1];
|
||||
DWORD l;
|
||||
HANDLE fh;
|
||||
FILE* fp;
|
||||
int fd;
|
||||
FILE* fp;
|
||||
char tp[MAX_PATH - 13];
|
||||
char fn[MAX_PATH + 1];
|
||||
|
||||
if (strcmp(mode, "r") != 0 && strcmp(mode, "r+") != 0)
|
||||
return 0;
|
||||
l = GetTempPathA(MAX_PATH, temppath);
|
||||
if (!l || l >= MAX_PATH)
|
||||
return 0;
|
||||
if (!GetTempFileNameA(temppath, "solvtmp", 0, tempnam))
|
||||
return 0;
|
||||
fh = CreateFileA(tempnam, DELETE | GENERIC_READ | GENERIC_WRITE, 0,
|
||||
NULL, CREATE_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE,
|
||||
NULL);
|
||||
if (fh == INVALID_HANDLE_VALUE)
|
||||
return 0;
|
||||
fp = _fdopen(_open_osfhandle((intptr_t)fh, 0), "w+b");
|
||||
if (!fp)
|
||||
{
|
||||
CloseHandle(fh);
|
||||
return 0;
|
||||
}
|
||||
if (buf && size && fwrite(buf, size, 1, fp) != 1)
|
||||
{
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
||||
rewind(fp);
|
||||
return fp;
|
||||
if (!GetTempPathA(sizeof(tp), tp))
|
||||
return NULL;
|
||||
|
||||
if (!GetTempFileNameA(tp, "eptmp", 0, fn))
|
||||
return NULL;
|
||||
|
||||
_sopen_s(&fd, fn,
|
||||
_O_CREAT | _O_RDWR | _O_SHORT_LIVED | _O_TEMPORARY | _O_BINARY,
|
||||
_SH_DENYRW,
|
||||
_S_IREAD | _S_IWRITE);
|
||||
if (fd == -1)
|
||||
return NULL;
|
||||
|
||||
fp = _fdopen(fd, "w+");
|
||||
if (!fp) {
|
||||
_close(fd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fwrite(buf, len, 1, fp);
|
||||
rewind(fp);
|
||||
|
||||
return fp;
|
||||
}
|
@ -4,5 +4,6 @@
|
||||
#include <io.h>
|
||||
#include <fcntl.h>
|
||||
#include <windows.h>
|
||||
FILE* fmemopen(void* buf, size_t size, const char* mode);
|
||||
#include <sys/stat.h>
|
||||
FILE* fmemopen(void* buf, size_t len, const char* type);
|
||||
#endif
|
@ -68,9 +68,7 @@
|
||||
;x 1 Small
|
||||
;x 0 Large (default)
|
||||
"TaskbarSmallIcons"=dword:00000000
|
||||
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
||||
;b Show People on the taskbar
|
||||
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_PeopleBand"=dword:00000000
|
||||
;e
|
||||
|
||||
|
||||
;T System tray
|
||||
@ -346,6 +344,48 @@
|
||||
;https://github.com/valinet/ExplorerPatcher/wiki/Simple-Window-Switcher
|
||||
|
||||
|
||||
|
||||
;T Weather
|
||||
;t The following settings only apply to the Windows 10 taskbar:
|
||||
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
||||
;b Show Weather on the taskbar
|
||||
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_PeopleBand"=dword:00000000
|
||||
;c 3 Layout
|
||||
;x 1 Icon only
|
||||
;x 3 Icon and temperature
|
||||
;x 0 Icon and text (default)
|
||||
"WeatherViewMode"=dword:00000000
|
||||
;c 7 Update frequency
|
||||
;x 60 Every minute
|
||||
;x 300 Every 5 minutes
|
||||
;x 900 Every 15 minutes
|
||||
;x 1200 Every 20 minutes (default)
|
||||
;x 1800 Every half an hour
|
||||
;x 3600 Every hour
|
||||
;x 7200 Every couple of hours
|
||||
"WeatherContentUpdateMode"=dword:000004B0
|
||||
;c 2 Temperature unit
|
||||
;x 0 Celsius (default)
|
||||
;x 1 Fahrenheit
|
||||
"WeatherTemperatureUnit"=dword:00000000
|
||||
;w Location
|
||||
;Search City or Zip Code; the program looks up "weather in /* what you typed */" on Google. Leave blank for the default value (IP-based current location).
|
||||
;Current location (default)
|
||||
"WeatherLocation"=""
|
||||
;w Language
|
||||
;Type the short code for the language you'd like the weather data to be displayed in. For example, try "en", "ro", "de", "fr" etc. Leave blank for the default value (English).
|
||||
;en (default)
|
||||
"WeatherLanguage"=""
|
||||
;q
|
||||
;t Weather data courtesy of Google, and weather.com.
|
||||
;y Learn more about the Weather taskbar widget 🡕
|
||||
;https://github.com/valinet/ExplorerPatcher/wiki/Weather
|
||||
;u Refresh weather data
|
||||
;update_weather
|
||||
|
||||
|
||||
|
||||
|
||||
;T Other
|
||||
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
||||
;b Remember last used section in this window
|
||||
@ -401,6 +441,15 @@
|
||||
"UpdatePolicy"=dword:00000001
|
||||
;b Receive pre-release versions, if available (not recommended)
|
||||
"UpdatePreferStaging"=dword:00000000
|
||||
;t Update servers:
|
||||
;w Releases
|
||||
;Type a URL that serves resources adhering to GitHub's releases API. To learn how to configure your own update server, please consult the wiki.
|
||||
;github.com/valinet/ExplorerPatcher/releases/latest
|
||||
"UpdateURL"=""
|
||||
;w Pre-releases
|
||||
;Type a URL that serves resources adhering to GitHub's pre-releases API. To learn how to configure your own update server, please consult the wiki.
|
||||
;api.github.com/repos/valinet/ExplorerPatcher/releases?per_page=1
|
||||
"UpdateURLStaging"=""
|
||||
;y Check for updates
|
||||
;;;EP_CHECK_FOR_UPDATES
|
||||
;y Update program and restart File Explorer
|
||||
@ -483,6 +532,7 @@
|
||||
;reset
|
||||
|
||||
|
||||
|
||||
;f
|
||||
;u Restart File Explorer (*)
|
||||
;restart
|
||||
|
@ -596,6 +596,10 @@ BOOL IsUpdateAvailable(LPCWSTR wszDataStore, char* szCheckAgainst, BOOL* lpFail,
|
||||
szUpdateURL,
|
||||
&dwSize
|
||||
);
|
||||
if (dwSize == 1 && szUpdateURL[0] == 0)
|
||||
{
|
||||
strcat_s(szUpdateURL, MAX_PATH, UPDATES_RELEASE_INFO_URL_STABLE);
|
||||
}
|
||||
strcat_s(szUpdateURL, MAX_PATH, "/download/");
|
||||
strcat_s(szUpdateURL, MAX_PATH, SETUP_UTILITY_NAME);
|
||||
if (wszInfoURL)
|
||||
@ -609,6 +613,10 @@ BOOL IsUpdateAvailable(LPCWSTR wszDataStore, char* szCheckAgainst, BOOL* lpFail,
|
||||
wszInfoURL,
|
||||
&dwSize
|
||||
);
|
||||
if (dwSize == 1 && wszInfoURL[0] == 0)
|
||||
{
|
||||
wcscat_s(wszInfoURL, dwInfoURLLen, _T(UPDATES_RELEASE_INFO_URL_STABLE));
|
||||
}
|
||||
}
|
||||
dwSize = sizeof(DWORD);
|
||||
RegQueryValueExA(
|
||||
@ -641,6 +649,10 @@ BOOL IsUpdateAvailable(LPCWSTR wszDataStore, char* szCheckAgainst, BOOL* lpFail,
|
||||
szUpdateURL,
|
||||
&dwSize
|
||||
);
|
||||
if (dwSize == 1 && szUpdateURL[0] == 0)
|
||||
{
|
||||
strcat_s(szUpdateURL, MAX_PATH, UPDATES_RELEASE_INFO_URL_STAGING);
|
||||
}
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
@ -706,6 +718,10 @@ BOOL UpdateProduct(
|
||||
szUpdateURL,
|
||||
&dwSize
|
||||
);
|
||||
if (dwSize == 1 && szUpdateURL[0] == 0)
|
||||
{
|
||||
strcat_s(szUpdateURL, MAX_PATH, UPDATES_RELEASE_INFO_URL_STABLE);
|
||||
}
|
||||
strcat_s(szUpdateURL, MAX_PATH, "/download/");
|
||||
strcat_s(szUpdateURL, MAX_PATH, SETUP_UTILITY_NAME);
|
||||
dwSize = sizeof(DWORD);
|
||||
@ -739,6 +755,10 @@ BOOL UpdateProduct(
|
||||
szUpdateURL,
|
||||
&dwSize
|
||||
);
|
||||
if (dwSize == 1 && szUpdateURL[0] == 0)
|
||||
{
|
||||
strcat_s(szUpdateURL, MAX_PATH, UPDATES_RELEASE_INFO_URL_STAGING);
|
||||
}
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
@ -789,3 +789,408 @@ LSTATUS RegisterDWMService(DWORD dwDesiredState, DWORD dwOverride)
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
char* StrReplaceAllA(const char* s, const char* oldW, const char* newW, int* dwNewSize)
|
||||
{
|
||||
char* result;
|
||||
int i, cnt = 0;
|
||||
int newWlen = strlen(newW);
|
||||
int oldWlen = strlen(oldW);
|
||||
|
||||
for (i = 0; s[i] != '\0'; i++) {
|
||||
if (strstr(&s[i], oldW) == &s[i]) {
|
||||
cnt++;
|
||||
i += oldWlen - 1;
|
||||
}
|
||||
}
|
||||
result = (char*)malloc(i + cnt * (newWlen - oldWlen) + 1);
|
||||
i = 0;
|
||||
while (*s) {
|
||||
if (strstr(s, oldW) == s) {
|
||||
strcpy_s(&result[i], strlen(newW) + 1, newW);
|
||||
i += newWlen;
|
||||
s += oldWlen;
|
||||
}
|
||||
else
|
||||
result[i++] = *s++;
|
||||
}
|
||||
|
||||
result[i] = '\0';
|
||||
if (dwNewSize) *dwNewSize = i;
|
||||
return result;
|
||||
}
|
||||
|
||||
WCHAR* StrReplaceAllW(const WCHAR* s, const WCHAR* oldW, const WCHAR* newW, int* dwNewSize)
|
||||
{
|
||||
WCHAR* result;
|
||||
int i, cnt = 0;
|
||||
int newWlen = wcslen(newW);
|
||||
int oldWlen = wcslen(oldW);
|
||||
|
||||
for (i = 0; s[i] != L'\0'; i++) {
|
||||
if (wcsstr(&s[i], oldW) == &s[i]) {
|
||||
cnt++;
|
||||
i += oldWlen - 1;
|
||||
}
|
||||
}
|
||||
result = (WCHAR*)malloc((i + cnt * (newWlen - oldWlen) + 1) * sizeof(WCHAR));
|
||||
i = 0;
|
||||
while (*s) {
|
||||
if (wcsstr(s, oldW) == s) {
|
||||
wcscpy_s(&result[i], newWlen + 1, newW);
|
||||
i += newWlen;
|
||||
s += oldWlen;
|
||||
}
|
||||
else
|
||||
result[i++] = *s++;
|
||||
}
|
||||
result[i] = L'\0';
|
||||
if (dwNewSize) *dwNewSize = i;
|
||||
return result;
|
||||
}
|
||||
|
||||
HWND InputBox_HWND;
|
||||
|
||||
HRESULT getEngineGuid(LPCTSTR extension, GUID* guidBuffer)
|
||||
{
|
||||
wchar_t buffer[100];
|
||||
HKEY hk;
|
||||
DWORD size;
|
||||
HKEY subKey;
|
||||
DWORD type;
|
||||
|
||||
// See if this file extension is associated
|
||||
// with an ActiveX script engine
|
||||
if (!RegOpenKeyEx(HKEY_CLASSES_ROOT, extension, 0,
|
||||
KEY_QUERY_VALUE | KEY_READ, &hk))
|
||||
{
|
||||
type = REG_SZ;
|
||||
size = sizeof(buffer);
|
||||
size = RegQueryValueEx(hk, 0, 0, &type,
|
||||
(LPBYTE)&buffer[0], &size);
|
||||
RegCloseKey(hk);
|
||||
if (!size)
|
||||
{
|
||||
// The engine set an association.
|
||||
// We got the Language string in buffer[]. Now
|
||||
// we can use it to look up the engine's GUID
|
||||
|
||||
// Open HKEY_CLASSES_ROOT\{LanguageName}
|
||||
again: size = sizeof(buffer);
|
||||
if (!RegOpenKeyEx(HKEY_CLASSES_ROOT, (LPCTSTR)&buffer[0], 0,
|
||||
KEY_QUERY_VALUE | KEY_READ, &hk))
|
||||
{
|
||||
// Read the GUID (in string format)
|
||||
// into buffer[] by querying the value of CLSID
|
||||
if (!RegOpenKeyEx(hk, L"CLSID", 0,
|
||||
KEY_QUERY_VALUE | KEY_READ, &subKey))
|
||||
{
|
||||
size = RegQueryValueExW(subKey, 0, 0, &type,
|
||||
(LPBYTE)&buffer[0], &size);
|
||||
RegCloseKey(subKey);
|
||||
}
|
||||
else if (extension)
|
||||
{
|
||||
// If an error, see if we have a "ScriptEngine"
|
||||
// key under here that contains
|
||||
// the real language name
|
||||
if (!RegOpenKeyEx(hk, L"ScriptEngine", 0,
|
||||
KEY_QUERY_VALUE | KEY_READ, &subKey))
|
||||
{
|
||||
size = RegQueryValueEx(subKey, 0, 0, &type,
|
||||
(LPBYTE)&buffer[0], &size);
|
||||
RegCloseKey(subKey);
|
||||
if (!size)
|
||||
{
|
||||
RegCloseKey(hk);
|
||||
extension = 0;
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RegCloseKey(hk);
|
||||
|
||||
if (!size)
|
||||
{
|
||||
// Convert the GUID string to a GUID
|
||||
// and put it in caller's guidBuffer
|
||||
if ((size = CLSIDFromString(&buffer[0], guidBuffer)))
|
||||
{
|
||||
return(E_FAIL);
|
||||
}
|
||||
return(size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(E_FAIL);
|
||||
}
|
||||
|
||||
ULONG STDMETHODCALLTYPE ep_static_AddRefRelease(void* _this)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSite_QueryInterface(void* _this, REFIID riid, void** ppv)
|
||||
{
|
||||
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IActiveScriptSite))
|
||||
*ppv = _this;
|
||||
else if (IsEqualIID(riid, &IID_IActiveScriptSiteWindow))
|
||||
*ppv = ((unsigned char*)_this + 8);
|
||||
else
|
||||
{
|
||||
*ppv = 0;
|
||||
return(E_NOINTERFACE);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSiteWindow_QueryInterface(void* _this, REFIID riid, void** ppv)
|
||||
{
|
||||
return IActiveScriptSite_QueryInterface((char*)_this - 8, riid, ppv);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSite_GetLCID(void* _this, LCID* plcid)
|
||||
{
|
||||
*plcid = LOCALE_USER_DEFAULT;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSite_GetItemInfo(void* _this, LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown** ppiunkItem, ITypeInfo** ppti)
|
||||
{
|
||||
return TYPE_E_ELEMENTNOTFOUND;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSite_GetDocVersionString(void* _this, BSTR* pbstrVersion)
|
||||
{
|
||||
*pbstrVersion = 0;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSite_OnScriptTerminate(void* _this, const void* pvarResult, const EXCEPINFO* pexcepinfo)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSite_OnStateChange(void* _this, SCRIPTSTATE ssScriptState)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSite_OnScriptError(void* _this, IActiveScriptError* scriptError)
|
||||
{
|
||||
ULONG lineNumber;
|
||||
BSTR desc;
|
||||
EXCEPINFO ei;
|
||||
OLECHAR wszOutput[1024];
|
||||
|
||||
// Call GetSourcePosition() to retrieve the line # where
|
||||
// the error occurred in the script
|
||||
scriptError->lpVtbl->GetSourcePosition(scriptError, 0, &lineNumber, 0);
|
||||
|
||||
// Call GetSourceLineText() to retrieve the line in the script that
|
||||
// has an error.
|
||||
desc = 0;
|
||||
scriptError->lpVtbl->GetSourceLineText(scriptError, &desc);
|
||||
|
||||
// Call GetExceptionInfo() to fill in our EXCEPINFO struct with more
|
||||
// information.
|
||||
ZeroMemory(&ei, sizeof(EXCEPINFO));
|
||||
scriptError->lpVtbl->GetExceptionInfo(scriptError, &ei);
|
||||
|
||||
// Format the message we'll display to the user
|
||||
wsprintfW(&wszOutput[0], L"%s\nLine %u: %s\n%s", ei.bstrSource,
|
||||
lineNumber + 1, ei.bstrDescription, desc ? desc : "");
|
||||
|
||||
// Free what we got from the IActiveScriptError functions
|
||||
SysFreeString(desc);
|
||||
SysFreeString(ei.bstrSource);
|
||||
SysFreeString(ei.bstrDescription);
|
||||
SysFreeString(ei.bstrHelpFile);
|
||||
|
||||
// Display the message
|
||||
MessageBoxW(0, &wszOutput[0], L"Error",
|
||||
MB_SETFOREGROUND | MB_OK | MB_ICONEXCLAMATION);
|
||||
|
||||
return(S_OK);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSite_OnEnterScript(void* _this)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSite_OnLeaveScript(void* _this)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSiteWindow_GetWindow(void* _this, HWND* phWnd)
|
||||
{
|
||||
*phWnd = InputBox_HWND;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IActiveScriptSiteWindow_EnableModeless(void* _this, BOOL fEnable)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static const IActiveScriptSiteVtbl IActiveScriptSite_Vtbl = {
|
||||
.QueryInterface = IActiveScriptSite_QueryInterface,
|
||||
.AddRef = ep_static_AddRefRelease,
|
||||
.Release = ep_static_AddRefRelease,
|
||||
.GetLCID = IActiveScriptSite_GetLCID,
|
||||
.GetItemInfo = IActiveScriptSite_GetItemInfo,
|
||||
.GetDocVersionString = IActiveScriptSite_GetDocVersionString,
|
||||
.OnScriptTerminate = IActiveScriptSite_OnScriptTerminate,
|
||||
.OnStateChange = IActiveScriptSite_OnStateChange,
|
||||
.OnScriptError = IActiveScriptSite_OnScriptError,
|
||||
.OnEnterScript = IActiveScriptSite_OnEnterScript,
|
||||
.OnLeaveScript = IActiveScriptSite_OnLeaveScript,
|
||||
};
|
||||
|
||||
static const IActiveScriptSiteWindowVtbl IActiveScriptSiteWindow_Vtbl = {
|
||||
.QueryInterface = IActiveScriptSiteWindow_QueryInterface,
|
||||
.AddRef = ep_static_AddRefRelease,
|
||||
.Release = ep_static_AddRefRelease,
|
||||
.GetWindow = IActiveScriptSiteWindow_GetWindow,
|
||||
.EnableModeless = IActiveScriptSiteWindow_EnableModeless,
|
||||
};
|
||||
|
||||
typedef struct _CSimpleScriptSite
|
||||
{
|
||||
IActiveScriptSiteVtbl* lpVtbl;
|
||||
IActiveScriptSiteWindowVtbl* lpVtbl1;
|
||||
} CSimpleScriptSite;
|
||||
|
||||
static const CSimpleScriptSite CSimpleScriptSite_Instance = {
|
||||
.lpVtbl = &IActiveScriptSite_Vtbl,
|
||||
.lpVtbl1 = &IActiveScriptSiteWindow_Vtbl
|
||||
};
|
||||
|
||||
static BOOL HideInput = FALSE;
|
||||
static LRESULT CALLBACK InputBoxProc(int nCode, WPARAM wParam, LPARAM lParam) {
|
||||
if (nCode < HC_ACTION)
|
||||
return CallNextHookEx(0, nCode, wParam, lParam);
|
||||
if (nCode = HCBT_ACTIVATE) {
|
||||
if (HideInput == TRUE) {
|
||||
HWND TextBox = FindWindowExA((HWND)wParam, NULL, "Edit", NULL);
|
||||
SendDlgItemMessageW((HWND)wParam, GetDlgCtrlID(TextBox), EM_SETPASSWORDCHAR, L'\x25cf', 0);
|
||||
}
|
||||
}
|
||||
if (nCode = HCBT_CREATEWND) {
|
||||
if (!(GetWindowLongPtr((HWND)wParam, GWL_STYLE) & WS_CHILD))
|
||||
SetWindowLongPtr((HWND)wParam, GWL_EXSTYLE, GetWindowLongPtr((HWND)wParam, GWL_EXSTYLE) | WS_EX_DLGMODALFRAME);
|
||||
}
|
||||
return CallNextHookEx(0, nCode, wParam, lParam);
|
||||
}
|
||||
|
||||
HRESULT InputBox(BOOL bPassword, HWND hWnd, LPCWSTR wszPrompt, LPCWSTR wszTitle, LPCWSTR wszDefault, LPCWSTR wszAnswer, DWORD cbAnswer)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
GUID guidBuffer;
|
||||
getEngineGuid(L".vbs", &guidBuffer);
|
||||
|
||||
DWORD cchPromptSafe = 0, cchTitleSafe = 0, cchDefaultSafe = 0;
|
||||
LPWSTR wszPromptSafe = StrReplaceAllW(wszPrompt, L"\"", L"\"\"", &cchPromptSafe);
|
||||
LPWSTR wszTitleSafe = StrReplaceAllW(wszTitle, L"\"", L"\"\"", &cchTitleSafe);
|
||||
LPWSTR wszDefaultSafe = StrReplaceAllW(wszDefault, L"\"", L"\"\"", &cchDefaultSafe);
|
||||
if (!wszPromptSafe || !wszTitleSafe || !wszDefaultSafe)
|
||||
{
|
||||
if (wszPromptSafe)
|
||||
{
|
||||
free(wszPromptSafe);
|
||||
}
|
||||
if (wszTitleSafe)
|
||||
{
|
||||
free(wszTitleSafe);
|
||||
}
|
||||
if (wszDefaultSafe)
|
||||
{
|
||||
free(wszDefaultSafe);
|
||||
}
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
IActiveScript* pActiveScript = NULL;
|
||||
hr = CoCreateInstance(&guidBuffer, 0, CLSCTX_ALL,
|
||||
&IID_IActiveScript,
|
||||
(void**)&pActiveScript);
|
||||
if (SUCCEEDED(hr) && pActiveScript)
|
||||
{
|
||||
hr = pActiveScript->lpVtbl->SetScriptSite(pActiveScript, &CSimpleScriptSite_Instance);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
IActiveScriptParse* pActiveScriptParse = NULL;
|
||||
hr = pActiveScript->lpVtbl->QueryInterface(pActiveScript, &IID_IActiveScriptParse, &pActiveScriptParse);
|
||||
if (SUCCEEDED(hr) && pActiveScriptParse)
|
||||
{
|
||||
hr = pActiveScriptParse->lpVtbl->InitNew(pActiveScriptParse);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
LPWSTR wszEvaluation = malloc(sizeof(WCHAR) * (cchPromptSafe + cchTitleSafe + cchDefaultSafe + 100));
|
||||
if (wszEvaluation)
|
||||
{
|
||||
swprintf_s(wszEvaluation, cchPromptSafe + cchTitleSafe + cchDefaultSafe + 100, L"InputBox(\"%s\", \"%s\", \"%s\")", wszPromptSafe, wszTitleSafe, wszDefaultSafe);
|
||||
DWORD cchEvaluation2 = 0;
|
||||
LPWSTR wszEvaluation2 = StrReplaceAllW(wszEvaluation, L"\n", L"\" + vbNewLine + \"", &cchEvaluation2);
|
||||
if (wszEvaluation2)
|
||||
{
|
||||
EXCEPINFO ei;
|
||||
ZeroMemory(&ei, sizeof(EXCEPINFO));
|
||||
DWORD dwThreadId = GetCurrentThreadId();
|
||||
HINSTANCE hInstance = GetModuleHandle(NULL);
|
||||
|
||||
if (!hWnd)
|
||||
{
|
||||
InputBox_HWND = GetAncestor(GetActiveWindow(), GA_ROOTOWNER);
|
||||
}
|
||||
else
|
||||
{
|
||||
InputBox_HWND = hWnd;
|
||||
}
|
||||
|
||||
HHOOK hHook = SetWindowsHookExW(WH_CBT, &InputBoxProc, hInstance, dwThreadId);
|
||||
|
||||
VARIANT result;
|
||||
VariantInit(&result);
|
||||
|
||||
HideInput = bPassword;
|
||||
hr = pActiveScriptParse->lpVtbl->ParseScriptText(pActiveScriptParse, wszEvaluation2, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &result, &ei);
|
||||
|
||||
UnhookWindowsHookEx(hHook);
|
||||
|
||||
free(wszEvaluation2);
|
||||
|
||||
memcpy(wszAnswer, result.bstrVal, cbAnswer * sizeof(WCHAR));
|
||||
|
||||
VariantClear(&result);
|
||||
}
|
||||
free(wszEvaluation);
|
||||
}
|
||||
}
|
||||
pActiveScriptParse->lpVtbl->Release(pActiveScriptParse);
|
||||
}
|
||||
pActiveScript->lpVtbl->Release(pActiveScript);
|
||||
}
|
||||
}
|
||||
|
||||
if (wszPromptSafe)
|
||||
{
|
||||
free(wszPromptSafe);
|
||||
}
|
||||
if (wszTitleSafe)
|
||||
{
|
||||
free(wszTitleSafe);
|
||||
}
|
||||
if (wszDefaultSafe)
|
||||
{
|
||||
free(wszDefaultSafe);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
@ -18,6 +18,7 @@
|
||||
#include <valinet/universal/toast/toast.h>
|
||||
#include "queryversion.h"
|
||||
#pragma comment(lib, "Psapi.lib")
|
||||
#include <activscp.h>
|
||||
|
||||
#include "def.h"
|
||||
|
||||
@ -220,6 +221,8 @@ static void(*AllowDarkModeForWindow)(HWND hWnd, INT64 bAllowDark);
|
||||
|
||||
static BOOL(*ShouldAppsUseDarkMode)();
|
||||
|
||||
static BOOL(*ShouldSystemUseDarkMode)();
|
||||
|
||||
static void(*GetThemeName)(void*, void*, void*);
|
||||
|
||||
static BOOL AppsShouldUseDarkMode() { return TRUE; }
|
||||
@ -236,6 +239,27 @@ BOOL SystemShutdown(BOOL reboot);
|
||||
|
||||
LSTATUS RegisterDWMService(DWORD dwDesiredState, DWORD dwOverride);
|
||||
|
||||
char* StrReplaceAllA(const char* s, const char* oldW, const char* newW, int* dwNewSize);
|
||||
|
||||
WCHAR* StrReplaceAllW(const WCHAR* s, const WCHAR* oldW, const WCHAR* newW, int* dwNewSize);
|
||||
|
||||
HRESULT InputBox(BOOL bPassword, HWND hWnd, LPCWSTR wszPrompt, LPCWSTR wszTitle, LPCWSTR wszDefault, LPCWSTR wszAnswer, DWORD cbAnswer);
|
||||
|
||||
// https://codereview.stackexchange.com/questions/29198/random-string-generator-in-c
|
||||
static inline WCHAR* rand_string(WCHAR* str, size_t size)
|
||||
{
|
||||
const WCHAR charset[] = L"abcdefghijklmnopqrstuvwxyz";
|
||||
if (size) {
|
||||
--size;
|
||||
for (size_t n = 0; n < size; n++) {
|
||||
int key = rand() % (int)(sizeof charset - 1);
|
||||
str[n] = charset[key];
|
||||
}
|
||||
str[size] = L'\0';
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
inline long long milliseconds_now() {
|
||||
LARGE_INTEGER s_frequency;
|
||||
BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency);
|
||||
|
@ -346,6 +346,32 @@ int WINAPI wWinMain(
|
||||
wcscat_s(wszPath, MAX_PATH, L"\\ep_dwm.exe");
|
||||
bOk = InstallResource(TRUE, hInstance, IDR_EP_DWM, wszPath);
|
||||
}
|
||||
if (argc >= 2)
|
||||
{
|
||||
wcsncpy_s(wszPath, MAX_PATH, wargv[1], MAX_PATH);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetCurrentDirectoryW(MAX_PATH, wszPath);
|
||||
}
|
||||
if (bOk)
|
||||
{
|
||||
wcscat_s(wszPath, MAX_PATH, L"\\ep_weather_host.dll");
|
||||
bOk = InstallResource(TRUE, hInstance, IDR_EP_WEATHER, wszPath);
|
||||
}
|
||||
if (argc >= 2)
|
||||
{
|
||||
wcsncpy_s(wszPath, MAX_PATH, wargv[1], MAX_PATH);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetCurrentDirectoryW(MAX_PATH, wszPath);
|
||||
}
|
||||
if (bOk)
|
||||
{
|
||||
wcscat_s(wszPath, MAX_PATH, L"\\ep_weather_host_stub.dll");
|
||||
bOk = InstallResource(TRUE, hInstance, IDR_EP_WEATHER_STUB, wszPath);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -447,6 +473,8 @@ int WINAPI wWinMain(
|
||||
CloseHandle(sei.hProcess);
|
||||
}
|
||||
|
||||
Sleep(500);
|
||||
|
||||
BOOL bAreRoundedCornersDisabled = FALSE;
|
||||
HANDLE h_exists = CreateEventW(NULL, FALSE, FALSE, L"Global\\ep_dwm_" _T(EP_CLSID));
|
||||
if (h_exists)
|
||||
@ -628,6 +656,27 @@ int WINAPI wWinMain(
|
||||
wcscat_s(wszPath, MAX_PATH, L"\\ep_dwm.exe");
|
||||
bOk = InstallResource(bInstall, hInstance, IDR_EP_DWM, wszPath);
|
||||
}
|
||||
if (bInstall)
|
||||
{
|
||||
if (bOk)
|
||||
{
|
||||
PathRemoveFileSpecW(wszPath);
|
||||
wcscat_s(wszPath, MAX_PATH, L"\\ep_weather_host.dll");
|
||||
bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER, wszPath);
|
||||
}
|
||||
if (bOk)
|
||||
{
|
||||
PathRemoveFileSpecW(wszPath);
|
||||
wcscat_s(wszPath, MAX_PATH, L"\\ep_weather_host_stub.dll");
|
||||
bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER_STUB, wszPath);
|
||||
}
|
||||
if (bOk)
|
||||
{
|
||||
PathRemoveFileSpecW(wszPath);
|
||||
wcscat_s(wszPath, MAX_PATH, L"\\WebView2Loader.dll");
|
||||
bOk = InstallResource(bInstall, hInstance, IDR_MS_WEBVIEW2_LOADER, wszPath);
|
||||
}
|
||||
}
|
||||
if (bOk)
|
||||
{
|
||||
bOk = GetWindowsDirectoryW(wszPath, MAX_PATH);
|
||||
@ -670,6 +719,109 @@ int WINAPI wWinMain(
|
||||
GetExitCodeProcess(ShExecInfo.hProcess, &dwExitCode);
|
||||
CloseHandle(ShExecInfo.hProcess);
|
||||
}
|
||||
if (bOk)
|
||||
{
|
||||
WCHAR wszArgs[MAX_PATH];
|
||||
wszArgs[0] = L'/';
|
||||
wszArgs[1] = L's';
|
||||
wszArgs[2] = L' ';
|
||||
wszArgs[3] = L'"';
|
||||
if (!bInstall)
|
||||
{
|
||||
wszArgs[3] = L'/';
|
||||
wszArgs[4] = L'u';
|
||||
wszArgs[5] = L' ';
|
||||
wszArgs[6] = L'"';
|
||||
}
|
||||
SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszArgs + 4 + (bInstall ? 0 : 3));
|
||||
wcscat_s(wszArgs, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\ep_weather_host.dll\"");
|
||||
wprintf(L"%s\n", wszArgs);
|
||||
WCHAR wszApp[MAX_PATH * 2];
|
||||
GetSystemDirectoryW(wszApp, MAX_PATH * 2);
|
||||
wcscat_s(wszApp, MAX_PATH * 2, L"\\regsvr32.exe");
|
||||
wprintf(L"%s\n", wszApp);
|
||||
SHELLEXECUTEINFOW sei;
|
||||
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFOW));
|
||||
sei.cbSize = sizeof(sei);
|
||||
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
|
||||
sei.hwnd = NULL;
|
||||
sei.hInstApp = NULL;
|
||||
sei.lpVerb = NULL;
|
||||
sei.lpFile = wszApp;
|
||||
sei.lpParameters = wszArgs;
|
||||
sei.hwnd = NULL;
|
||||
sei.nShow = SW_NORMAL;
|
||||
if (ShellExecuteExW(&sei) && sei.hProcess)
|
||||
{
|
||||
WaitForSingleObject(sei.hProcess, INFINITE);
|
||||
DWORD dwExitCode = 0;
|
||||
GetExitCodeProcess(sei.hProcess, &dwExitCode);
|
||||
SetLastError(dwExitCode);
|
||||
CloseHandle(sei.hProcess);
|
||||
}
|
||||
}
|
||||
if (bOk)
|
||||
{
|
||||
WCHAR wszArgs[MAX_PATH];
|
||||
wszArgs[0] = L'/';
|
||||
wszArgs[1] = L's';
|
||||
wszArgs[2] = L' ';
|
||||
wszArgs[3] = L'"';
|
||||
if (!bInstall)
|
||||
{
|
||||
wszArgs[3] = L'/';
|
||||
wszArgs[4] = L'u';
|
||||
wszArgs[5] = L' ';
|
||||
wszArgs[6] = L'"';
|
||||
}
|
||||
SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszArgs + 4 + (bInstall ? 0 : 3));
|
||||
wcscat_s(wszArgs, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\ep_weather_host_stub.dll\"");
|
||||
wprintf(L"%s\n", wszArgs);
|
||||
WCHAR wszApp[MAX_PATH * 2];
|
||||
GetSystemDirectoryW(wszApp, MAX_PATH * 2);
|
||||
wcscat_s(wszApp, MAX_PATH * 2, L"\\regsvr32.exe");
|
||||
wprintf(L"%s\n", wszApp);
|
||||
SHELLEXECUTEINFOW sei;
|
||||
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFOW));
|
||||
sei.cbSize = sizeof(sei);
|
||||
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
|
||||
sei.hwnd = NULL;
|
||||
sei.hInstApp = NULL;
|
||||
sei.lpVerb = NULL;
|
||||
sei.lpFile = wszApp;
|
||||
sei.lpParameters = wszArgs;
|
||||
sei.hwnd = NULL;
|
||||
sei.nShow = SW_NORMAL;
|
||||
if (ShellExecuteExW(&sei) && sei.hProcess)
|
||||
{
|
||||
WaitForSingleObject(sei.hProcess, INFINITE);
|
||||
DWORD dwExitCode = 0;
|
||||
GetExitCodeProcess(sei.hProcess, &dwExitCode);
|
||||
SetLastError(dwExitCode);
|
||||
CloseHandle(sei.hProcess);
|
||||
}
|
||||
}
|
||||
if (!bInstall)
|
||||
{
|
||||
if (bOk)
|
||||
{
|
||||
SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszPath);
|
||||
wcscat_s(wszPath, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\ep_weather_host.dll");
|
||||
bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER, wszPath);
|
||||
}
|
||||
if (bOk)
|
||||
{
|
||||
PathRemoveFileSpecW(wszPath);
|
||||
wcscat_s(wszPath, MAX_PATH, L"\\ep_weather_host_stub.dll");
|
||||
bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER_STUB, wszPath);
|
||||
}
|
||||
if (bOk)
|
||||
{
|
||||
PathRemoveFileSpecW(wszPath);
|
||||
wcscat_s(wszPath, MAX_PATH, L"\\WebView2Loader.dll");
|
||||
bOk = InstallResource(bInstall, hInstance, IDR_MS_WEBVIEW2_LOADER, wszPath);
|
||||
}
|
||||
}
|
||||
|
||||
if (bOk)
|
||||
{
|
||||
|
@ -96,6 +96,12 @@ IDR_EP_IA32 RCDATA "..\\build\\Release\\ExplorerPatcher.
|
||||
|
||||
IDR_EP_DWM RCDATA "..\\build\\Release\\ep_dwm.exe"
|
||||
|
||||
IDR_EP_WEATHER RCDATA "..\\build\\Release\\ep_weather_host.dll"
|
||||
|
||||
IDR_EP_WEATHER_STUB RCDATA "..\\build\\Release\\ep_weather_host_stub.dll"
|
||||
|
||||
IDR_MS_WEBVIEW2_LOADER RCDATA "..\\build\\Release\\WebView2Loader.dll"
|
||||
|
||||
#endif // English (United States) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -173,6 +173,14 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||
</None>
|
||||
<None Include="..\build\Debug\ep_weather_host.dll">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||
</None>
|
||||
<None Include="..\build\Debug\ep_weather_host_stub.dll">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||
</None>
|
||||
<None Include="..\build\Debug\ExplorerPatcher.amd64.dll">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||
@ -189,6 +197,14 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
</ExcludedFromBuild>
|
||||
</None>
|
||||
<None Include="..\build\Release\ep_weather_host.dll">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
|
||||
</None>
|
||||
<None Include="..\build\Release\ep_weather_host_stub.dll">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
|
||||
</None>
|
||||
<None Include="..\build\Release\ExplorerPatcher.amd64.dll">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
|
||||
|
@ -48,5 +48,9 @@
|
||||
<None Include="..\build\Debug\ExplorerPatcher.IA-32.dll" />
|
||||
<None Include="..\build\Release\ep_dwm.exe" />
|
||||
<None Include="..\build\Debug\ep_dwm.exe" />
|
||||
<None Include="..\build\Debug\ep_weather_host.dll" />
|
||||
<None Include="..\build\Release\ep_weather_host.dll" />
|
||||
<None Include="..\build\Release\ep_weather_host_stub.dll" />
|
||||
<None Include="..\build\Debug\ep_weather_host_stub.dll" />
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -96,6 +96,12 @@ IDR_EP_IA32 RCDATA "..\\build\\Debug\\ExplorerPatcher.IA
|
||||
|
||||
IDR_EP_DWM RCDATA "..\\build\\Debug\\ep_dwm.exe"
|
||||
|
||||
IDR_EP_WEATHER RCDATA "..\\build\\Debug\\ep_weather_host.dll"
|
||||
|
||||
IDR_EP_WEATHER_STUB RCDATA "..\\build\\Debug\\ep_weather_host_stub.dll"
|
||||
|
||||
IDR_MS_WEBVIEW2_LOADER RCDATA "..\\build\\Release\\WebView2Loader.dll"
|
||||
|
||||
#endif // English (United States) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -5,6 +5,9 @@
|
||||
#define IDR_EP_AMD64 103
|
||||
#define IDR_EP_IA32 104
|
||||
#define IDR_EP_DWM 105
|
||||
#define IDR_EP_WEATHER 106
|
||||
#define IDR_EP_WEATHER_STUB 107
|
||||
#define IDR_MS_WEBVIEW2_LOADER 201
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
|
309
ep_weather_host/ep_weather.c
Normal file
309
ep_weather_host/ep_weather.c
Normal file
@ -0,0 +1,309 @@
|
||||
#include "ep_weather.h"
|
||||
#include "ep_weather_factory.h"
|
||||
#include "ep_weather_host.h"
|
||||
|
||||
HMODULE epw_hModule;
|
||||
DWORD epw_OutstandingObjects = 0;
|
||||
DWORD epw_LockCount = 0;
|
||||
|
||||
#ifdef _WIN64
|
||||
#pragma comment(linker, "/export:DllRegisterServer=_DllRegisterServer")
|
||||
#else
|
||||
#pragma comment(linker, "/export:DllRegisterServer=__DllRegisterServer@0")
|
||||
#endif
|
||||
HRESULT WINAPI _DllRegisterServer()
|
||||
{
|
||||
DWORD dwLastError = ERROR_SUCCESS;
|
||||
HKEY hKey = NULL;
|
||||
DWORD dwSize = 0;
|
||||
wchar_t wszFilename[MAX_PATH];
|
||||
wchar_t wszInstallPath[MAX_PATH];
|
||||
|
||||
if (!dwLastError)
|
||||
{
|
||||
if (!GetModuleFileNameW(epw_hModule, wszFilename, MAX_PATH))
|
||||
{
|
||||
dwLastError = GetLastError();
|
||||
}
|
||||
}
|
||||
if (!dwLastError)
|
||||
{
|
||||
dwLastError = RegCreateKeyExW(
|
||||
HKEY_LOCAL_MACHINE,
|
||||
_T("SOFTWARE\\Classes\\CLSID\\") _T(CLSID_EPWeather_TEXT),
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_WRITE | KEY_WOW64_64KEY,
|
||||
NULL,
|
||||
&hKey,
|
||||
NULL
|
||||
);
|
||||
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
hKey = NULL;
|
||||
}
|
||||
if (hKey)
|
||||
{
|
||||
dwLastError = RegSetValueExW(
|
||||
hKey,
|
||||
NULL,
|
||||
0,
|
||||
REG_SZ,
|
||||
_T(CLSID_EPWeather_Name),
|
||||
29 * sizeof(wchar_t)
|
||||
);
|
||||
dwLastError = RegSetValueExW(
|
||||
hKey,
|
||||
L"AppID",
|
||||
0,
|
||||
REG_SZ,
|
||||
_T(CLSID_EPWeather_TEXT),
|
||||
39 * sizeof(wchar_t)
|
||||
);
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
dwLastError = RegCreateKeyExW(
|
||||
HKEY_LOCAL_MACHINE,
|
||||
_T("SOFTWARE\\Classes\\CLSID\\") _T(CLSID_EPWeather_TEXT) _T("\\InProcServer32"),
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_WRITE | KEY_WOW64_64KEY,
|
||||
NULL,
|
||||
&hKey,
|
||||
NULL
|
||||
);
|
||||
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
hKey = NULL;
|
||||
}
|
||||
if (hKey)
|
||||
{
|
||||
dwLastError = RegSetValueExW(
|
||||
hKey,
|
||||
NULL,
|
||||
0,
|
||||
REG_SZ,
|
||||
wszFilename,
|
||||
(wcslen(wszFilename) + 1) * sizeof(wchar_t)
|
||||
);
|
||||
dwLastError = RegSetValueExW(
|
||||
hKey,
|
||||
L"ThreadingModel",
|
||||
0,
|
||||
REG_SZ,
|
||||
L"Apartment",
|
||||
10 * sizeof(wchar_t)
|
||||
);
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
dwLastError = RegCreateKeyExW(
|
||||
HKEY_LOCAL_MACHINE,
|
||||
_T("SOFTWARE\\Classes\\AppID\\") _T(CLSID_EPWeather_TEXT),
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_WRITE | KEY_WOW64_64KEY,
|
||||
NULL,
|
||||
&hKey,
|
||||
NULL
|
||||
);
|
||||
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
hKey = NULL;
|
||||
}
|
||||
if (hKey)
|
||||
{
|
||||
dwLastError = RegSetValueExW(
|
||||
hKey,
|
||||
NULL,
|
||||
0,
|
||||
REG_SZ,
|
||||
_T(CLSID_EPWeather_Name),
|
||||
29 * sizeof(wchar_t)
|
||||
);
|
||||
dwLastError = RegSetValueExW(
|
||||
hKey,
|
||||
L"DllSurrogate",
|
||||
0,
|
||||
REG_SZ,
|
||||
L"",
|
||||
1 * sizeof(wchar_t)
|
||||
);
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
dwLastError = RegCreateKeyExW(
|
||||
HKEY_LOCAL_MACHINE,
|
||||
_T("SOFTWARE\\Classes\\AppID\\") _T(CLSID_EPWeather_TEXT),
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_WRITE | KEY_WOW64_64KEY,
|
||||
NULL,
|
||||
&hKey,
|
||||
NULL
|
||||
);
|
||||
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
hKey = NULL;
|
||||
}
|
||||
if (hKey)
|
||||
{
|
||||
dwLastError = RegSetValueExW(
|
||||
hKey,
|
||||
NULL,
|
||||
0,
|
||||
REG_SZ,
|
||||
_T(CLSID_EPWeather_Name),
|
||||
29 * sizeof(wchar_t)
|
||||
);
|
||||
dwLastError = RegSetValueExW(
|
||||
hKey,
|
||||
L"DllSurrogate",
|
||||
0,
|
||||
REG_SZ,
|
||||
L"",
|
||||
1 * sizeof(wchar_t)
|
||||
);
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
|
||||
return dwLastError == 0 ? (NOERROR) : (HRESULT_FROM_WIN32(dwLastError));
|
||||
}
|
||||
|
||||
#ifdef _WIN64
|
||||
#pragma comment(linker, "/export:DllUnregisterServer=_DllUnregisterServer")
|
||||
#else
|
||||
#pragma comment(linker, "/export:DllUnregisterServer=__DllUnregisterServer@0")
|
||||
#endif
|
||||
HRESULT WINAPI _DllUnregisterServer()
|
||||
{
|
||||
DWORD dwLastError = ERROR_SUCCESS;
|
||||
HKEY hKey = NULL;
|
||||
DWORD dwSize = 0;
|
||||
wchar_t wszFilename[MAX_PATH];
|
||||
|
||||
if (!dwLastError)
|
||||
{
|
||||
if (!GetModuleFileNameW(epw_hModule, wszFilename, MAX_PATH))
|
||||
{
|
||||
dwLastError = GetLastError();
|
||||
}
|
||||
}
|
||||
if (!dwLastError)
|
||||
{
|
||||
dwLastError = RegOpenKeyW(
|
||||
HKEY_LOCAL_MACHINE,
|
||||
_T("SOFTWARE\\Classes\\CLSID\\") _T(CLSID_EPWeather_TEXT),
|
||||
&hKey
|
||||
);
|
||||
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
hKey = NULL;
|
||||
}
|
||||
if (hKey)
|
||||
{
|
||||
dwLastError = RegDeleteTreeW(
|
||||
hKey,
|
||||
0
|
||||
);
|
||||
RegCloseKey(hKey);
|
||||
if (!dwLastError)
|
||||
{
|
||||
RegDeleteKeyW(
|
||||
HKEY_LOCAL_MACHINE,
|
||||
_T("SOFTWARE\\Classes\\CLSID\\") _T(CLSID_EPWeather_TEXT)
|
||||
);
|
||||
}
|
||||
}
|
||||
dwLastError = RegOpenKeyW(
|
||||
HKEY_LOCAL_MACHINE,
|
||||
_T("SOFTWARE\\Classes\\AppID\\") _T(CLSID_EPWeather_TEXT),
|
||||
&hKey
|
||||
);
|
||||
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
hKey = NULL;
|
||||
}
|
||||
if (hKey)
|
||||
{
|
||||
dwLastError = RegDeleteTreeW(
|
||||
hKey,
|
||||
0
|
||||
);
|
||||
RegCloseKey(hKey);
|
||||
if (!dwLastError)
|
||||
{
|
||||
RegDeleteKeyW(
|
||||
HKEY_LOCAL_MACHINE,
|
||||
_T("SOFTWARE\\Classes\\AppID\\") _T(CLSID_EPWeather_TEXT)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return dwLastError == 0 ? (NOERROR) : (HRESULT_FROM_WIN32(dwLastError));
|
||||
}
|
||||
|
||||
#ifdef _WIN64
|
||||
#pragma comment(linker, "/export:DllCanUnloadNow=_DllCanUnloadNow")
|
||||
#else
|
||||
#pragma comment(linker, "/export:DllCanUnloadNow=__DllCanUnloadNow@0")
|
||||
#endif
|
||||
HRESULT WINAPI _DllCanUnloadNow()
|
||||
{
|
||||
return((epw_OutstandingObjects | epw_LockCount) ? S_FALSE : S_OK);
|
||||
}
|
||||
|
||||
#ifdef _WIN64
|
||||
#pragma comment(linker, "/export:DllGetClassObject=_DllGetClassObject")
|
||||
#else
|
||||
#pragma comment(linker, "/export:DllGetClassObject=__DllGetClassObject@12")
|
||||
#endif
|
||||
HRESULT WINAPI _DllGetClassObject(
|
||||
REFCLSID objGuid,
|
||||
REFIID factoryGuid,
|
||||
LPVOID* factoryHandle
|
||||
)
|
||||
{
|
||||
HRESULT hr;
|
||||
if (IsEqualCLSID(objGuid, &CLSID_EPWeather))
|
||||
{
|
||||
hr = ClassFactory->lpVtbl->QueryInterface(
|
||||
ClassFactory,
|
||||
factoryGuid,
|
||||
factoryHandle
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
*factoryHandle = 0;
|
||||
hr = CLASS_E_CLASSNOTAVAILABLE;
|
||||
}
|
||||
|
||||
return(hr);
|
||||
}
|
||||
|
||||
BOOL WINAPI DllMain(
|
||||
_In_ HINSTANCE hinstDLL,
|
||||
_In_ DWORD fdwReason,
|
||||
_In_ LPVOID lpvReserved
|
||||
)
|
||||
{
|
||||
switch (fdwReason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
DisableThreadLibraryCalls(hinstDLL);
|
||||
epw_hModule = hinstDLL;
|
||||
break;
|
||||
case DLL_THREAD_ATTACH:
|
||||
break;
|
||||
case DLL_THREAD_DETACH:
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
51
ep_weather_host/ep_weather.h
Normal file
51
ep_weather_host/ep_weather.h
Normal file
@ -0,0 +1,51 @@
|
||||
#ifndef _H_AS_H_
|
||||
#define _H_AS_H_
|
||||
#include <initguid.h>
|
||||
#include <Windows.h>
|
||||
#include <tchar.h>
|
||||
#include <Shlwapi.h>
|
||||
|
||||
#pragma comment(lib, "Version.lib")
|
||||
#pragma comment(lib, "Shlwapi.lib")
|
||||
|
||||
#define ALLOC(x) calloc(1, x)
|
||||
#define FREE(x) free(x)
|
||||
|
||||
extern HMODULE epw_hModule;
|
||||
extern DWORD epw_OutstandingObjects;
|
||||
extern DWORD epw_LockCount;
|
||||
|
||||
// {A6EA9C2D-4982-4827-9204-0AC532959F6D}
|
||||
#define CLSID_EPWeather_Name "ExplorerPatcher Weather Host"
|
||||
#define CLSID_EPWeather_TEXT "{A6EA9C2D-4982-4827-9204-0AC532959F6D}"
|
||||
#define EP_Weather_Killswitch "Global\\EP_Weather_Killswitch_" CLSID_EPWeather_TEXT
|
||||
DEFINE_GUID(CLSID_EPWeather,
|
||||
0xa6ea9c2d, 0x4982, 0x4827, 0x92, 0x4, 0xa, 0xc5, 0x32, 0x95, 0x9f, 0x6d);
|
||||
|
||||
#if defined(__cplusplus) && !defined(CINTERFACE)
|
||||
#else
|
||||
DEFINE_GUID(IID_IEPWeather,
|
||||
0xcdbf3734, 0xf847, 0x4f1b, 0xb9, 0x53, 0xa6, 0x5, 0x43, 0x4d, 0xc1, 0xe7);
|
||||
#endif
|
||||
|
||||
#define EPW_WEATHER_CLASSNAME "ExplorerPatcher_Weather_" CLSID_EPWeather_TEXT
|
||||
|
||||
#define EP_WEATHER_KEEP_VALUE -1
|
||||
|
||||
#define EP_WEATHER_NUM_PROVIDERS 2
|
||||
#define EP_WEATHER_PROVIDER_TEST 0
|
||||
#define EP_WEATHER_PROVIDER_GOOGLE 1
|
||||
|
||||
#define EP_WEATHER_NUM_TUNITS 2
|
||||
#define EP_WEATHER_TUNIT_CELSIUS 0
|
||||
#define EP_WEATHER_TUNIT_FAHRENHEIT 1
|
||||
|
||||
#define EP_WEATHER_VIEW_ICONONLY 1
|
||||
#define EP_WEATHER_VIEW_ICONTEMP 3
|
||||
#define EP_WEATHER_VIEW_ICONTEXT 0
|
||||
|
||||
#define EP_WEATHER_UPDATE_NORMAL 1200
|
||||
#define EP_WEATHER_UPDATE_REDUCED 3600
|
||||
|
||||
#define EP_WEATHER_WM_FETCH_DATA (WM_USER + 10)
|
||||
#endif
|
93
ep_weather_host/ep_weather_factory.c
Normal file
93
ep_weather_host/ep_weather_factory.c
Normal file
@ -0,0 +1,93 @@
|
||||
#include "ep_weather_factory.h"
|
||||
#include "ep_weather_host.h"
|
||||
|
||||
ULONG STDMETHODCALLTYPE epw_factory_AddRef(IClassFactory* _this)
|
||||
{
|
||||
return(1);
|
||||
}
|
||||
|
||||
ULONG STDMETHODCALLTYPE epw_factory_Release(IClassFactory* _this)
|
||||
{
|
||||
return(1);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE epw_factory_QueryInterface(
|
||||
IClassFactory* _this,
|
||||
REFIID riid,
|
||||
void** ppv
|
||||
)
|
||||
{
|
||||
if (!IsEqualIID(riid, &IID_IUnknown) &&
|
||||
!IsEqualIID(riid, &IID_IClassFactory))
|
||||
{
|
||||
*ppv = 0;
|
||||
return(E_NOINTERFACE);
|
||||
}
|
||||
*ppv = _this;
|
||||
_this->lpVtbl->AddRef(_this);
|
||||
return(NOERROR);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE epw_factory_LockServer(
|
||||
IClassFactory* this,
|
||||
BOOL flock
|
||||
)
|
||||
{
|
||||
if (flock) InterlockedIncrement(&epw_LockCount);
|
||||
else
|
||||
{
|
||||
LONG dwOutstandingLocks = InterlockedDecrement(&epw_LockCount);
|
||||
LONG dwOutstandingObjects = InterlockedAdd(&epw_OutstandingObjects, 0);
|
||||
if (!dwOutstandingObjects && !dwOutstandingLocks)
|
||||
{
|
||||
}
|
||||
}
|
||||
return(NOERROR);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE epw_factory_CreateInstance(
|
||||
IClassFactory* _this,
|
||||
IUnknown* punkOuter,
|
||||
REFIID vTableGuid,
|
||||
void** ppv
|
||||
)
|
||||
{
|
||||
HRESULT hr = E_NOINTERFACE;
|
||||
EPWeather* thisobj = NULL;
|
||||
|
||||
*ppv = 0;
|
||||
|
||||
if (punkOuter)
|
||||
{
|
||||
hr = CLASS_E_NOAGGREGATION;
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOL bOk = FALSE;
|
||||
if (IsEqualIID(vTableGuid, &IID_IEPWeather))
|
||||
{
|
||||
if (!(thisobj = ALLOC(sizeof(EPWeather))))
|
||||
{
|
||||
hr = E_OUTOFMEMORY;
|
||||
}
|
||||
else
|
||||
{
|
||||
thisobj->lpVtbl = &IEPWeather_Vtbl;
|
||||
bOk = TRUE;
|
||||
}
|
||||
}
|
||||
if (bOk)
|
||||
{
|
||||
thisobj->cbCount = 1;
|
||||
hr = thisobj->lpVtbl->QueryInterface(thisobj, vTableGuid, ppv);
|
||||
thisobj->lpVtbl->Release(thisobj);
|
||||
if (SUCCEEDED(hr)) InterlockedIncrement(&epw_OutstandingObjects);
|
||||
}
|
||||
else
|
||||
{
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
|
||||
return(hr);
|
||||
}
|
34
ep_weather_host/ep_weather_factory.h
Normal file
34
ep_weather_host/ep_weather_factory.h
Normal file
@ -0,0 +1,34 @@
|
||||
#ifndef _H_AS_FACTORY_H_
|
||||
#define _H_AS_FACTORY_H_
|
||||
#include "ep_weather.h"
|
||||
ULONG STDMETHODCALLTYPE epw_factory_AddRef(IClassFactory* _this);
|
||||
ULONG STDMETHODCALLTYPE epw_factory_Release(IClassFactory* _this);
|
||||
HRESULT STDMETHODCALLTYPE epw_factory_QueryInterface(
|
||||
IClassFactory* _this,
|
||||
REFIID riid,
|
||||
void** ppv
|
||||
);
|
||||
HRESULT STDMETHODCALLTYPE epw_factory_LockServer(
|
||||
IClassFactory* _this,
|
||||
BOOL flock
|
||||
);
|
||||
HRESULT STDMETHODCALLTYPE epw_factory_CreateInstance(
|
||||
IClassFactory* _this,
|
||||
IUnknown* punkOuter,
|
||||
REFIID vTableGuid,
|
||||
void** ppv
|
||||
);
|
||||
typedef interface IEPWeatherFactory IEPWeatherFactory;
|
||||
// {A25216A3-4223-4CB3-A572-11A7CC1AEE4E}
|
||||
DEFINE_GUID(IID_IEPWeatherFactory,
|
||||
0xa25216a3, 0x4223, 0x4cb3, 0xa5, 0x72, 0x11, 0xa7, 0xcc, 0x1a, 0xee, 0x4e);
|
||||
static const IClassFactoryVtbl IEPWeatherFactoryVtbl = {
|
||||
epw_factory_QueryInterface,
|
||||
epw_factory_AddRef,
|
||||
epw_factory_Release,
|
||||
epw_factory_CreateInstance,
|
||||
epw_factory_LockServer
|
||||
};
|
||||
static IClassFactory IClassFactoryInstance = { &IEPWeatherFactoryVtbl };
|
||||
static IClassFactory* ClassFactory = &IClassFactoryInstance;
|
||||
#endif
|
1048
ep_weather_host/ep_weather_host.c
Normal file
1048
ep_weather_host/ep_weather_host.c
Normal file
File diff suppressed because it is too large
Load Diff
210
ep_weather_host/ep_weather_host.h
Normal file
210
ep_weather_host/ep_weather_host.h
Normal file
@ -0,0 +1,210 @@
|
||||
#ifndef _H_AS_SERVICE_P_H_
|
||||
#define _H_AS_SERVICE_P_H_
|
||||
#include "ep_weather.h"
|
||||
#include "ep_weather_utility.h"
|
||||
#include "../ep_weather_host_stub/ep_weather_host_h.h"
|
||||
#include <windowsx.h>
|
||||
#include <ShlObj.h>
|
||||
#include <Shobjidl.h>
|
||||
#include <dwmapi.h>
|
||||
#pragma comment(lib, "Dwmapi.lib")
|
||||
#include <netlistmgr.h>
|
||||
#include <Iphlpapi.h>
|
||||
#pragma comment(lib, "IPHLPAPI.lib")
|
||||
#include "WebView2.h"
|
||||
|
||||
DEFINE_GUID(IID_ITaskbarList,
|
||||
0x56FDF342, 0xFD6D, 0x11d0, 0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90);
|
||||
|
||||
#define EP_WEATHER_NUM_SIGNALS 2
|
||||
|
||||
#define EP_WEATHER_TIMER_REQUEST_REPAINT 1
|
||||
#define EP_WEATHER_TIMER_REQUEST_REPAINT_DELAY 1000
|
||||
#define EP_WEATHER_TIMER_REBOUND_BROWSER 2
|
||||
#define EP_WEATHER_TIMER_REBOUND_BROWSER_DELAY 1
|
||||
#define EP_WEATHER_TIMER_SCHEDULE_REFRESH 10
|
||||
|
||||
typedef interface EPWeather
|
||||
{
|
||||
CONST_VTBL IEPWeatherVtbl* lpVtbl;
|
||||
unsigned int cbCount;
|
||||
HRESULT hrLastError;
|
||||
HANDLE hMainThread;
|
||||
HANDLE hInitializeEvent;
|
||||
HWND hWnd;
|
||||
|
||||
INT64 bBrowserBusy; // interlocked
|
||||
HWND hNotifyWnd; // interlocked
|
||||
LONG64 dwTemperatureUnit; // interlocked
|
||||
LONG64 dwUpdateSchedule; // interlocked
|
||||
WCHAR wszTerm[MAX_PATH];
|
||||
WCHAR wszLanguage[MAX_PATH];
|
||||
LONG64 cbx; // interlocked
|
||||
LONG64 cby; // interlocked
|
||||
LONG64 dwProvider; // interlocked
|
||||
|
||||
double dpi;
|
||||
|
||||
HANDLE hMutexData; // protects the following:
|
||||
DWORD cbTemperature;
|
||||
LPCWSTR wszTemperature;
|
||||
DWORD cbUnit;
|
||||
LPCWSTR wszUnit;
|
||||
DWORD cbCondition;
|
||||
LPCWSTR wszCondition;
|
||||
DWORD cbImage;
|
||||
char* pImage;
|
||||
DWORD cbLocation;
|
||||
LPCWSTR wszLocation;
|
||||
|
||||
RECT rcBorderThickness; // local variables:
|
||||
ITaskbarList* pTaskList;
|
||||
ICoreWebView2Controller* pCoreWebView2Controller;
|
||||
ICoreWebView2* pCoreWebView2;
|
||||
EventRegistrationToken* tkOnNavigationCompleted;
|
||||
LPCWSTR wszScriptData;
|
||||
|
||||
HANDLE hSignalExitMainThread;
|
||||
HANDLE hSignalKillSwitch;
|
||||
} EPWeather;
|
||||
|
||||
ULONG STDMETHODCALLTYPE epw_Weather_AddRef(EPWeather* _this);
|
||||
ULONG STDMETHODCALLTYPE epw_Weather_Release(EPWeather* _this);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_QueryInterface(EPWeather* _this, REFIID riid, void** ppv);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_About(EPWeather* _this, HWND hWnd);
|
||||
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_Initialize(EPWeather* _this, WCHAR wszName[MAX_PATH], BOOL bAllocConsole, LONG64 dwProvider, LONG64 cbx, LONG64 cby, LONG64 dwTemperatureUnit, LONG64 dwUpdateSchedule, double dpi);
|
||||
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_Show(EPWeather* _this);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_Hide(EPWeather* _this);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_GetWindowHandle(EPWeather* _this, HWND* phWnd);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_IsInitialized(EPWeather* _this, BOOL* bIsInitialized);
|
||||
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_LockData(EPWeather* _this);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_GetDataSizes(EPWeather* _this, LPDWORD pcbTemperature, LPDWORD pcbUnit, LPDWORD pcbCondition, LPDWORD pcbImage);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_GetData(EPWeather* _this, DWORD cbTemperature, LPCWSTR wszTemperature, DWORD cbUnit, LPCWSTR wszUnit, DWORD cbCondition, LPCWSTR wszCondition, DWORD cbImage, char* pImage);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_GetTitle(EPWeather* _this, DWORD cbTitle, LPCWSTR wszTitle, DWORD dwType);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_UnlockData(EPWeather* _this);
|
||||
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_SetNotifyWindow(EPWeather* _this, HWND hWndNotify);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_SetTemperatureUnit(EPWeather* _this, LONG64 dwTemperatureUnit);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_SetUpdateSchedule(EPWeather* _this, LONG64 dwUpdateSchedule);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_SetTerm(EPWeather* _this, DWORD cbTerm, LPCWSTR wszTerm);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_SetLanguage(EPWeather* _this, DWORD cbLanguage, LPCWSTR wszLanguage);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_SetIconSize(EPWeather* _this, LONG64 cbx, LONG64 cby);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_GetIconSize(EPWeather* _this, LONG64* cbx, LONG64* cby);
|
||||
|
||||
static const IEPWeatherVtbl IEPWeather_Vtbl = {
|
||||
.QueryInterface = epw_Weather_QueryInterface,
|
||||
.AddRef = epw_Weather_AddRef,
|
||||
.Release = epw_Weather_Release,
|
||||
.About = epw_Weather_About,
|
||||
.Initialize = epw_Weather_Initialize,
|
||||
.Show = epw_Weather_Show,
|
||||
.Hide = epw_Weather_Hide,
|
||||
.GetWindowHandle = epw_Weather_GetWindowHandle,
|
||||
.LockData = epw_Weather_LockData,
|
||||
.GetDataSizes = epw_Weather_GetDataSizes,
|
||||
.GetData = epw_Weather_GetData,
|
||||
.UnlockData = epw_Weather_UnlockData,
|
||||
.SetNotifyWindow = epw_Weather_SetNotifyWindow,
|
||||
.IsInitialized = epw_Weather_IsInitialized,
|
||||
.GetTitle = epw_Weather_GetTitle,
|
||||
.SetTemperatureUnit = epw_Weather_SetTemperatureUnit,
|
||||
.SetTerm = epw_Weather_SetTerm,
|
||||
.SetLanguage = epw_Weather_SetLanguage,
|
||||
.SetIconSize = epw_Weather_SetIconSize,
|
||||
.GetIconSize = epw_Weather_GetIconSize,
|
||||
.SetUpdateSchedule = epw_Weather_SetUpdateSchedule,
|
||||
};
|
||||
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_static_Stub(void* _this);
|
||||
ULONG STDMETHODCALLTYPE epw_Weather_static_AddRefRelease(EPWeather* _this);
|
||||
HRESULT STDMETHODCALLTYPE epw_Weather_static_QueryInterface(EPWeather* _this, REFIID riid, void** ppv);
|
||||
|
||||
HRESULT STDMETHODCALLTYPE ICoreWebView2_CreateCoreWebView2EnvironmentCompleted(ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler* _this, HRESULT errorCode, ICoreWebView2Environment* pCoreWebView2Environment);
|
||||
HRESULT STDMETHODCALLTYPE ICoreWebView2_CreateCoreWebView2ControllerCompleted(ICoreWebView2CreateCoreWebView2ControllerCompletedHandler* _this, HRESULT hr, ICoreWebView2Controller* pCoreWebView2Controller);
|
||||
HRESULT STDMETHODCALLTYPE ICoreWebView2_NavigationCompleted(ICoreWebView2NavigationCompletedEventHandler* _this, ICoreWebView2* pCoreWebView2, ICoreWebView2NavigationCompletedEventArgs* pCoreWebView2NavigationCompletedEventArgs);
|
||||
HRESULT STDMETHODCALLTYPE ICoreWebView2_ExecuteScriptCompleted(ICoreWebView2ExecuteScriptCompletedHandler* _this, HRESULT hr, LPCWSTR pResultObjectAsJson);
|
||||
HRESULT STDMETHODCALLTYPE ICoreWebView2_get_AdditionalBrowserArguments(ICoreWebView2EnvironmentOptions* _this, LPWSTR* value);
|
||||
HRESULT STDMETHODCALLTYPE ICoreWebView2_get_Language(ICoreWebView2EnvironmentOptions* _this, LPWSTR* value);
|
||||
HRESULT STDMETHODCALLTYPE ICoreWebView2_get_TargetCompatibleBrowserVersion(ICoreWebView2EnvironmentOptions* _this, LPWSTR* value);
|
||||
HRESULT STDMETHODCALLTYPE ICoreWebView2_get_AllowSingleSignOnUsingOSPrimaryAccount(ICoreWebView2EnvironmentOptions* _this, BOOL* allow);
|
||||
|
||||
static const ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl EPWeather_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl = {
|
||||
.QueryInterface = epw_Weather_static_QueryInterface,
|
||||
.AddRef = epw_Weather_static_AddRefRelease,
|
||||
.Release = epw_Weather_static_AddRefRelease,
|
||||
.Invoke = ICoreWebView2_CreateCoreWebView2EnvironmentCompleted,
|
||||
};
|
||||
|
||||
static const ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler EPWeather_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler = {
|
||||
&EPWeather_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl
|
||||
};
|
||||
|
||||
static const ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl EPWeather_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl = {
|
||||
.QueryInterface = epw_Weather_static_QueryInterface,
|
||||
.AddRef = epw_Weather_static_AddRefRelease,
|
||||
.Release = epw_Weather_static_AddRefRelease,
|
||||
.Invoke = ICoreWebView2_CreateCoreWebView2ControllerCompleted,
|
||||
};
|
||||
|
||||
static const ICoreWebView2CreateCoreWebView2ControllerCompletedHandler EPWeather_ICoreWebView2CreateCoreWebView2ControllerCompletedHandler = {
|
||||
&EPWeather_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl
|
||||
};
|
||||
|
||||
static const ICoreWebView2NavigationCompletedEventHandlerVtbl EPWeather_ICoreWebView2NavigationCompletedEventHandlerVtbl = {
|
||||
.QueryInterface = epw_Weather_static_QueryInterface,
|
||||
.AddRef = epw_Weather_static_AddRefRelease,
|
||||
.Release = epw_Weather_static_AddRefRelease,
|
||||
.Invoke = ICoreWebView2_NavigationCompleted,
|
||||
};
|
||||
|
||||
static const ICoreWebView2NavigationCompletedEventHandler EPWeather_ICoreWebView2NavigationCompletedEventHandler = {
|
||||
&EPWeather_ICoreWebView2NavigationCompletedEventHandlerVtbl
|
||||
};
|
||||
|
||||
static const ICoreWebView2ExecuteScriptCompletedHandlerVtbl EPWeather_ICoreWebView2ExecuteScriptCompletedHandlerVtbl = {
|
||||
.QueryInterface = epw_Weather_static_QueryInterface,
|
||||
.AddRef = epw_Weather_static_AddRefRelease,
|
||||
.Release = epw_Weather_static_AddRefRelease,
|
||||
.Invoke = ICoreWebView2_ExecuteScriptCompleted,
|
||||
};
|
||||
|
||||
static const ICoreWebView2ExecuteScriptCompletedHandler EPWeather_ICoreWebView2ExecuteScriptCompletedHandler = {
|
||||
&EPWeather_ICoreWebView2ExecuteScriptCompletedHandlerVtbl
|
||||
};
|
||||
|
||||
static const ICoreWebView2EnvironmentOptionsVtbl EPWeather_ICoreWebView2EnvironmentOptionsVtbl = {
|
||||
.QueryInterface = epw_Weather_static_QueryInterface,
|
||||
.AddRef = epw_Weather_static_AddRefRelease,
|
||||
.Release = epw_Weather_static_AddRefRelease,
|
||||
.get_AdditionalBrowserArguments = ICoreWebView2_get_AdditionalBrowserArguments,
|
||||
.put_AdditionalBrowserArguments = epw_Weather_static_Stub,
|
||||
.get_Language = ICoreWebView2_get_Language,
|
||||
.put_Language = epw_Weather_static_Stub,
|
||||
.get_TargetCompatibleBrowserVersion = ICoreWebView2_get_TargetCompatibleBrowserVersion,
|
||||
.put_TargetCompatibleBrowserVersion = epw_Weather_static_Stub,
|
||||
.get_AllowSingleSignOnUsingOSPrimaryAccount = ICoreWebView2_get_AllowSingleSignOnUsingOSPrimaryAccount,
|
||||
.put_AllowSingleSignOnUsingOSPrimaryAccount = epw_Weather_static_Stub,
|
||||
};
|
||||
|
||||
static const ICoreWebView2EnvironmentOptions EPWeather_ICoreWebView2EnvironmentOptions = {
|
||||
&EPWeather_ICoreWebView2EnvironmentOptionsVtbl
|
||||
};
|
||||
|
||||
HRESULT STDMETHODCALLTYPE INetworkListManagerEvents_QueryInterface(void* _this, REFIID riid, void** ppv);
|
||||
ULONG STDMETHODCALLTYPE INetworkListManagerEvents_AddRefRelease(void* _this);
|
||||
HRESULT STDMETHODCALLTYPE INetworkListManagerEvents_ConnectivityChanged(void* _this, NLM_CONNECTIVITY newConnectivity);
|
||||
|
||||
static const INetworkListManagerEventsVtbl INetworkListManagerEvents_Vtbl = {
|
||||
.QueryInterface = INetworkListManagerEvents_QueryInterface,
|
||||
.AddRef = INetworkListManagerEvents_AddRefRelease,
|
||||
.Release = INetworkListManagerEvents_AddRefRelease,
|
||||
.ConnectivityChanged = INetworkListManagerEvents_ConnectivityChanged,
|
||||
};
|
||||
|
||||
static const INetworkListManagerEvents INetworkListManagerEvents_Instance = {
|
||||
.lpVtbl = &INetworkListManagerEvents_Vtbl,
|
||||
};
|
||||
#endif
|
100
ep_weather_host/ep_weather_host.rc
Normal file
100
ep_weather_host/ep_weather_host.rc
Normal file
@ -0,0 +1,100 @@
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "winres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (United States) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include ""winres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,0,0,0
|
||||
PRODUCTVERSION 1,0,0,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x40004L
|
||||
FILETYPE 0x1L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "VALINET Solutions SRL"
|
||||
VALUE "FileDescription", "ExplorerPatcher Weather Host"
|
||||
VALUE "FileVersion", "1.0.0.0"
|
||||
VALUE "InternalName", "ep_weather_host.exe"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2006-2022 VALINET Solutions SRL. All rights reserved."
|
||||
VALUE "OriginalFilename", "ep_weather_host.exe"
|
||||
VALUE "ProductName", "ExplorerPatcher"
|
||||
VALUE "ProductVersion", "1.0.0.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
#endif // English (United States) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
183
ep_weather_host/ep_weather_host.vcxproj
Normal file
183
ep_weather_host/ep_weather_host.vcxproj
Normal file
@ -0,0 +1,183 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{314a50c1-f0a0-4d0c-89e1-ad8f3951043e}</ProjectGuid>
|
||||
<RootNamespace>epweatherhost</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)\build\$(Configuration)</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)\build\$(Configuration)</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)\build\$(Configuration)</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)\build\$(Configuration)</OutDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="ep_weather.c" />
|
||||
<ClCompile Include="ep_weather_factory.c" />
|
||||
<ClCompile Include="ep_weather_host.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\ep_weather_host_stub\ep_weather_host_h.h" />
|
||||
<ClInclude Include="ep_weather.h" />
|
||||
<ClInclude Include="ep_weather_factory.h" />
|
||||
<ClInclude Include="ep_weather_host.h" />
|
||||
<ClInclude Include="ep_weather_provider_google_html.h" />
|
||||
<ClInclude Include="ep_weather_provider_google_script.h" />
|
||||
<ClInclude Include="ep_weather_utility.h" />
|
||||
<ClInclude Include="resource.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="ep_weather_host.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Midl Include="..\ep_weather_host_stub\ep_weather_host.idl" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
<Import Project="..\packages\Microsoft.Web.WebView2.1.0.1072.54\build\native\Microsoft.Web.WebView2.targets" Condition="Exists('..\packages\Microsoft.Web.WebView2.1.0.1072.54\build\native\Microsoft.Web.WebView2.targets')" />
|
||||
</ImportGroup>
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\packages\Microsoft.Web.WebView2.1.0.1072.54\build\native\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Web.WebView2.1.0.1072.54\build\native\Microsoft.Web.WebView2.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
67
ep_weather_host/ep_weather_host.vcxproj.filters
Normal file
67
ep_weather_host/ep_weather_host.vcxproj.filters
Normal file
@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="ep_weather_host.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ep_weather_factory.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ep_weather.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="resource.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ep_weather_factory.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ep_weather.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ep_weather_host.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\ep_weather_host_stub\ep_weather_host_h.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ep_weather_utility.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ep_weather_provider_google_script.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ep_weather_provider_google_html.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="ep_weather_host.rc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Midl Include="..\ep_weather_host_stub\ep_weather_host.idl">
|
||||
<Filter>Source Files</Filter>
|
||||
</Midl>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
</Project>
|
51
ep_weather_host/ep_weather_provider_google_html.h
Normal file
51
ep_weather_host/ep_weather_provider_google_html.h
Normal file
@ -0,0 +1,51 @@
|
||||
#ifndef _H_EP_WEATHER_PROVIDER_GOOGLE_HTML_H_
|
||||
#define _H_EP_WEATHER_PROVIDER_GOOGLE_HTML_H_
|
||||
#include <Windows.h>
|
||||
#define EP_WEATHER_PROVIDER_GOOGLE_HTML_LEN 2000
|
||||
LPCWSTR ep_weather_provider_google_html = L"\
|
||||
<!DOCTYPE html>\n\
|
||||
<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">\n\
|
||||
<head>\n\
|
||||
<meta charset=\"utf-8\" />\n\
|
||||
<title>Weather</title>\n\
|
||||
<style>\n\
|
||||
html {\n\
|
||||
background-color: transparent !important;\n\
|
||||
}\n\
|
||||
.google-weather-place {\n\
|
||||
width: calc(655px); height: calc(370px);\n\
|
||||
}\n\
|
||||
.google-weather-crop {\n\
|
||||
width: calc(655px); height: calc(370px);\n\
|
||||
overflow: hidden;\n\
|
||||
transition: 0.3s; \n\
|
||||
position: absolute;\n\
|
||||
}\n\
|
||||
.google-weather-crop:hover {\n\
|
||||
width: 655px; height: 370px;\n\
|
||||
}\n\
|
||||
.google-weather {\n\
|
||||
position: relative;\n\
|
||||
left: -180px; top: -180px;\n\
|
||||
width: 2560px; height: 5120px;\n\
|
||||
transform: scale(1.0);\n\
|
||||
transform-origin: 180px 180px;\n\
|
||||
transition: 0.3s;\n\
|
||||
position: absolute;\n\
|
||||
}\n\
|
||||
.google-weather:hover { \n\
|
||||
transform: scale(1); \n\
|
||||
z-index: 1000; \n\
|
||||
}\n\
|
||||
</style>\n\
|
||||
</head>\n\
|
||||
<body>\n\
|
||||
<div class=\"google-weather-place\">\n\
|
||||
<div class=\"google-weather-crop\">\n\
|
||||
<iframe id=\"frame\" allowtransparency=\"true\" class=\"google-weather\" src=\"https://www.google.com/search?igu=1&hl=%s&q=weather%s%s\">\n\
|
||||
</iframe>\n\
|
||||
</div>\n\
|
||||
</div>\n\
|
||||
</body>\n\
|
||||
</html>";
|
||||
#endif
|
93
ep_weather_host/ep_weather_provider_google_script.h
Normal file
93
ep_weather_host/ep_weather_provider_google_script.h
Normal file
@ -0,0 +1,93 @@
|
||||
#ifndef _H_EP_WEATHER_PROVIDER_GOOGLE_SCRIPT_H_
|
||||
#define _H_EP_WEATHER_PROVIDER_GOOGLE_SCRIPT_H_
|
||||
#include <Windows.h>
|
||||
// many thanks to https://stackoverflow.com/questions/23202966/google-weather-widget-on-my-website
|
||||
#define EP_WEATHER_PROVIDER_GOOGLE_SCRIPT_LEN 4000
|
||||
LPCWSTR ep_weather_provider_google_script = L"\
|
||||
function ep_weather_utf8ToHex(str) {\n\
|
||||
return Array.from(str).map(c => \n\
|
||||
c.charCodeAt(0) < 128 ? c.charCodeAt(0).toString(16) : \n\
|
||||
encodeURIComponent(c).replace(/\\%%/g,'').toLowerCase()\n\
|
||||
).join('');\n\
|
||||
}\n\
|
||||
function ep_weather_drawImageToCanvas(image) {\n\
|
||||
const canvas = document.createElement('canvas');\n\
|
||||
const w = image.width;\n\
|
||||
const h = image.height;\n\
|
||||
canvas.width = w;\n\
|
||||
canvas.height = h;\n\
|
||||
canvas.getContext('2d').drawImage(image, 0, 0);\n\
|
||||
return canvas;\n\
|
||||
}\n\
|
||||
function ep_weather_toHexString (byteArray) {\n\
|
||||
//const chars = new Buffer(byteArray.length * 2);\n\
|
||||
const chars = new Uint8Array(byteArray.length * 2);\n\
|
||||
const alpha = 'a'.charCodeAt(0) - 10;\n\
|
||||
const digit = '0'.charCodeAt(0);\n\
|
||||
\n\
|
||||
let p = 0;\n\
|
||||
for (let i = 0; i < byteArray.length; i++) {\n\
|
||||
let nibble = byteArray[i] >>> 4;\n\
|
||||
chars[p++] = nibble > 9 ? nibble + alpha : nibble + digit;\n\
|
||||
nibble = byteArray[i] & 0xF;\n\
|
||||
chars[p++] = nibble > 9 ? nibble + alpha : nibble + digit;\n\
|
||||
}\n\
|
||||
\n\
|
||||
//return chars.toString('utf8');\n\
|
||||
return String.fromCharCode.apply(null, chars);\n\
|
||||
}\n\
|
||||
function ep_weather_getData(imageBitmap, ch) {\n\
|
||||
const canvas = ep_weather_drawImageToCanvas(imageBitmap);\n\
|
||||
const ctx = canvas.getContext('2d');\n\
|
||||
\n\
|
||||
let result = [];\n\
|
||||
for (let y = 0; y < canvas.height; y++) {\n\
|
||||
for (let x = 0; x < canvas.width; x++) {\n\
|
||||
let data = ctx.getImageData(x, y, 1, 1).data;\n\
|
||||
result.push(data[2] * data[3] / 255);\n\
|
||||
result.push(data[1] * data[3] / 255);\n\
|
||||
result.push(data[0] * data[3] / 255);\n\
|
||||
result.push(data[3]);\n\
|
||||
}\n\
|
||||
}\n\
|
||||
let res = (\n\
|
||||
document.getElementById(\"frame\").contentWindow.document.getElementById(ch.includes('x') ? \"wob_ttm\" : \"wob_tm\").innerText + \"#\" + \n\
|
||||
Array.from(document.getElementById(\"frame\").contentWindow.document.getElementsByClassName('wob-unit')[0].getElementsByTagName('span')).filter(e => e.className == 'wob_t').filter(e => !e.style.display.toString().includes(\"none\"))[0].innerText + \"#\" + \n\
|
||||
document.getElementById(\"frame\").contentWindow.document.getElementById(\"wob_tci\").alt + \"#\" + \n\
|
||||
document.getElementById(\"frame\").contentWindow.document.getElementById(\"wob_loc\").innerText + \"#\" + \n\
|
||||
ep_weather_toHexString(result)\n\
|
||||
);\n\
|
||||
console.log(res);\n\
|
||||
document.body.style.backgroundColor='transparent';\n\
|
||||
document.getElementById(\"frame\").contentWindow.document.body.style.backgroundColor='transparent';\n\
|
||||
return res;\n\
|
||||
}\n\
|
||||
var ep_result;\n\
|
||||
let unit = Array.from(document.getElementById(\"frame\").contentWindow.document.getElementsByClassName('wob-unit')[0].getElementsByTagName('span')).filter(e => e.className == 'wob_t')[0].innerText;\n\
|
||||
let p = '%c';\n\
|
||||
if (!unit.includes(p)) {\n\
|
||||
Array.from(document.getElementById(\"frame\").contentWindow.document.getElementsByClassName('wob-unit')[0].getElementsByTagName('a')).filter(e => e.className == 'wob_t').filter(e => e.innerText.includes(p))[0].click();\n\
|
||||
unit = 'x';\n\
|
||||
}\n\
|
||||
createImageBitmap(\n\
|
||||
document.getElementById(\"frame\").contentWindow.document.getElementById('wob_tci'), \n\
|
||||
{ resizeWidth: %d, resizeHeight: %d, resizeQuality: 'high' }\n\
|
||||
)\n\
|
||||
.then(imageBitmap => \n\
|
||||
ep_result = ep_weather_getData(imageBitmap, unit)\n\
|
||||
);\n\
|
||||
function ep_weather_part1() {\n\
|
||||
return \"run_part_2\";\n\
|
||||
}\n\
|
||||
ep_weather_part1();\n\
|
||||
";
|
||||
|
||||
LPCWSTR ep_weather_provider_google_script2 = L"\
|
||||
function ep_weather_part2() {\n\
|
||||
document.getElementById(\"frame\").contentWindow.document.getElementsByClassName(\"KFFQ0c\")[0].style.display = 'none';\n\
|
||||
document.getElementById(\"frame\").contentWindow.document.getElementById(\"search\").scrollIntoView(true);\n\
|
||||
return ep_result;\n\
|
||||
}\n\
|
||||
ep_weather_part2();\n\
|
||||
";
|
||||
#endif
|
34
ep_weather_host/ep_weather_utility.h
Normal file
34
ep_weather_host/ep_weather_utility.h
Normal file
@ -0,0 +1,34 @@
|
||||
#ifndef _H_EP_WEATHER_UTILITY_H_
|
||||
#define _H_EP_WEATHER_UTILITY_H_
|
||||
#include <Windows.h>
|
||||
#include <stdint.h>
|
||||
inline void QueryVersionInfo(HMODULE hModule, WORD Resource, DWORD* dwLeftMost, DWORD* dwSecondLeft, DWORD* dwSecondRight, DWORD* dwRightMost)
|
||||
{
|
||||
HRSRC hResInfo;
|
||||
DWORD dwSize;
|
||||
HGLOBAL hResData;
|
||||
LPVOID pRes, pResCopy;
|
||||
UINT uLen;
|
||||
VS_FIXEDFILEINFO* lpFfi;
|
||||
|
||||
hResInfo = FindResource(hModule, MAKEINTRESOURCE(Resource), RT_VERSION);
|
||||
dwSize = SizeofResource(hModule, hResInfo);
|
||||
hResData = LoadResource(hModule, hResInfo);
|
||||
pRes = LockResource(hResData);
|
||||
pResCopy = LocalAlloc(LMEM_FIXED, dwSize);
|
||||
CopyMemory(pResCopy, pRes, dwSize);
|
||||
FreeResource(hResData);
|
||||
|
||||
VerQueryValue(pResCopy, TEXT("\\"), (LPVOID*)&lpFfi, &uLen);
|
||||
|
||||
DWORD dwFileVersionMS = lpFfi->dwFileVersionMS;
|
||||
DWORD dwFileVersionLS = lpFfi->dwFileVersionLS;
|
||||
|
||||
*dwLeftMost = HIWORD(dwFileVersionMS);
|
||||
*dwSecondLeft = LOWORD(dwFileVersionMS);
|
||||
*dwSecondRight = HIWORD(dwFileVersionLS);
|
||||
*dwRightMost = LOWORD(dwFileVersionLS);
|
||||
|
||||
LocalFree(pResCopy);
|
||||
}
|
||||
#endif
|
4
ep_weather_host/packages.config
Normal file
4
ep_weather_host/packages.config
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.Web.WebView2" version="1.0.1072.54" targetFramework="native" />
|
||||
</packages>
|
14
ep_weather_host/resource.h
Normal file
14
ep_weather_host/resource.h
Normal file
@ -0,0 +1,14 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by ep_weather_host.rc
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 101
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
61
ep_weather_host_stub/ep_weather_host.idl
Normal file
61
ep_weather_host_stub/ep_weather_host.idl
Normal file
@ -0,0 +1,61 @@
|
||||
import "oaidl.idl";
|
||||
import "ocidl.idl";
|
||||
import "unknwn.idl";
|
||||
|
||||
[
|
||||
object,
|
||||
uuid(CDBF3734-F847-4F1B-B953-A605434DC1E7),
|
||||
oleautomation,
|
||||
helpstring("ExplorerPatcher Weather Information")
|
||||
] interface IEPWeather : IUnknown
|
||||
{
|
||||
HRESULT About([in] HWND hWnd);
|
||||
|
||||
HRESULT Initialize([in] WCHAR wszName[260], [in] BOOL bAllocConsole, [in] LONG64 dwProvider, [in] LONG64 cbx, [in] LONG64 cby, [in] LONG64 dwTemperatureUnit, [in] LONG64 dwUpdateSchedule, [in] double dpi);
|
||||
|
||||
HRESULT Show();
|
||||
|
||||
HRESULT Hide();
|
||||
|
||||
HRESULT GetWindowHandle([out] HWND* phWnd);
|
||||
|
||||
HRESULT LockData();
|
||||
|
||||
HRESULT GetDataSizes(
|
||||
[out] LPDWORD pcbTemperature,
|
||||
[out] LPDWORD pcbUnit,
|
||||
[out] LPDWORD pcbCondition,
|
||||
[out] LPDWORD pcbImage
|
||||
);
|
||||
|
||||
HRESULT GetData(
|
||||
[in] DWORD cbTemperature,
|
||||
[out, size_is(cbTemperature)] BYTE* wszTemperature,
|
||||
[in] DWORD cbUnit,
|
||||
[ out, size_is(cbUnit)] BYTE* wszUnit,
|
||||
[in] DWORD cbCondition,
|
||||
[out, size_is(cbCondition)] BYTE* wszCondition,
|
||||
[in] DWORD cbImage,
|
||||
[out, size_is(cbImage)] BYTE* pImage
|
||||
);
|
||||
|
||||
HRESULT UnlockData();
|
||||
|
||||
HRESULT SetNotifyWindow([in] HWND hWndNotify);
|
||||
|
||||
HRESULT IsInitialized([out] BOOL* bIsInitialized);
|
||||
|
||||
HRESULT GetTitle([in] DWORD cbTitle, [out, size_is(cbTitle)] BYTE* wszTitle, [in] DWORD dwType);
|
||||
|
||||
HRESULT SetTemperatureUnit([in] LONG64 dwTemperatureUnit);
|
||||
|
||||
HRESULT SetTerm([in] DWORD cbTerm, [in, size_is(cbTerm)] BYTE* wszTerm);
|
||||
|
||||
HRESULT SetLanguage([in] DWORD cblanguage, [in, size_is(cblanguage)] BYTE* wszLanguage);
|
||||
|
||||
HRESULT SetUpdateSchedule([in] LONG64 dwUpdateSchedule);
|
||||
|
||||
HRESULT SetIconSize([in] LONG64 cbx, [in] LONG64 cby);
|
||||
|
||||
HRESULT GetIconSize([out] LONG64* cbx, [out] LONG64* cby);
|
||||
};
|
6
ep_weather_host_stub/ep_weather_host_stub.def
Normal file
6
ep_weather_host_stub/ep_weather_host_stub.def
Normal file
@ -0,0 +1,6 @@
|
||||
LIBRARY ep_weather_host_stub.dll
|
||||
DESCRIPTION 'ExplorerPatcher Weather Stub DLL'
|
||||
EXPORTS DllGetClassObject @1 PRIVATE
|
||||
DllCanUnloadNow @2 PRIVATE
|
||||
DllRegisterServer @4 PRIVATE
|
||||
DllUnregisterServer @5 PRIVATE
|
180
ep_weather_host_stub/ep_weather_host_stub.vcxproj
Normal file
180
ep_weather_host_stub/ep_weather_host_stub.vcxproj
Normal file
@ -0,0 +1,180 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{af02abac-eaeb-471c-9957-73d430b8b4de}</ProjectGuid>
|
||||
<RootNamespace>epweatherhoststub</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)\build\$(Configuration)</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)\build\$(Configuration)</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)\build\$(Configuration)</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)\build\$(Configuration)</OutDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>RpcRT4.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>ep_weather_host_stub.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>RpcRT4.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>ep_weather_host_stub.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>RpcRT4.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>ep_weather_host_stub.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>RpcRT4.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>ep_weather_host_stub.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<Midl Include="ep_weather_host.idl" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dlldata.c">
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">REGISTER_PROXY_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">REGISTER_PROXY_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">REGISTER_PROXY_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">REGISTER_PROXY_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ep_weather_host_i.c" />
|
||||
<ClCompile Include="ep_weather_host_p.c">
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">REGISTER_PROXY_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">REGISTER_PROXY_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">REGISTER_PROXY_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">REGISTER_PROXY_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="ep_weather_host_h.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="ep_weather_host_stub.def" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
43
ep_weather_host_stub/ep_weather_host_stub.vcxproj.filters
Normal file
43
ep_weather_host_stub/ep_weather_host_stub.vcxproj.filters
Normal file
@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Midl Include="ep_weather_host.idl">
|
||||
<Filter>Source Files</Filter>
|
||||
</Midl>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dlldata.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ep_weather_host_i.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ep_weather_host_p.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="ep_weather_host_h.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="ep_weather_host_stub.def">
|
||||
<Filter>Source Files</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
2
libs/sws
2
libs/sws
@ -1 +1 @@
|
||||
Subproject commit ebbdacbcabd8e0a50c470f07ccf3796d01f7324a
|
||||
Subproject commit a3e51eb335f2421d137cc9bb89ec10ca54103dd1
|
@ -1,7 +1,7 @@
|
||||
#define VER_MAJOR 22000
|
||||
#define VER_MINOR 469
|
||||
#define VER_BUILD_HI 41
|
||||
#define VER_BUILD_LO 16
|
||||
#define VER_BUILD_HI 42
|
||||
#define VER_BUILD_LO 0
|
||||
#define VER_FLAGS VS_FF_PRERELEASE
|
||||
|
||||
|
||||
@ -12,5 +12,5 @@
|
||||
#define VER_STR(arg) #arg
|
||||
|
||||
// The String form of the version numbers
|
||||
#define VER_FILE_STRING VALUE "FileVersion", "22000.469.41.16"
|
||||
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.469.41.16"
|
||||
#define VER_FILE_STRING VALUE "FileVersion", "22000.469.42.0"
|
||||
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.469.42.0"
|
||||
|
Loading…
Reference in New Issue
Block a user