⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regview.cpp

📁 ce系统下面的一个浏览注册表的应用程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//////////////////////////////////////////////////////////////////////////
// 文 件 名: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 + -