Added string lookup tool
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7251 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
79df77fa82
commit
60ab777e21
10 changed files with 426 additions and 43 deletions
|
@ -211,7 +211,8 @@ Version History
|
||||||
2.3.6
|
2.3.6
|
||||||
- Added GUID generator tool
|
- Added GUID generator tool
|
||||||
|
|
||||||
2.3.7
|
2.4
|
||||||
|
- Added Lookup tool
|
||||||
- Use Consolas font if it exists
|
- Use Consolas font if it exists
|
||||||
|
|
||||||
Copyright Information
|
Copyright Information
|
||||||
|
|
|
@ -6,6 +6,7 @@ files = Split("""
|
||||||
utils.cpp
|
utils.cpp
|
||||||
version.cpp
|
version.cpp
|
||||||
update.cpp
|
update.cpp
|
||||||
|
lookup.cpp
|
||||||
wndspy.cpp
|
wndspy.cpp
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
@ -42,6 +43,7 @@ libs = Split("""
|
||||||
wininet
|
wininet
|
||||||
winmm
|
winmm
|
||||||
kernel32
|
kernel32
|
||||||
|
ole32
|
||||||
""")
|
""")
|
||||||
|
|
||||||
docs = Split("""
|
docs = Split("""
|
||||||
|
@ -58,7 +60,7 @@ BuildUtil(
|
||||||
res = res,
|
res = res,
|
||||||
resources = resources,
|
resources = resources,
|
||||||
entry = None,
|
entry = None,
|
||||||
defines = ['RELEASE=2.3.7'],
|
defines = ['RELEASE=2.4'],
|
||||||
docs = docs,
|
docs = docs,
|
||||||
root_util = True
|
root_util = True
|
||||||
)
|
)
|
||||||
|
|
324
Contrib/Makensisw/lookup.cpp
Normal file
324
Contrib/Makensisw/lookup.cpp
Normal file
|
@ -0,0 +1,324 @@
|
||||||
|
// Copyright (C) 2020-2021 Anders Kjersem
|
||||||
|
//
|
||||||
|
// This file is a part of NSIS.
|
||||||
|
//
|
||||||
|
// Licensed under the zlib/libpng license (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
//
|
||||||
|
// Licence details can be found in the file COPYING.
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty.
|
||||||
|
|
||||||
|
#include "makensisw.h"
|
||||||
|
#include <windows.h>
|
||||||
|
#include <windowsx.h>
|
||||||
|
#include <Shlobj.h>
|
||||||
|
#include <shlwapi.h>
|
||||||
|
#include "utils.h"
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
enum { reg_mui_string_truncate = 0x01 };
|
||||||
|
|
||||||
|
static void StrTToW(LPCTSTR Src, LPWSTR Dst, UINT cch)
|
||||||
|
{
|
||||||
|
if (sizeof(*Src) == sizeof(*Dst))
|
||||||
|
lstrcpynW(Dst, (LPCWSTR) Src, cch);
|
||||||
|
else
|
||||||
|
MultiByteToWideChar(CP_ACP, 0, (LPCSTR) Src, -1, Dst, cch);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> static LPWSTR SmartStrTToW(T*Src, LPWSTR Dst, UINT cch)
|
||||||
|
{
|
||||||
|
if (sizeof(T) == sizeof(*Dst)) return (LPWSTR) Src;
|
||||||
|
return (StrTToW(Src, Dst, cch), Dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> static int WINAPI StrBase10ToSInt(const T*str)
|
||||||
|
{
|
||||||
|
unsigned int v = 0, neg = 0, c, i = 0, base = 10;
|
||||||
|
if (str[i] == '-') ++neg, ++i;
|
||||||
|
for (; (c = str[i]) >= T('0') && c <= T('9'); ++i) c -= T('0'), v *= base, v += c;
|
||||||
|
return neg ? (int) v * -1 : v;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> static int WINAPI PathParseIconLocationFallback(T*Path)
|
||||||
|
{
|
||||||
|
int idx = 0;
|
||||||
|
SIZE_T i, comma = 0;
|
||||||
|
for (i = 0; Path[i]; ++i)
|
||||||
|
{
|
||||||
|
if (Path[i] == ',') comma = i;
|
||||||
|
if (FSPath::IsAgnosticSeparator(Path[i])) comma = 0;
|
||||||
|
}
|
||||||
|
if (comma)
|
||||||
|
{
|
||||||
|
Path[comma] = T('\0');
|
||||||
|
idx = StrBase10ToSInt(Path + comma + 1);
|
||||||
|
}
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT GetSpecialFolderPath(HWND hWnd, LPTSTR Buf, UINT csidl)
|
||||||
|
{
|
||||||
|
UINT create = csidl & CSIDL_FLAG_CREATE, succ, ec;
|
||||||
|
csidl &= ~CSIDL_FLAG_CREATE;
|
||||||
|
if (SupportsWNT4() || SupportsW95())
|
||||||
|
{
|
||||||
|
LPITEMIDLIST pidl;
|
||||||
|
HRESULT hr = SHGetSpecialFolderLocation(hWnd, csidl, &pidl);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
hr = SHGetPathFromIDList(pidl, Buf) ? S_OK : E_FAIL, CoTaskMemFree(pidl);
|
||||||
|
if (SUCCEEDED(hr) && create)
|
||||||
|
{
|
||||||
|
succ = CreateDirectory(Buf, NULL);
|
||||||
|
hr = (succ || (ec = GetLastError()) == ERROR_ALREADY_EXISTS) ? S_OK : HRESULT_FROM_WIN32(ec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
succ = SHGetSpecialFolderPath(hWnd, Buf, csidl, false);
|
||||||
|
if (!succ && create) succ = SHGetSpecialFolderPath(hWnd, Buf, csidl, create);
|
||||||
|
return succ ? S_OK : E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HICON LoadIconFromLocation(LPCTSTR Path, int Idx)
|
||||||
|
{
|
||||||
|
// web.archive.org/web/201901/https://blogs.msdn.microsoft.com/oldnewthing/20100505-00/?p=14153# -1 is special
|
||||||
|
HICON hIco = ExtractIcon(NULL, Path, Idx == -1 ? 0 : Idx);
|
||||||
|
if (!hIco && !GetLastError()) SetLastError(ERROR_NOT_FOUND);
|
||||||
|
return hIco;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> static void AppendText(HWND hEdit, const T*Str)
|
||||||
|
{
|
||||||
|
SNDMSG(hEdit, EM_SETSEL, 0, -1), SNDMSG(hEdit, EM_SETSEL, -1, -1);
|
||||||
|
if (sizeof(T) > 1)
|
||||||
|
SendMessageW(hEdit, EM_REPLACESEL, 0, (SIZE_T) Str);
|
||||||
|
else
|
||||||
|
SendMessageA(hEdit, EM_REPLACESEL, 0, (SIZE_T) Str);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int AddComboStringWithData(HWND hWnd, LPCSTR Str, SIZE_T Data)
|
||||||
|
{
|
||||||
|
int idx = (int) SendMessageA(hWnd, CB_INSERTSTRING, (INT_PTR) -1, (SIZE_T) const_cast<LPCSTR>(Str));
|
||||||
|
if (idx >= 0) SendMessage(hWnd, CB_SETITEMDATA, idx, Data);
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class I, class O> static HKEY ParseRegPath(I*In, O*&Path, O*&Name)
|
||||||
|
{
|
||||||
|
HKEY hKey = GetRegRootKey(In);
|
||||||
|
I*pp = 0, *pn = 0;
|
||||||
|
if (hKey)
|
||||||
|
{
|
||||||
|
SIZE_T i;
|
||||||
|
for (i = 0; In[i]; ++i)
|
||||||
|
if (In[i] == I('\\'))
|
||||||
|
(!pp ? pp : pn) = &In[i + 1]; // First separator after HK* or last separator
|
||||||
|
if (pn) pn[-1] = I('\0'); // Split path and name
|
||||||
|
}
|
||||||
|
return (Path = const_cast<O*>(pp), Name = const_cast<O*>(pn), hKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT (WINAPI*g_SHLIS)(LPCWSTR s, LPWSTR o, UINT cch, PVOID*ppvReserved);
|
||||||
|
HRESULT (WINAPI*g_RLMSOld)(HKEY hKey, LPCWSTR pszValue, LPWSTR pszOutBuf, DWORD cbOutBuf);
|
||||||
|
|
||||||
|
static LSTATUS WINAPI RegLoadMUIStringFallbackW(HKEY hKey, LPCWSTR Name, LPWSTR Out, DWORD cbOutBuf, LPDWORD pcbData, DWORD Flags, LPCSTR pszDirectory)
|
||||||
|
{
|
||||||
|
if ((Flags & reg_mui_string_truncate) && pcbData) return ERROR_INVALID_PARAMETER;
|
||||||
|
if (g_RLMSOld)
|
||||||
|
{
|
||||||
|
HRESULT hr = g_RLMSOld(hKey, Name, Out, cbOutBuf);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
if (pcbData) *pcbData = (StrLenT(Out) + 1) * sizeof(*Out);
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
if (pcbData) *pcbData = (cbOutBuf|1) * 2; // We have no real value to set, caller just has to loop until success
|
||||||
|
return hr; // Note: Not converting E_* here, FormatMessage knows what to do.
|
||||||
|
}
|
||||||
|
return ERROR_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum { LM_SHGLN, LM_SHLIS, LM_RLMS, LM_PPIL };
|
||||||
|
LPCSTR g_ModeLbl[] = { "Path:", "Path:", "Registry:", "Path:" };
|
||||||
|
|
||||||
|
struct DIALOGDATA {
|
||||||
|
HRESULT (WINAPI*SHGLN)(PCWSTR p, PWSTR m, UINT cch, int*rid);
|
||||||
|
LSTATUS (WINAPI*RLMS)(HKEY hKey, LPCWSTR pszValue, LPWSTR pszOutBuf, DWORD cbOutBuf, LPDWORD pcbData, DWORD Flags, LPCSTR pszDirectory);
|
||||||
|
int (WINAPI*PPIL)(LPTSTR p);
|
||||||
|
void*OrgParentDlgData;
|
||||||
|
HWND hMode, hExtra, hOutTxt, hOutIco;
|
||||||
|
|
||||||
|
DIALOGDATA() { extern void* g_ModalDlgData; OrgParentDlgData = g_ModalDlgData, g_ModalDlgData = this; }
|
||||||
|
~DIALOGDATA() { extern void* g_ModalDlgData; g_ModalDlgData = OrgParentDlgData; }
|
||||||
|
static DIALOGDATA* Get(HWND hDlg) { return (DIALOGDATA*) g_ModalDlgData; }
|
||||||
|
static inline void Set(HWND hDlg, DIALOGDATA*p) { }
|
||||||
|
};
|
||||||
|
|
||||||
|
static INT_PTR CALLBACK LookupDlgProc(HWND hDlg, UINT Msg, WPARAM WParam, LPARAM LParam)
|
||||||
|
{
|
||||||
|
DIALOGDATA*pDD = DIALOGDATA::Get(hDlg);
|
||||||
|
int idx = pDD ? (int) SendMessage(pDD->hMode, CB_GETCURSEL, 0, 0) : 0;
|
||||||
|
UINT mode = pDD ? (UINT) SendMessage(pDD->hMode, CB_GETITEMDATA, idx, 0) : 0;
|
||||||
|
HRESULT hr;
|
||||||
|
TCHAR buf[MAX_PATH + 1 + 6]; // Path + ',' + resid
|
||||||
|
|
||||||
|
switch(Msg)
|
||||||
|
{
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
DIALOGDATA::Set(hDlg, (pDD = (DIALOGDATA*) LParam));
|
||||||
|
CenterOnParent(hDlg);
|
||||||
|
pDD->hMode = GetDlgItem(hDlg, IDC_LUMODE);
|
||||||
|
pDD->hExtra = GetDlgItem(hDlg, IDC_LUEXTRATEXT);
|
||||||
|
pDD->hOutTxt = GetDlgItem(hDlg, IDC_LUOUTPUTTEXT);
|
||||||
|
pDD->hOutIco = CreateWindowEx(WS_EX_TRANSPARENT, _T("STATIC"), 0, WS_CHILD|WS_VISIBLE|SS_ICON|SS_CENTERIMAGE|SS_REALSIZECONTROL, 0, 0, 0, 0, pDD->hOutTxt, 0, 0, 0);
|
||||||
|
if (pDD->SHGLN) AddComboStringWithData(pDD->hMode, "SHGetLocalizedName", LM_SHGLN);
|
||||||
|
if (g_SHLIS) AddComboStringWithData(pDD->hMode, "SHLoadIndirectString", LM_SHLIS);
|
||||||
|
if (pDD->RLMS) AddComboStringWithData(pDD->hMode, "RegLoadMUIString", LM_RLMS);
|
||||||
|
if (pDD->PPIL) AddComboStringWithData(pDD->hMode, "PathParseIconLocation", LM_PPIL);
|
||||||
|
SNDMSG(pDD->hExtra, EM_LIMITTEXT, COUNTOF(buf), 0);
|
||||||
|
SNDMSG(pDD->hMode, CB_SETCURSEL, (SIZE_T) 0, 0), SNDMSG(hDlg, WM_COMMAND, MAKELONG(IDC_LUMODE, CBN_SELENDOK), (SIZE_T) pDD->hMode);
|
||||||
|
return TRUE;
|
||||||
|
case WM_CLOSE: close:
|
||||||
|
return EndDialog(hDlg, 0);
|
||||||
|
case WM_DESTROY:
|
||||||
|
{
|
||||||
|
HICON hOld = (HICON) SNDMSG(pDD->hOutIco, STM_SETICON, (SIZE_T) NULL, 0);
|
||||||
|
if (hOld) DestroyIcon(hOld);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_COMMAND:
|
||||||
|
switch((UINT) WParam)
|
||||||
|
{
|
||||||
|
case IDCANCEL:
|
||||||
|
goto close;
|
||||||
|
case MAKELONG(IDC_LUMODE, CBN_SELENDOK):
|
||||||
|
{
|
||||||
|
SendMessageA(GetDlgItem(hDlg, IDC_LUEXTRALABEL), WM_SETTEXT, 0, (SIZE_T) const_cast<LPCSTR>(g_ModeLbl[mode]));
|
||||||
|
LPCTSTR extra = buf;
|
||||||
|
*buf = '\0';
|
||||||
|
switch(mode)
|
||||||
|
{
|
||||||
|
case LM_SHGLN:
|
||||||
|
GetSpecialFolderPath(NULL, buf, CSIDL_COMMON_DESKTOPDIRECTORY);
|
||||||
|
break;
|
||||||
|
case LM_SHLIS:
|
||||||
|
extra = _T("@shell32,-4097");
|
||||||
|
break;
|
||||||
|
case LM_RLMS:
|
||||||
|
extra = _T("HKCR\\AudioCD\\shell\\play\\MUIVerb");
|
||||||
|
break;
|
||||||
|
case LM_PPIL:
|
||||||
|
extra = _T("%WINDIR%\\Explorer.exe,-101");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ShowWindow(pDD->hOutIco, SW_HIDE);
|
||||||
|
SetWindowText(pDD->hExtra, extra);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAKELONG(IDC_LUEXTRATEXT, EN_UPDATE):
|
||||||
|
SendMessage(pDD->hExtra, WM_GETTEXT, COUNTOF(buf), (SIZE_T) buf);
|
||||||
|
SetWindowText(pDD->hOutTxt, _T(""));
|
||||||
|
switch(mode)
|
||||||
|
{
|
||||||
|
case LM_SHGLN:
|
||||||
|
{
|
||||||
|
int resid;
|
||||||
|
WCHAR path[COUNTOF(buf)], mod[MAX_PATH], *pis;
|
||||||
|
pis = SmartStrTToW(buf, path, COUNTOF(path));
|
||||||
|
hr = pDD->SHGLN(pis, mod, COUNTOF(mod), &resid);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
AppendText(pDD->hOutTxt, mod);
|
||||||
|
AppendText(pDD->hOutTxt, (wsprintfW(path, L",%d\r\n\r\n", resid), path));
|
||||||
|
if (ExpandEnvironmentStringsW(mod, path, ARRAYSIZE(path)))
|
||||||
|
{
|
||||||
|
if (HMODULE hMod = LoadLibraryExW(path, NULL, LOAD_LIBRARY_AS_DATAFILE))
|
||||||
|
{
|
||||||
|
if (LoadStringW(hMod, resid, mod, ARRAYSIZE(mod)))
|
||||||
|
{
|
||||||
|
AppendText(pDD->hOutTxt, mod);
|
||||||
|
}
|
||||||
|
FreeLibrary(hMod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else die_hr:
|
||||||
|
{
|
||||||
|
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, hr, 0, buf, COUNTOF(buf), NULL);
|
||||||
|
AppendText(pDD->hOutTxt, (wsprintfW(path, L"%#x: ", hr), path));
|
||||||
|
AppendText(pDD->hOutTxt, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LM_SHLIS:
|
||||||
|
{
|
||||||
|
WCHAR is[COUNTOF(buf)], os[MAX_PATH], *pis;
|
||||||
|
pis = SmartStrTToW(buf, is, COUNTOF(is));
|
||||||
|
hr = g_SHLIS(pis, os, COUNTOF(os), NULL);
|
||||||
|
if (FAILED(hr)) goto die_hr;
|
||||||
|
AppendText(pDD->hOutTxt, os);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LM_RLMS:
|
||||||
|
{
|
||||||
|
UINT ec;
|
||||||
|
TCHAR *pkey, *pname;
|
||||||
|
if (HKEY hKey = ParseRegPath(buf, pkey, pname))
|
||||||
|
{
|
||||||
|
if (!(ec = RegOpenKeyForReading(hKey, pkey, &hKey)))
|
||||||
|
{
|
||||||
|
WCHAR namebuf[255+!0], outbuf[MAX_PATH], *pwn = SmartStrTToW(pname, namebuf, COUNTOF(namebuf));
|
||||||
|
ec = pDD->RLMS(hKey, pwn, outbuf, sizeof(outbuf), NULL, reg_mui_string_truncate, NULL);
|
||||||
|
if (!ec) AppendText(pDD->hOutTxt, outbuf);
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
}
|
||||||
|
if (FAILED(hr = HRESULT_FROM_WIN32(ec))) goto die_hr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LM_PPIL:
|
||||||
|
{
|
||||||
|
RECT r;
|
||||||
|
int idx = pDD->PPIL(buf);
|
||||||
|
HICON hIco = LoadIconFromLocation(buf, idx), hOld;
|
||||||
|
hr = GetLastError();
|
||||||
|
GetClientRect(pDD->hOutTxt, &r);
|
||||||
|
SetWindowPos(pDD->hOutIco, HWND_TOP, 0, 0, r.right, r.bottom, SWP_NOACTIVATE|(hIco ? SWP_SHOWWINDOW : SWP_HIDEWINDOW));
|
||||||
|
hOld = (HICON) SNDMSG(pDD->hOutIco, STM_SETICON, (SIZE_T) hIco, 0);
|
||||||
|
if (hOld) DestroyIcon(hOld);
|
||||||
|
if (!hIco) goto die_hr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT_PTR ShowLookupDialog(HWND hOwner)
|
||||||
|
{
|
||||||
|
DIALOGDATA dd;
|
||||||
|
(FARPROC&) dd.SHGLN = GetSysProcAddr("SHELL32", "SHGetLocalizedName");
|
||||||
|
(FARPROC&) g_SHLIS = GetSysProcAddr("SHLWAPI", (LPCSTR) 487);
|
||||||
|
(FARPROC&) dd.RLMS = GetSysProcAddr("ADVAPI32", "RegLoadMUIStringW"); // Note: RegLoadMUIStringA always returns ERROR_CALL_NOT_IMPLEMENTED
|
||||||
|
if (!dd.RLMS && ((FARPROC&) g_RLMSOld = GetSysProcAddr("SHLWAPI", (LPCSTR) 439))) dd.RLMS = RegLoadMUIStringFallbackW;
|
||||||
|
(FARPROC&) dd.PPIL =
|
||||||
|
#ifdef _WIN64
|
||||||
|
(FARPROC) PathParseIconLocation;
|
||||||
|
#else
|
||||||
|
GetSysProcAddr("SHLWAPI", sizeof(TCHAR) == 1 ? "PathParseIconLocationA" : "PathParseIconLocationW");
|
||||||
|
if (!dd.PPIL || (SupportsWNT4() || IsWin9598ME()))
|
||||||
|
{
|
||||||
|
(FARPROC&) dd.PPIL = GetSysProcAddr("SHELL32", (LPCSTR) 249); // PathParseIconLocationT
|
||||||
|
if (sizeof(TCHAR) == 1) (FARPROC&) dd.PPIL = (FARPROC) PathParseIconLocationFallback<CHAR>;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return DialogBoxParam(HINST_APPLICATION, MAKEINTRESOURCE(DLG_LOOKUP), hOwner, LookupDlgProc, (LPARAM) &dd);
|
||||||
|
}
|
|
@ -45,6 +45,7 @@ NFINDREPLACE g_find;
|
||||||
TCHAR g_findbuf[128];
|
TCHAR g_findbuf[128];
|
||||||
extern NTOOLBAR g_toolbar;
|
extern NTOOLBAR g_toolbar;
|
||||||
void* g_ModalDlgData;
|
void* g_ModalDlgData;
|
||||||
|
BYTE g_MiniCommand = false;
|
||||||
|
|
||||||
NSIS_ENTRYPOINT_SIMPLEGUI
|
NSIS_ENTRYPOINT_SIMPLEGUI
|
||||||
int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hOldInst,LPTSTR CmdLineParams,int ShowCmd) {
|
int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hOldInst,LPTSTR CmdLineParams,int ShowCmd) {
|
||||||
|
@ -86,12 +87,12 @@ int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hOldInst,LPTSTR CmdLineParams,int
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
ResetObjects();
|
ResetObjects();
|
||||||
|
HACCEL haccel = LoadAccelerators(g_sdata.hInstance, MAKEINTRESOURCE(IDK_ACCEL));
|
||||||
HWND hDialog = CreateDialog(g_sdata.hInstance,MAKEINTRESOURCE(DLG_MAIN),0,DialogProc);
|
HWND hDialog = CreateDialog(g_sdata.hInstance,MAKEINTRESOURCE(DLG_MAIN),0,DialogProc);
|
||||||
if (!hDialog) {
|
if (!hDialog && !g_MiniCommand) {
|
||||||
MessageBox(0,DLGERROR,ERRBOXTITLE,MB_ICONEXCLAMATION|MB_OK|MB_TASKMODAL);
|
MessageBox(0,DLGERROR,ERRBOXTITLE,MB_ICONEXCLAMATION|MB_OK|MB_TASKMODAL);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
HACCEL haccel = LoadAccelerators(g_sdata.hInstance, MAKEINTRESOURCE(IDK_ACCEL));
|
|
||||||
MSG msg;
|
MSG msg;
|
||||||
int status;
|
int status;
|
||||||
while ((status=GetMessage(&msg,0,0,0))!=0) {
|
while ((status=GetMessage(&msg,0,0,0))!=0) {
|
||||||
|
@ -146,22 +147,21 @@ static void AddScriptCmdArgs(const TCHAR *arg)
|
||||||
GlobalUnlock(g_sdata.script_cmd_args);
|
GlobalUnlock(g_sdata.script_cmd_args);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ProcessCommandLine()
|
enum { CMD_PICKCOMP = 0x0001, CMD_SPY = 0x0080, CMD_LOOKUP = 0x8000 };
|
||||||
|
static UINT ProcessCommandLine()
|
||||||
{
|
{
|
||||||
TCHAR **argv;
|
TCHAR **argv;
|
||||||
int i, j;
|
int i, j, retflags = 0;
|
||||||
int argc = SetArgv((TCHAR *)GetCommandLine(), &argv);
|
int argc = SetArgv((TCHAR *)GetCommandLine(), &argv);
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
for (i = 1; i < argc; i++)
|
for (i = 1; i < argc; i++)
|
||||||
{
|
{
|
||||||
if (!StrCmpNI(argv[i], _T("/XSetCompressor "), lstrlen(_T("/XSetCompressor "))))
|
if (!lstrcmpi(argv[i], _T("/Spy"))) retflags |= CMD_SPY;
|
||||||
|
else if (!lstrcmpi(argv[i], _T("/Lookup"))) retflags |= CMD_LOOKUP;
|
||||||
|
else if (!StrCmpNI(argv[i], _T("/XSetCompressor "), COUNTOF("/XSetCompressor ") - !0))
|
||||||
{
|
{
|
||||||
TCHAR *p = argv[i] + lstrlen(_T("/XSetCompressor "));
|
TCHAR *p = argv[i] + lstrlen(_T("/XSetCompressor ")), cchSlashFinalSpace = COUNTOF("/FINAL ") - !0;
|
||||||
if(!StrCmpNI(p,_T("/FINAL "), lstrlen(_T("/FINAL "))))
|
if (!StrCmpNI(p,_T("/FINAL "), cchSlashFinalSpace)) p += cchSlashFinalSpace;
|
||||||
{
|
|
||||||
p += lstrlen(_T("/FINAL "));
|
|
||||||
}
|
|
||||||
|
|
||||||
while (*p == _T(' ')) p++;
|
while (*p == _T(' ')) p++;
|
||||||
|
|
||||||
for (j = (int) COMPRESSOR_SCRIPT + 1; j < (int) COMPRESSOR_BEST; j++)
|
for (j = (int) COMPRESSOR_SCRIPT + 1; j < (int) COMPRESSOR_BEST; j++)
|
||||||
|
@ -174,7 +174,7 @@ static void ProcessCommandLine()
|
||||||
}
|
}
|
||||||
else if (!lstrcmpi(argv[i], _T("/ChooseCompressor")))
|
else if (!lstrcmpi(argv[i], _T("/ChooseCompressor")))
|
||||||
{
|
{
|
||||||
g_sdata.userSelectCompressor = TRUE;
|
retflags |= CMD_PICKCOMP;
|
||||||
}
|
}
|
||||||
else if (argv[i][0] == _T('-') || argv[i][0] == _T('/'))
|
else if (argv[i][0] == _T('-') || argv[i][0] == _T('/'))
|
||||||
{
|
{
|
||||||
|
@ -189,6 +189,7 @@ static void ProcessCommandLine()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MemSafeFree(argv);
|
MemSafeFree(argv);
|
||||||
|
return retflags;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD CALLBACK SaveFileStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
|
DWORD CALLBACK SaveFileStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
|
||||||
|
@ -261,7 +262,6 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
|
||||||
// Altered by Darren Owen (DrO) on 29/9/2003
|
// Altered by Darren Owen (DrO) on 29/9/2003
|
||||||
// Added in receiving of mouse and key events from the richedit control
|
// Added in receiving of mouse and key events from the richedit control
|
||||||
SendDlgItemMessage(hwndDlg,IDC_LOGWIN,EM_SETEVENTMASK,(WPARAM)NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS);
|
SendDlgItemMessage(hwndDlg,IDC_LOGWIN,EM_SETEVENTMASK,(WPARAM)NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS);
|
||||||
DragAcceptFiles(g_sdata.hwnd,FALSE);
|
|
||||||
g_sdata.menu = GetMenu(g_sdata.hwnd);
|
g_sdata.menu = GetMenu(g_sdata.hwnd);
|
||||||
g_sdata.fileSubmenu = FindSubMenu(g_sdata.menu, IDM_FILE);
|
g_sdata.fileSubmenu = FindSubMenu(g_sdata.menu, IDM_FILE);
|
||||||
g_sdata.editSubmenu = FindSubMenu(g_sdata.menu, IDM_EDIT);
|
g_sdata.editSubmenu = FindSubMenu(g_sdata.menu, IDM_EDIT);
|
||||||
|
@ -286,20 +286,27 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
|
||||||
}
|
}
|
||||||
HFONT hFont = CreateFontPt(hwndDlg,fontsize,FW_NORMAL,FIXED_PITCH|FF_DONTCARE,fontcharset,fontname);
|
HFONT hFont = CreateFontPt(hwndDlg,fontsize,FW_NORMAL,FIXED_PITCH|FF_DONTCARE,fontcharset,fontname);
|
||||||
SendDlgItemMessage(hwndDlg,IDC_LOGWIN,WM_SETFONT,(WPARAM)hFont,0);
|
SendDlgItemMessage(hwndDlg,IDC_LOGWIN,WM_SETFONT,(WPARAM)hFont,0);
|
||||||
RestoreWindowPos(g_sdata.hwnd);
|
|
||||||
RestoreCompressor();
|
|
||||||
SetScript(_T(""));
|
|
||||||
g_sdata.compressor = COMPRESSOR_NONE_SELECTED;
|
g_sdata.compressor = COMPRESSOR_NONE_SELECTED;
|
||||||
g_sdata.userSelectCompressor = FALSE;
|
SetScript(_T(""));
|
||||||
|
RestoreCompressor();
|
||||||
ToolBarSizeChanged(hwndDlg);
|
ToolBarSizeChanged(hwndDlg);
|
||||||
|
|
||||||
ProcessCommandLine();
|
UINT docmd = ProcessCommandLine();
|
||||||
|
if ((docmd & (CMD_SPY|CMD_LOOKUP)))
|
||||||
|
{
|
||||||
|
INT_PTR r = ((docmd & CMD_LOOKUP) ? ShowLookupDialog : ShowWndSpy)(0);
|
||||||
|
g_sdata.hwnd = NULL; // Don't save window pos
|
||||||
|
g_MiniCommand++;
|
||||||
|
return SendMessage(hwndDlg, WM_CLOSE, r, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
RestoreWindowPos(g_sdata.hwnd);
|
||||||
|
|
||||||
if(g_sdata.compressor == COMPRESSOR_NONE_SELECTED) {
|
if(g_sdata.compressor == COMPRESSOR_NONE_SELECTED) {
|
||||||
SetCompressor(g_sdata.default_compressor);
|
SetCompressor(g_sdata.default_compressor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(g_sdata.userSelectCompressor) {
|
if(docmd & CMD_PICKCOMP) {
|
||||||
if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,API_cast<DLGPROC>(CompressorProc))) {
|
if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,API_cast<DLGPROC>(CompressorProc))) {
|
||||||
EnableItems(g_sdata.hwnd);
|
EnableItems(g_sdata.hwnd);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -320,7 +327,6 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
|
||||||
}
|
}
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
{
|
{
|
||||||
DragAcceptFiles(g_sdata.hwnd, FALSE);
|
|
||||||
SaveSymbols();
|
SaveSymbols();
|
||||||
SaveMRUList();
|
SaveMRUList();
|
||||||
SaveWindowPos(g_sdata.hwnd);
|
SaveWindowPos(g_sdata.hwnd);
|
||||||
|
@ -331,10 +337,11 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
case WM_CLOSE:
|
case WM_CLOSE: tryquitapp:
|
||||||
{
|
{
|
||||||
if (!g_sdata.thread) {
|
if (!g_sdata.thread) {
|
||||||
DestroyWindow(hwndDlg);
|
DestroyWindow(hwndDlg);
|
||||||
|
PostQuitMessage((int) wParam);
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -699,11 +706,8 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
|
||||||
DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SETTINGS),g_sdata.hwnd,API_cast<DLGPROC>(SettingsProc));
|
DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SETTINGS),g_sdata.hwnd,API_cast<DLGPROC>(SettingsProc));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
case IDM_WNDSPY:
|
case IDM_WNDSPY: return ShowWndSpy(hwndDlg);
|
||||||
{
|
case IDM_LOOKUP: return ShowLookupDialog(hwndDlg);
|
||||||
extern INT_PTR ShowWndSpy(HWND hOwner);
|
|
||||||
return ShowWndSpy(g_sdata.hwnd);
|
|
||||||
}
|
|
||||||
case IDM_GUIDGEN:
|
case IDM_GUIDGEN:
|
||||||
{
|
{
|
||||||
GUID guid;
|
GUID guid;
|
||||||
|
@ -740,12 +744,8 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
|
||||||
}
|
}
|
||||||
case IDCANCEL:
|
case IDCANCEL:
|
||||||
case IDM_EXIT:
|
case IDM_EXIT:
|
||||||
{
|
wParam = 0;
|
||||||
if (!g_sdata.thread) {
|
goto tryquitapp;
|
||||||
DestroyWindow(g_sdata.hwnd);
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
case IDM_CANCEL:
|
case IDM_CANCEL:
|
||||||
{
|
{
|
||||||
SetEvent(g_sdata.sigint_event);
|
SetEvent(g_sdata.sigint_event);
|
||||||
|
|
|
@ -39,6 +39,9 @@
|
||||||
#define SupportsW95() ( FALSE && SupportsW9X() && !DpiAwarePerMonitor() )
|
#define SupportsW95() ( FALSE && SupportsW9X() && !DpiAwarePerMonitor() )
|
||||||
#define SupportsW2000() ( sizeof(void*) == 4 )
|
#define SupportsW2000() ( sizeof(void*) == 4 )
|
||||||
|
|
||||||
|
static bool IsWin9598ME() { return SupportsW9X() && (int) GetVersion() < 0; }
|
||||||
|
static bool IsWin95() { return SupportsW95() && (GetVersion() & (0x8000FFFF & ~0x0300)) == 0x80000004; }
|
||||||
|
|
||||||
// Defines
|
// Defines
|
||||||
#define NSIS_URL "https://nsis.sourceforge.io/"
|
#define NSIS_URL "https://nsis.sourceforge.io/"
|
||||||
#define NSIS_FORUM_URL "http://forums.winamp.com/forumdisplay.php?forumid=65"
|
#define NSIS_FORUM_URL "http://forums.winamp.com/forumdisplay.php?forumid=65"
|
||||||
|
@ -220,7 +223,6 @@ typedef struct NSISScriptData {
|
||||||
char *brandingv;
|
char *brandingv;
|
||||||
TCHAR **symbols;
|
TCHAR **symbols;
|
||||||
int retcode;
|
int retcode;
|
||||||
bool userSelectCompressor;
|
|
||||||
unsigned char verbosity;
|
unsigned char verbosity;
|
||||||
DWORD logLength;
|
DWORD logLength;
|
||||||
DWORD warnings;
|
DWORD warnings;
|
||||||
|
@ -265,4 +267,8 @@ typedef struct ToolTipStruct {
|
||||||
HHOOK hook;
|
HHOOK hook;
|
||||||
} NTOOLTIP;
|
} NTOOLTIP;
|
||||||
|
|
||||||
|
|
||||||
|
extern INT_PTR ShowWndSpy(HWND hOwner);
|
||||||
|
extern INT_PTR ShowLookupDialog(HWND hOwner);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#define IDB_LOGO 115
|
#define IDB_LOGO 115
|
||||||
#define DLG_SETTINGS 116
|
#define DLG_SETTINGS 116
|
||||||
#define DLG_WNDSPY 117
|
#define DLG_WNDSPY 117
|
||||||
|
#define DLG_LOOKUP 118
|
||||||
#define IDB_TOOLBAR 122
|
#define IDB_TOOLBAR 122
|
||||||
#define DLG_COMPRESSOR 124
|
#define DLG_COMPRESSOR 124
|
||||||
#define DLG_SYMBOLSET 125
|
#define DLG_SYMBOLSET 125
|
||||||
|
@ -83,6 +84,11 @@
|
||||||
#define IDC_WNDPHYSSIZE 227
|
#define IDC_WNDPHYSSIZE 227
|
||||||
#define IDC_WNDINFO 229
|
#define IDC_WNDINFO 229
|
||||||
#define IDC_WNDDPI 230
|
#define IDC_WNDDPI 230
|
||||||
|
#define IDC_LUMODE 220
|
||||||
|
#define IDC_LUEXTRALABEL 221
|
||||||
|
#define IDC_LUEXTRATEXT 222
|
||||||
|
#define IDC_LUOUTPUTTEXT 223
|
||||||
|
#define IDC_LUOUTPUTICON 224
|
||||||
|
|
||||||
#define IDM_MRU_FILE 6000
|
#define IDM_MRU_FILE 6000
|
||||||
#define IDM_CMDBASE 500
|
#define IDM_CMDBASE 500
|
||||||
|
@ -127,6 +133,7 @@
|
||||||
#define IDM_UI_SWITCHOWNEDWINDOW 538 // Alt+F6
|
#define IDM_UI_SWITCHOWNEDWINDOW 538 // Alt+F6
|
||||||
#define IDM_UI_SWITCHSECTION 539 // F6
|
#define IDM_UI_SWITCHSECTION 539 // F6
|
||||||
#define IDM_GUIDGEN 540
|
#define IDM_GUIDGEN 540
|
||||||
|
#define IDM_LOOKUP 541
|
||||||
|
|
||||||
|
|
||||||
// Next default values for new objects
|
// Next default values for new objects
|
||||||
|
@ -134,7 +141,7 @@
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 138
|
#define _APS_NEXT_RESOURCE_VALUE 138
|
||||||
#define _APS_NEXT_COMMAND_VALUE 541
|
#define _APS_NEXT_COMMAND_VALUE 542
|
||||||
#define _APS_NEXT_CONTROL_VALUE 241
|
#define _APS_NEXT_CONTROL_VALUE 241
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -111,6 +111,7 @@ BEGIN
|
||||||
MENUITEM "&Settings\tCtrl+S", IDM_SETTINGS
|
MENUITEM "&Settings\tCtrl+S", IDM_SETTINGS
|
||||||
MENUITEM "", -1, MFT_SEPARATOR
|
MENUITEM "", -1, MFT_SEPARATOR
|
||||||
MENUITEM "&Window Info", IDM_WNDSPY
|
MENUITEM "&Window Info", IDM_WNDSPY
|
||||||
|
MENUITEM "&Lookup", IDM_LOOKUP
|
||||||
MENUITEM "Generate &GUID", IDM_GUIDGEN
|
MENUITEM "Generate &GUID", IDM_GUIDGEN
|
||||||
MENUITEM "", -1, MFT_SEPARATOR
|
MENUITEM "", -1, MFT_SEPARATOR
|
||||||
MENUITEM "Clear Recent &Files List", IDM_CLEAR_MRU_LIST
|
MENUITEM "Clear Recent &Files List", IDM_CLEAR_MRU_LIST
|
||||||
|
@ -249,7 +250,7 @@ BEGIN
|
||||||
END
|
END
|
||||||
|
|
||||||
DLG_WNDSPY DIALOGEX 0, 0, 236, 130
|
DLG_WNDSPY DIALOGEX 0, 0, 236, 130
|
||||||
STYLE DS_SETFONT | DS_FIXEDSYS | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_FIXEDSYS | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTER
|
||||||
CAPTION "Window Info"
|
CAPTION "Window Info"
|
||||||
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
||||||
BEGIN
|
BEGIN
|
||||||
|
@ -275,6 +276,18 @@ BEGIN
|
||||||
CONTROL "", IDC_WNDDPI, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL , 39, 114, 190, 10
|
CONTROL "", IDC_WNDDPI, "Edit", ES_LEFT | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL , 39, 114, 190, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
|
DLG_LOOKUP DIALOGEX 0, 0, 301, 150
|
||||||
|
STYLE DS_SETFONT | DS_FIXEDSYS | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTER
|
||||||
|
CAPTION "Lookup"
|
||||||
|
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
||||||
|
BEGIN
|
||||||
|
CONTROL "Source", -1, BUTTON, BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 7, 7, 285, 65
|
||||||
|
CONTROL "", IDC_LUMODE, COMBOBOX, CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 16, 20, 268, 114
|
||||||
|
CONTROL "", IDC_LUEXTRALABEL, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 16, 38, 268, 10
|
||||||
|
CONTROL "", IDC_LUEXTRATEXT, EDIT, ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 16, 50, 268, 14
|
||||||
|
CONTROL "", IDC_LUOUTPUTTEXT, EDIT, ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 7, 80, 286, 60
|
||||||
|
END
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// DESIGNINFO
|
// DESIGNINFO
|
||||||
|
|
|
@ -60,6 +60,9 @@ HMODULE LoadSysLibrary(LPCSTR Mod)
|
||||||
return LoadLibrary(path);
|
return LoadLibrary(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DECLSPEC_NOINLINE
|
||||||
|
DECLSPEC_NOINLINE
|
||||||
|
#endif
|
||||||
FARPROC GetSysProcAddr(LPCSTR Mod, LPCSTR FuncName)
|
FARPROC GetSysProcAddr(LPCSTR Mod, LPCSTR FuncName)
|
||||||
{
|
{
|
||||||
return GetProcAddress(LoadSysLibrary(Mod), FuncName);
|
return GetProcAddress(LoadSysLibrary(Mod), FuncName);
|
||||||
|
@ -436,7 +439,7 @@ static DWORD RegReadString(HKEY hKey, LPCTSTR Name, LPTSTR Buf, DWORD cbBufSize)
|
||||||
return ec;
|
return ec;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DWORD RegOpenKeyForReading(HKEY hRoot, LPCTSTR SubKey, HKEY*pKey) {
|
DWORD RegOpenKeyForReading(HKEY hRoot, LPCTSTR SubKey, HKEY*pKey) {
|
||||||
return RegOpenKeyEx(hRoot, SubKey, 0, KEY_READ, pKey);
|
return RegOpenKeyEx(hRoot, SubKey, 0, KEY_READ, pKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -519,9 +522,9 @@ void SaveWindowPos(HWND hwnd) {
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
WINDOWPLACEMENT p;
|
WINDOWPLACEMENT p;
|
||||||
p.length = sizeof(p);
|
p.length = sizeof(p);
|
||||||
GetWindowPlacement(hwnd, &p);
|
if (!GetWindowPlacement(hwnd, &p)) p.length = 0;
|
||||||
if (CreateRegSettingsKey(hKey)) {
|
if (p.length && CreateRegSettingsKey(hKey)) {
|
||||||
RegSetValueEx(hKey, REGLOC, 0, REG_BINARY, (LPBYTE)&p, sizeof(p));
|
RegSetValueEx(hKey, REGLOC, 0, REG_BINARY, (LPBYTE)&p, p.length);
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,6 +111,29 @@ struct FSPath {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class T> UINT StrLenT(const T*s) { return sizeof(T) > 1 ? lstrlenW((WCHAR*) s) : lstrlenA((CHAR*) s) ; }
|
||||||
|
template<class T> T AsciiLoCh(T ch) { return ch >= 'A' && ch <= 'Z' ? (ch | 32) : ch; }
|
||||||
|
|
||||||
|
template<class A, class B> int AsciiCmpNI(const A*a, const B*b, SIZE_T len)
|
||||||
|
{
|
||||||
|
int cmp = 0;
|
||||||
|
for (SIZE_T i = 0;; ++i)
|
||||||
|
if (i == len || (cmp = AsciiLoCh(a[i]) - AsciiLoCh(b[i])) || !a[i])
|
||||||
|
return cmp;
|
||||||
|
}
|
||||||
|
template<class A, class B> inline bool AsciiMatchNI(const A*a, const B*b, SIZE_T c) { return !AsciiCmpNI(a, b, c); }
|
||||||
|
template<class A, class B> bool AsciiMatchPrefixI(const A*s, const B*p) { return AsciiMatchNI(s, p, StrLenT(p)); }
|
||||||
|
|
||||||
|
template<class T> HKEY GetRegRootKey(const T*Str)
|
||||||
|
{
|
||||||
|
if (AsciiMatchPrefixI(Str, "HKEY_CLASSES_ROOT") || AsciiMatchPrefixI(Str, "HKCR")) return HKEY_CLASSES_ROOT;
|
||||||
|
if (AsciiMatchPrefixI(Str, "HKEY_CURRENT_USER") || AsciiMatchPrefixI(Str, "HKCU")) return HKEY_CURRENT_USER;
|
||||||
|
if (AsciiMatchPrefixI(Str, "HKEY_LOCAL_MACHINE") || AsciiMatchPrefixI(Str, "HKLM")) return HKEY_LOCAL_MACHINE;
|
||||||
|
if (AsciiMatchPrefixI(Str, "HKEY_USERS") || AsciiMatchPrefixI(Str, "HKU")) return HKEY_USERS;
|
||||||
|
return (HKEY) NULL;
|
||||||
|
}
|
||||||
|
DWORD RegOpenKeyForReading(HKEY hRoot, LPCTSTR SubKey, HKEY*pKey);
|
||||||
|
|
||||||
bool FileExists(const TCHAR *fname);
|
bool FileExists(const TCHAR *fname);
|
||||||
bool OpenUrlInDefaultBrowser(HWND hwnd, LPCSTR Url);
|
bool OpenUrlInDefaultBrowser(HWND hwnd, LPCSTR Url);
|
||||||
|
|
||||||
|
|
|
@ -106,6 +106,7 @@ typedef struct _DIALOGDATA {
|
||||||
int DialogAwarenessContext; // Canonical DPI awareness context
|
int DialogAwarenessContext; // Canonical DPI awareness context
|
||||||
_DIALOGDATA() : hWndOutline(0) {}
|
_DIALOGDATA() : hWndOutline(0) {}
|
||||||
static struct _DIALOGDATA* Get(HWND hDlg) { return (struct _DIALOGDATA*) GetWindowLongPtr(hDlg, DWLP_USER); }
|
static struct _DIALOGDATA* Get(HWND hDlg) { return (struct _DIALOGDATA*) GetWindowLongPtr(hDlg, DWLP_USER); }
|
||||||
|
static void Set(HWND hDlg, void*pDD) { SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR) pDD); }
|
||||||
} DIALOGDATA;
|
} DIALOGDATA;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -281,7 +282,7 @@ static INT_PTR CALLBACK SpyDlgProc(HWND hDlg, UINT Msg, WPARAM WParam, LPARAM LP
|
||||||
switch(Msg)
|
switch(Msg)
|
||||||
{
|
{
|
||||||
case WM_INITDIALOG:
|
case WM_INITDIALOG:
|
||||||
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR) (pDD = (DIALOGDATA*) LParam));
|
DIALOGDATA::Set(hDlg, (pDD = (DIALOGDATA*) LParam));
|
||||||
CenterOnParent(hDlg);
|
CenterOnParent(hDlg);
|
||||||
// On >= 10FU1703 we are PMv2 and Windows scales our dialog and child controls.
|
// On >= 10FU1703 we are PMv2 and Windows scales our dialog and child controls.
|
||||||
// On >= 10FU1607 && < 10FU1703 we are System aware but try to upgrade this thread to
|
// On >= 10FU1607 && < 10FU1703 we are System aware but try to upgrade this thread to
|
||||||
|
@ -336,7 +337,10 @@ static INT_PTR CALLBACK SpyDlgProc(HWND hDlg, UINT Msg, WPARAM WParam, LPARAM LP
|
||||||
RECT r;
|
RECT r;
|
||||||
GetPhysicalWindowRect(pDD->hWndTarget, r, hDlg), PhysicalToLogical(pDD->hWndOutline, r, hDlg);
|
GetPhysicalWindowRect(pDD->hWndTarget, r, hDlg), PhysicalToLogical(pDD->hWndOutline, r, hDlg);
|
||||||
if (GetAncestor(pDD->hWndTarget, GA_ROOT) != hDlg)
|
if (GetAncestor(pDD->hWndTarget, GA_ROOT) != hDlg)
|
||||||
SetWindowPos(pDD->hWndOutline, HWND_TOPMOST, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_SHOWWINDOW|SWP_NOCOPYBITS|SWP_NOACTIVATE|SWP_NOOWNERZORDER);
|
{
|
||||||
|
SetWindowPos(pDD->hWndOutline, HWND_TOPMOST, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_HIDEWINDOW|SWP_NOCOPYBITS|SWP_NOACTIVATE|SWP_NOOWNERZORDER);
|
||||||
|
ShowWindow(pDD->hWndOutline, SW_SHOW); // To avoid a small Windows redraw bug, don't show the window until after it has the correct size
|
||||||
|
}
|
||||||
SetTimer(hDlg, TID_OUTLINE, 2 * 1000, NULL);
|
SetTimer(hDlg, TID_OUTLINE, 2 * 1000, NULL);
|
||||||
}
|
}
|
||||||
ReleaseCapture();
|
ReleaseCapture();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue