419 lines
11 KiB
C
419 lines
11 KiB
C
|
/*******************************************************************************
|
||
|
*
|
||
|
* (C) COPYRIGHT MICROSOFT CORP., 1993-1994
|
||
|
*
|
||
|
* TITLE: REGCDHK.C
|
||
|
*
|
||
|
* VERSION: 4.0
|
||
|
*
|
||
|
* AUTHOR: Tracy Sharpe
|
||
|
*
|
||
|
* DATE: 21 Nov 1993
|
||
|
*
|
||
|
* Common dialog box hook functions for the Registry Editor.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
#include "pch.h"
|
||
|
#include "regedit.h"
|
||
|
#include "regkey.h"
|
||
|
#include "regcdhk.h"
|
||
|
#include "regresid.h"
|
||
|
#include "reghelp.h"
|
||
|
|
||
|
// Buffer to store the starting path for a registry export or print operation.
|
||
|
TCHAR g_SelectedPath[SIZE_SELECTED_PATH];
|
||
|
|
||
|
// TRUE if registry operation should be applied to the entire registry or to
|
||
|
// only start at g_SelectedPath.
|
||
|
BOOL g_fRangeAll;
|
||
|
|
||
|
// Contains the resource identifier for the dialog that is currently being
|
||
|
// used. Assumes that there is only one instance of a hook dialog at a time.
|
||
|
UINT g_RegCommDlgDialogTemplate;
|
||
|
|
||
|
const DWORD s_RegCommDlgExportHelpIDs[] = {
|
||
|
stc32, NO_HELP,
|
||
|
IDC_EXPORTRANGE, IDH_REGEDIT_EXPORT,
|
||
|
IDC_RANGEALL, IDH_REGEDIT_EXPORT,
|
||
|
IDC_RANGESELECTEDPATH, IDH_REGEDIT_EXPORT,
|
||
|
IDC_SELECTEDPATH, IDH_REGEDIT_EXPORT,
|
||
|
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
const DWORD s_RegCommDlgPrintHelpIDs[] = {
|
||
|
IDC_EXPORTRANGE, IDH_REGEDIT_PRINTRANGE,
|
||
|
IDC_RANGEALL, IDH_REGEDIT_PRINTRANGE,
|
||
|
IDC_RANGESELECTEDPATH, IDH_REGEDIT_PRINTRANGE,
|
||
|
IDC_SELECTEDPATH, IDH_REGEDIT_PRINTRANGE,
|
||
|
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
BOOL
|
||
|
PASCAL
|
||
|
RegCommDlg_OnInitDialog(
|
||
|
HWND hWnd,
|
||
|
HWND hFocusWnd,
|
||
|
LPARAM lParam
|
||
|
);
|
||
|
|
||
|
LRESULT
|
||
|
PASCAL
|
||
|
RegCommDlg_OnNotify(
|
||
|
HWND hWnd,
|
||
|
int DlgItem,
|
||
|
LPNMHDR lpNMHdr
|
||
|
);
|
||
|
|
||
|
UINT_PTR
|
||
|
PASCAL
|
||
|
RegCommDlg_OnCommand(
|
||
|
HWND hWnd,
|
||
|
int DlgItem,
|
||
|
UINT NotificationCode
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
PASCAL
|
||
|
RegCommDlg_ValidateSelectedPath(
|
||
|
HWND hWnd,
|
||
|
BOOL fIsFileDialog
|
||
|
);
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* RegCommDlgHookProc
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
* Callback procedure for the RegCommDlg common dialog box.
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* hWnd, handle of RegCommDlg window.
|
||
|
* Message,
|
||
|
* wParam,
|
||
|
* lParam,
|
||
|
* (returns),
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
UINT_PTR
|
||
|
CALLBACK
|
||
|
RegCommDlgHookProc(
|
||
|
HWND hWnd,
|
||
|
UINT Message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
|
||
|
int DlgItem;
|
||
|
const DWORD FAR* lpHelpIDs;
|
||
|
|
||
|
switch (Message) {
|
||
|
|
||
|
HANDLE_MSG(hWnd, WM_INITDIALOG, RegCommDlg_OnInitDialog);
|
||
|
|
||
|
case WM_NOTIFY:
|
||
|
SetDlgMsgResult(hWnd, WM_NOTIFY, HANDLE_WM_NOTIFY(hWnd, wParam,
|
||
|
lParam, RegCommDlg_OnNotify));
|
||
|
return TRUE;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
return RegCommDlg_OnCommand(hWnd, GET_WM_COMMAND_ID(wParam, lParam),
|
||
|
GET_WM_COMMAND_CMD(wParam, lParam));
|
||
|
|
||
|
case WM_HELP:
|
||
|
//
|
||
|
// We only want to intercept help messages for controls that we are
|
||
|
// responsible for.
|
||
|
//
|
||
|
|
||
|
DlgItem = GetDlgCtrlID(((LPHELPINFO) lParam)-> hItemHandle);
|
||
|
|
||
|
if (DlgItem < IDC_FIRSTREGCOMMDLGID || DlgItem >
|
||
|
IDC_LASTREGCOMMDLGID)
|
||
|
break;
|
||
|
|
||
|
lpHelpIDs = (g_RegCommDlgDialogTemplate == IDD_REGEXPORT) ?
|
||
|
s_RegCommDlgExportHelpIDs : s_RegCommDlgPrintHelpIDs;
|
||
|
|
||
|
WinHelp(((LPHELPINFO) lParam)-> hItemHandle, g_pHelpFileName,
|
||
|
HELP_WM_HELP, (ULONG_PTR) lpHelpIDs);
|
||
|
return TRUE;
|
||
|
|
||
|
case WM_CONTEXTMENU:
|
||
|
//
|
||
|
// We only want to intercept help messages for controls that we are
|
||
|
// responsible for.
|
||
|
//
|
||
|
|
||
|
DlgItem = GetDlgCtrlID((HWND) wParam);
|
||
|
|
||
|
if (g_RegCommDlgDialogTemplate == IDD_REGEXPORT)
|
||
|
lpHelpIDs = s_RegCommDlgExportHelpIDs;
|
||
|
|
||
|
else {
|
||
|
|
||
|
if (DlgItem < IDC_FIRSTREGCOMMDLGID || DlgItem >
|
||
|
IDC_LASTREGCOMMDLGID)
|
||
|
break;
|
||
|
|
||
|
lpHelpIDs = s_RegCommDlgPrintHelpIDs;
|
||
|
|
||
|
}
|
||
|
|
||
|
WinHelp((HWND) wParam, g_pHelpFileName, HELP_CONTEXTMENU,
|
||
|
(ULONG_PTR) lpHelpIDs);
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* RegCommDlg_OnInitDialog
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
* Initializes the RegCommDlg dialog box.
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* hWnd, handle of RegCommDlg window.
|
||
|
* hFocusWnd, handle of control to receive the default keyboard focus.
|
||
|
* lParam, additional initialization data passed by dialog creation function.
|
||
|
* (returns), TRUE to set focus to hFocusWnd, else FALSE to prevent a
|
||
|
* keyboard focus from being set.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
BOOL
|
||
|
PASCAL
|
||
|
RegCommDlg_OnInitDialog(
|
||
|
HWND hWnd,
|
||
|
HWND hFocusWnd,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
|
||
|
HWND hKeyTreeWnd;
|
||
|
HTREEITEM hSelectedTreeItem;
|
||
|
int DlgItem;
|
||
|
|
||
|
g_RegEditData.uExportFormat = FILE_TYPE_REGEDIT5;
|
||
|
|
||
|
hKeyTreeWnd = g_RegEditData.hKeyTreeWnd;
|
||
|
hSelectedTreeItem = TreeView_GetSelection(hKeyTreeWnd);
|
||
|
|
||
|
KeyTree_BuildKeyPath(hKeyTreeWnd, hSelectedTreeItem, g_SelectedPath,
|
||
|
BKP_TOSYMBOLICROOT);
|
||
|
SetDlgItemText(hWnd, IDC_SELECTEDPATH, g_SelectedPath);
|
||
|
|
||
|
DlgItem = (TreeView_GetParent(hKeyTreeWnd, hSelectedTreeItem) == NULL) ?
|
||
|
IDC_RANGEALL : IDC_RANGESELECTEDPATH;
|
||
|
CheckRadioButton(hWnd, IDC_RANGEALL, IDC_RANGESELECTEDPATH, DlgItem);
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
UNREFERENCED_PARAMETER(hFocusWnd);
|
||
|
UNREFERENCED_PARAMETER(lParam);
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* RegCommDlg_OnNotify
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* hWnd, handle of RegCommDlg window.
|
||
|
* DlgItem, identifier of control.
|
||
|
* lpNMHdr, control notification data.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
LRESULT
|
||
|
PASCAL
|
||
|
RegCommDlg_OnNotify(
|
||
|
HWND hWnd,
|
||
|
int DlgItem,
|
||
|
LPNMHDR lpNMHdr
|
||
|
)
|
||
|
{
|
||
|
|
||
|
HWND hControlWnd;
|
||
|
RECT DialogRect;
|
||
|
RECT ControlRect;
|
||
|
int dxChange;
|
||
|
LPOFNOTIFY lpon;
|
||
|
|
||
|
switch (lpNMHdr-> code) {
|
||
|
|
||
|
case CDN_INITDONE:
|
||
|
GetWindowRect(hWnd, &DialogRect);
|
||
|
// Use window coordinates because it works for mirrored
|
||
|
// and non mirrored windows.
|
||
|
MapWindowPoints(NULL, hWnd, (LPPOINT)&DialogRect, 2);
|
||
|
|
||
|
hControlWnd = GetDlgItem(hWnd, IDC_EXPORTRANGE);
|
||
|
GetWindowRect(hControlWnd, &ControlRect);
|
||
|
MapWindowPoints(NULL, hWnd, (LPPOINT)&ControlRect, 2);
|
||
|
|
||
|
dxChange = DialogRect.right - ControlRect.right -
|
||
|
(ControlRect.left - DialogRect.left);
|
||
|
|
||
|
SetWindowPos(hControlWnd, NULL, 0, 0, ControlRect.right -
|
||
|
ControlRect.left + dxChange, ControlRect.bottom -
|
||
|
ControlRect.top, SWP_NOMOVE | SWP_NOZORDER);
|
||
|
|
||
|
hControlWnd = GetDlgItem(hWnd, IDC_SELECTEDPATH);
|
||
|
GetWindowRect(hControlWnd, &ControlRect);
|
||
|
MapWindowPoints(NULL, hWnd, (LPPOINT)&ControlRect, 2);
|
||
|
|
||
|
SetWindowPos(hControlWnd, NULL, 0, 0, ControlRect.right -
|
||
|
ControlRect.left + dxChange, ControlRect.bottom -
|
||
|
ControlRect.top, SWP_NOMOVE | SWP_NOZORDER);
|
||
|
|
||
|
break;
|
||
|
|
||
|
case CDN_TYPECHANGE:
|
||
|
// lpon->lpOFN->nFilterIndex corresponds to the format types in
|
||
|
// regdef.h
|
||
|
lpon = (LPOFNOTIFY) lpNMHdr;
|
||
|
g_RegEditData.uExportFormat = lpon->lpOFN->nFilterIndex;
|
||
|
break;
|
||
|
|
||
|
case CDN_FILEOK:
|
||
|
return ( RegCommDlg_ValidateSelectedPath(hWnd, TRUE) != FALSE );
|
||
|
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* RegCommDlg_OnCommand
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
* Handles the selection of a menu item by the user, notification messages
|
||
|
* from a child control, or translated accelerated keystrokes for the
|
||
|
* RegPrint dialog box.
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* hWnd, handle of RegCommDlg window.
|
||
|
* DlgItem, identifier of control.
|
||
|
* NotificationCode, notification code from control.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
UINT_PTR
|
||
|
PASCAL
|
||
|
RegCommDlg_OnCommand(
|
||
|
HWND hWnd,
|
||
|
int DlgItem,
|
||
|
UINT NotificationCode
|
||
|
)
|
||
|
{
|
||
|
|
||
|
switch (DlgItem) {
|
||
|
|
||
|
case IDC_RANGESELECTEDPATH:
|
||
|
SetFocus(GetDlgItem(hWnd, IDC_SELECTEDPATH));
|
||
|
break;
|
||
|
|
||
|
case IDC_SELECTEDPATH:
|
||
|
switch (NotificationCode) {
|
||
|
|
||
|
case EN_SETFOCUS:
|
||
|
SendDlgItemMessage(hWnd, IDC_SELECTEDPATH, EM_SETSEL,
|
||
|
0, -1);
|
||
|
break;
|
||
|
|
||
|
case EN_CHANGE:
|
||
|
CheckRadioButton(hWnd, IDC_RANGEALL, IDC_RANGESELECTEDPATH,
|
||
|
IDC_RANGESELECTEDPATH);
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDOK:
|
||
|
return ( RegCommDlg_ValidateSelectedPath(hWnd, FALSE) != FALSE );
|
||
|
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* RegCommDlg_ValidateSelectedPath
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* hWnd, handle of RegCommDlg window.
|
||
|
* (returns), TRUE if the registry selected path is invalid, else FALSE.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
BOOL
|
||
|
PASCAL
|
||
|
RegCommDlg_ValidateSelectedPath(
|
||
|
HWND hWnd,
|
||
|
BOOL fIsFileDialog
|
||
|
)
|
||
|
{
|
||
|
|
||
|
HKEY hKey;
|
||
|
HWND hTitleWnd;
|
||
|
TCHAR Title[256];
|
||
|
|
||
|
if (!(g_fRangeAll = IsDlgButtonChecked(hWnd, IDC_RANGEALL))) {
|
||
|
|
||
|
GetDlgItemText(hWnd, IDC_SELECTEDPATH, g_SelectedPath,
|
||
|
sizeof(g_SelectedPath)/sizeof(TCHAR));
|
||
|
|
||
|
if (g_SelectedPath[0] == '\0')
|
||
|
g_fRangeAll = TRUE;
|
||
|
|
||
|
else
|
||
|
{
|
||
|
HTREEITEM hSelectedTreeItem = TreeView_GetSelection(g_RegEditData.hKeyTreeWnd);
|
||
|
if (EditRegistryKey(RegEdit_GetComputerItem(hSelectedTreeItem), &hKey, g_SelectedPath, ERK_OPEN) !=
|
||
|
ERROR_SUCCESS)
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// Determine the "real" parent of this dialog and get the
|
||
|
// message box title from that window. Our HWND may really
|
||
|
// be a subdialog if we're a file dialog.
|
||
|
//
|
||
|
|
||
|
hTitleWnd = fIsFileDialog ? GetParent(hWnd) : hWnd;
|
||
|
GetWindowText(hTitleWnd, Title, sizeof(Title)/sizeof(TCHAR));
|
||
|
InternalMessageBox(g_hInstance, hTitleWnd,
|
||
|
MAKEINTRESOURCE(IDS_ERRINVALIDREGPATH), Title,
|
||
|
MB_ICONERROR | MB_OK);
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
|
||
|
}
|