📄 regview.cpp
字号:
//////////////////////////////////////////////////////////////////////////
// 文 件 名:RegView.cpp
// Copyright (c) 2007 实达终端部
// 运行环境:WCE
// 创 建 人:XZP
// 日 期:2007.9.6
// 描 述:Windows CE环境下的注册表查看器
// 版 本:
// 额外信息:
//////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <windows.h>
#include <Winuser.h>
#include <commdlg.h>
#include <Commctrl.h>
#include "resource.h"
#include <Shellapi.h>
#include "Pwinreg.h"
//////////////////////////////////////////////////////////////////////////
// 全局变量
//
const TCHAR szAppName[] = _T("RegView");
HINSTANCE hInst;
int nDivPct = 40; // Divider setting between windows
int g_nItem = -1; // 鼠标选中的行号
BOOL g_bSortFlag = 0; // 用于标志排序,0 - 升序;1 - 降序
HKEY g_hRoot = NULL; // 存储当前被枚举键值的子键的根键句柄
TCHAR g_szKey[256] = {0}; // 存储当前被枚举键值的子键的完整路径
NOTIFYICONDATA nid = {0}; // 托盘图标
//////////////////////////////////////////////////////////////////////////
// 函数声明
//
// 窗口过程函数
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ModifyDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ReNameDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
// 对话框过程函数
BOOL CALLBACK AboutDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
// 消息处理函数
LRESULT DoCreateMain(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT DoSizeMain (HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam);
LPARAM DoMainCommandExit(HWND hWnd,WORD idItem,HWND hwndCtl,WORD wNotifyCode);
LPARAM DoMainCommandAbout(HWND hWnd,WORD idItem,HWND hwndCtl,WORD wNotifyCode);
LPARAM DoMainNotifyListV(HWND hWnd,WORD idItem,HWND hwndCtl,LPNMHDR pnmh);
LPARAM DoMainNotifyTreeV(HWND hWnd,WORD idItem,HWND hwndCtl,LPNMHDR pnmh);
LRESULT DoDestroyMain(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam);
// 其它
HWND CreateTV(HWND hWnd,RECT *prect);
HWND CreateLV(HWND hWnd,RECT *prect);
int InsertLV(HWND hWnd,int nItem,LPTSTR pszName,LPTSTR pszData,LPTSTR pszType);
HTREEITEM InsertTV(HWND hWnd,HTREEITEM hParent,TCHAR *pszName,LPARAM lParam,DWORD nChildren);
int GetTree(HWND hWnd,HTREEITEM hItem,HKEY *pRoot,TCHAR *pszKey,int nMax);
int EnumValues(HWND hWnd,HKEY hRoot,LPTSTR pszKey);
DWORD EnumChildren(HWND hWnd,HTREEITEM hParent,HKEY hRoot,LPTSTR pszKey);
DWORD CountChildren(HKEY hRoot,LPTSTR pszKeyPath,LPTSTR pszKey);
int DisplayValue(HWND hWnd,int nCnt,LPTSTR pszName,PBYTE pbData,DWORD dwDSize,DWORD dwType);
int PopupMenu(HWND hWnd,WORD idMenu,int nItem,int nFlag);
int ListVAddItem(HWND hWnd,HKEY hRoot,LPTSTR szKey,DWORD dwType);
int ListVDeleteItem(HWND hWnd,HKEY hRoot,LPTSTR szKey);
int ListVReName(HWND hWnd,HKEY hRoot,LPTSTR pszKey,LPTSTR pszName);
int ListVModifyValue(HWND hWnd,HKEY hRoot,LPTSTR pszKey,LPTSTR pszName,LPBYTE pbData);
int ListVNewItem(HWND hWnd,HKEY hRoot,LPTSTR pszKey,HTREEITEM hParent);
int StrToBin(TCHAR* inWord, BYTE* OutBin, int source_len);
BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize);
int LisTvHitTest(void);
void TreeVPopupMenu(void);
int TreeVDeleteItem(HWND hwndCtl);
int TreeVReNameItem1(HWND hwndTV,HKEY hRoot,LPTSTR pszKey,LPTSTR pszNewName);
int RegCopy(HKEY hSourceKey,HKEY hDestinationKey,LPTSTR pszSorSubKey,LPTSTR pszDesSubKey);
int RegReName(HKEY hSourceKey,HKEY hDestinationKey,LPTSTR pszSorSubKey,LPTSTR pszDesSubKey);
//////////////////////////////////////////////////////////////////////////
// 主函数 - 入口函数
//
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
HWND hwndMain = NULL;
WNDCLASS wc;
INITCOMMONCONTROLSEX icex = {0};
MSG msg;
// Save program instance in global variable.
hInst = hInstance;
// 注册窗口类
wc.style = 0;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = szAppName;
if(RegisterClass(&wc) == 0)
{
MessageBox(NULL,_T("RegisterClass ERR"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
return 0;
}
// 装载、初始化通用控件(部分)
/*icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_BAR_CLASSES | ICC_TREEVIEW_CLASSES | ICC_LISTVIEW_CLASSES;
if(InitCommonControlsEx(&icex) == FALSE)
{
MessageBox(NULL,_T("InitCommonControlsEx ERR"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
return 0;
}*/
// 装载、初始化通用控件(全部)
InitCommonControls();
// 创建窗口
hwndMain = CreateWindow(szAppName,
_T("RegView"),
WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if(hwndMain == NULL)
{
MessageBox(NULL,_T("CreateWindow ERR"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
return 0;
}
// 更新显示窗口
ShowWindow(hwndMain,nCmdShow);
UpdateWindow(hwndMain);
// 消息循环
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
/************************************************************************
** 函数:
** 输入:
** 输出:
** 功能:重命名对话框。重命名键值名称用的对话框
** 作者:XZP
** 日期:07.9.11
** 备注:用ListView_GetItemText函数获得键值名称用于初始化对话框。
************************************************************************/
LRESULT CALLBACK ReNameDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
HWND hwndLV = NULL;
LVHITTESTINFO lvhti = {0};
TCHAR szOldName[MAX_PATH],szNewName[MAX_PATH];
POINT point = {0};
int nCount,i;
UINT mask;
switch(wMsg)
{
case WM_INITDIALOG:
// 获取要重命名的项的项的字符串
hwndLV = GetDlgItem(FindWindow(_T("RegView"),NULL),ID_LISTV);
nCount = ListView_GetItemCount(hwndLV);
// 注意要倒着删
for(i=nCount-1;i>=0;i--)
{
mask = ListView_GetItemState(hwndLV,i,LVIS_SELECTED);
if(mask == LVIS_SELECTED)
{
ListView_GetItemText(hwndLV,i,0,szOldName,sizeof(szOldName));
break;
}
}
SetDlgItemText(hWnd,IDC_OLD_NAME,szOldName);
SetDlgItemText(hWnd,IDC_NEW_NAME,szOldName);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
GetDlgItemText(hWnd,IDC_NEW_NAME,szNewName,sizeof(szNewName)/sizeof(TCHAR));
if(ListVReName(FindWindow( _T("RegView"),NULL),g_hRoot,g_szKey,szNewName))
{ // 修改失败(如因为重名)
SetFocus(GetDlgItem(hWnd,IDC_NEW_NAME));
SendMessage(GetDlgItem(hWnd,IDC_NEW_NAME),EM_SETSEL,0,-1);
return FALSE;
}
EndDialog(hWnd,0);
return TRUE;
case IDCANCEL:
EndDialog(hWnd,0);
return TRUE;
}
break;
}
return FALSE;
}
/************************************************************************
** 函数:
** 输入:
** 输出:
** 功能:编辑字符串对话框。重命名键值和修改键值数据要用的对话框
** 作者:XZP
** 日期:07.9.11
** 备注:用ListView_GetItemText函数获得键值名称和键值数据用于初始化对话框
************************************************************************/
LRESULT CALLBACK ModifyDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
HWND hwndLV = NULL;
LVHITTESTINFO lvhti = {0};
TCHAR szName[MAX_PATH],szData[1024*4];
POINT point = {0};
DWORD style = 0;
PBYTE pbData;
int i,nCount;
UINT mask;
szName[0]='\0';
szData[0]='\0';
switch(wMsg)
{
case WM_INITDIALOG:
// 获取要修改数据项的键值名称和数据
// 获取要重命名的项的项的字符串
hwndLV = GetDlgItem(FindWindow(_T("RegView"),NULL),ID_LISTV);
nCount = ListView_GetItemCount(hwndLV);
// 注意要倒着删
for(i=nCount-1;i>=0;i--)
{
mask = ListView_GetItemState(hwndLV,i,LVIS_SELECTED);
if(mask == LVIS_SELECTED)
{
ListView_GetItemText(hwndLV,i,0,szName,sizeof(szName));
ListView_GetItemText(hwndLV,i,1,szData,sizeof(szData));
break;
}
}
SetDlgItemText(hWnd,IDC_EDIT_NAME,szName);
SetDlgItemText(hWnd,IDC_EDIT_VALUE,szData);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
GetDlgItemText(hWnd,IDC_EDIT_NAME,szName,sizeof(szName)/sizeof(TCHAR));
GetDlgItemText(hWnd,IDC_EDIT_VALUE,szData,sizeof(szData)/sizeof(TCHAR));
pbData = (PBYTE)szData; // 这句话搞我半天时间,NND
ListVModifyValue(FindWindow(_T("RegView"),NULL),
g_hRoot,g_szKey,szName,pbData);
EndDialog(hWnd,0);
return TRUE;
case IDCANCEL:
EndDialog(hWnd,0);
return TRUE;
}
break;
}
return FALSE;
}
/************************************************************************
** 函数:LRESULT CALLBACK MainWndProc(HWND hWnd,
UINT wMsg,
WPARAM wParam,
LPARAM lParam)
** 输入:
** 输出:
** 功能:主框窗口过程函数
** 作者:XZP
** 日期:07.9.2
************************************************************************/
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
UINT idCtl; // idCtl、pHdr - WM_NOITFY消息用的传递参数
LPNMHDR pHdr;
WORD idItem,wNotifyCode; // idItem、wNotifyCode、hwndCtl - WM_COMMAND
HWND hwndCtl,hwndLV,hwndTV; // 消息用的传递参数
BOOL bFlag;
HKEY hKey = NULL;
int nCount = 0;
HTREEITEM hti = NULL;
switch(wMsg)
{
case WM_CREATE:
return DoCreateMain(hWnd,wMsg,wParam,lParam);
case WM_SIZE:
return DoSizeMain(hWnd,wMsg,wParam,lParam);
case WM_COMMAND:
idItem = (WORD)LOWORD(wParam);
wNotifyCode = (WORD)HIWORD(wParam);
hwndCtl = (HWND)lParam;
switch(idItem)
{
case IDM_EXIT: // 文件菜单的退出按钮
case IDM_EXIT1: // 托盘图标右键菜单的退出按钮
// 删除托盘图标
nid.cbSize = sizeof(nid);
nid.hWnd = hWnd;
nid.uID = IDI_ICON1; // 确保删除的图标是正确的
Shell_NotifyIcon(NIM_DELETE, &nid);
SendMessage(hWnd,WM_CLOSE,0,0);
PostQuitMessage(0);
return 0;
case IDM_NEW_STRING: // 新建->字符串值
return ListVAddItem(hWnd,g_hRoot,g_szKey,REG_SZ);
case IDM_NEW_MULSTR: // 新建->多字符串值
return ListVAddItem(hWnd,g_hRoot,g_szKey,REG_MULTI_SZ);
case IDM_NEW_DOWRD: // 新建->DWORD 值
return ListVAddItem(hWnd,g_hRoot,g_szKey,REG_DWORD);
case IDM_NEW_BINARY: // 新建->二进制值
return ListVAddItem(hWnd,g_hRoot,g_szKey,REG_BINARY);
case IDM_DELETE: // 右键->删除键值
return ListVDeleteItem(hWnd,g_hRoot,g_szKey);
case IDM_RENAME: // 右键->重命名键值名称
// 确保只选择1项才允许重命名
hwndLV = GetDlgItem(hWnd,ID_LISTV);
nCount = ListView_GetSelectedCount(hwndLV);
if(nCount == 1)
{
DialogBox(hInst,MAKEINTRESOURCE(IDD_RENAME),hWnd,(DLGPROC)ReNameDlgProc);
}
return 0;
case IDM_MODIFY: // 右键->修改数据
// 确保只选择1项才允许修改数据
hwndLV = GetDlgItem(hWnd,ID_LISTV);
nCount = ListView_GetSelectedCount(hwndLV);
if(nCount == 1)
{
DialogBox(hInst,MAKEINTRESOURCE(IDD_MODIFY),hWnd,(DLGPROC)ModifyDlgProc);
}
return 0;
case IDM_NEW_ITEM: // 新建项、新建->项
hti = TreeView_GetSelection(GetDlgItem(hWnd,ID_TREEV));
ListVNewItem(hWnd,g_hRoot,g_szKey,hti);
return 0;
case IDM_DELETE_ITEM: // 删除项
hwndTV = GetDlgItem(FindWindow(_T("RegView"),NULL),ID_TREEV);
TreeVDeleteItem(hwndTV);
return 0;
case IDM_RENAME_ITEM: // 重命名项
/*
hwndTV = GetDlgItem(FindWindow(_T("RegView"),NULL),ID_TREEV);
TreeVReNameItem(hwndTV,g_hRoot,g_szKey,NULL);
*/
// 编辑框使能
hwndTV = GetDlgItem(FindWindow(_T("RegView"),NULL),ID_TREEV);
hti = TreeView_GetSelection(GetDlgItem(hWnd,ID_TREEV));
TreeView_EditLabel(hwndTV,hti);
return 0;
case IDM_ABOUT: // 帮助
return DoMainCommandAbout(hWnd,idItem,hwndCtl,wNotifyCode);
default:
break;
}
break;
// 树型视图右键单击消息,而不是NM_RCLICK
case WM_CONTEXTMENU:
TreeVPopupMenu(); // 显示菜单
break;
case WM_NOTIFY:
idCtl = wParam;
pHdr = (LPNMHDR)lParam;
hwndCtl = pHdr->hwndFrom;
switch(idCtl)
{
case ID_LISTV:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -