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

📄 adddelsoft.cpp

📁 visual c++ 实例编程
💻 CPP
字号:
// AdddelSoft.cpp :  添加/删除程序页
//侠客系统修改器 1.0b


#include "stdafx.h"
#include "WinSet.h"
#include "AdddelSoft.h"
#include "RegEdit.h"
#include "UninstallCom.h"
#include "WinSetDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAdddelSoft property page

IMPLEMENT_DYNCREATE(CAdddelSoft, CPropertyPage)

CAdddelSoft::CAdddelSoft() : CPropertyPage(CAdddelSoft::IDD)
{
	m_psp.dwFlags &= ~(PSP_HASHELP);
	Modify=FALSE;
	//m_psp.dwFlags |=PSP_USEHICON ;
	//m_psp.hIcon=AfxGetApp()->LoadIcon(IDI_ADDDEL);

	//{{AFX_DATA_INIT(CAdddelSoft)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

CAdddelSoft::~CAdddelSoft()
{
}

void CAdddelSoft::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAdddelSoft)
	DDX_Control(pDX, IDC_TRASHICO, m_cTrashIco);
	DDX_Control(pDX, IDC_UNINSTALLLIST, m_cUninstall);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAdddelSoft, CPropertyPage)
	//{{AFX_MSG_MAP(CAdddelSoft)
	ON_LBN_DBLCLK(IDC_UNINSTALLLIST, OnDblclkUninstalllist)
	ON_BN_CLICKED(IDC_ADDITEM, OnAdditem)
	ON_BN_CLICKED(IDC_DELITEM, OnDelitem)
	ON_BN_CLICKED(IDC_EXECUTE, OnExecute)
	ON_WM_CTLCOLOR()
	ON_WM_LBUTTONDBLCLK()
	ON_BN_CLICKED(IDC_EDITITEM, OnDblclkUninstalllist)
	ON_WM_MOUSEMOVE()
	ON_WM_SETCURSOR()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAdddelSoft message handlers

BOOL CAdddelSoft::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	RegEdit Reg;
	char String[256];
	int i;

	Num=0;
	Reg.RootKey=HKEY_LOCAL_MACHINE;
	if (Reg.OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"))
	{
		RegEdit UnReg;
		UnReg.RootKey=HKEY_LOCAL_MACHINE;
		i=Reg.FirstEnumKey(String);
		while (i)
		{
			CString StrKey="Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\";
			StrKey+=String;
			
			if (UnReg.OpenKey(StrKey))
			{
				CString SoftName;
				if (UnReg.ReadString("DisplayName",SoftName))
				{
					UnMsg Msg;
					
					Msg.StrKey=String;
					
					Msg.DisplayName=SoftName;
					Msg.Command="";
					int Index=m_cUninstall.AddString(Msg.DisplayName);
					m_cUninstall.SetItemData(Index,(DWORD)Num++);
					if (UnReg.ReadString("UninstallString",SoftName))
						Msg.Command=SoftName;
					Msg.Exist=1;
					UnmsgArray.Add(Msg);			  
				}			
								
			} 
			i=Reg.NextEnumKey(String);
		}
		UnReg.CloseKey();
	}	 	
	m_cUninstall.SetCurSel(0);
	if (m_cUninstall.GetCount()<1)
		m_cTrashIco.SetIcon(::LoadIcon( AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_TRASHEMPTY)));
	else
		m_cTrashIco.SetIcon(::LoadIcon( AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_TRASHFULL)));
	((CWinSetApp*)AfxGetApp())->SetListboxWidth(m_cUninstall);
	return TRUE;  
}

//双击或按编辑钮编辑项
void CAdddelSoft::OnDblclkUninstalllist() 
{
	CUninstallCom UnDlg;

	int i=m_cUninstall.GetCurSel();
	if (i==LB_ERR)
		return;
	int Index=m_cUninstall.GetItemData(i);
	UnDlg.m_sCommand=UnmsgArray[Index].Command;
	UnDlg.m_sDispName=UnmsgArray[Index].DisplayName;
	int nRes=UnDlg.DoModal();
	if (nRes==IDOK)
	{	
		if (UnDlg.m_sCommand!=UnmsgArray[Index].Command || UnDlg.m_sDispName!=UnmsgArray[Index].DisplayName)
		{
			OnChange();
			UnmsgArray[Index].Command=UnDlg.m_sCommand;
			UnmsgArray[Index].DisplayName=UnDlg.m_sDispName;
			m_cUninstall.DeleteString(i);
			i=m_cUninstall.AddString(UnmsgArray[Index].DisplayName);
			m_cUninstall.SetItemData(i,(DWORD)Index);
			
			((CWinSetApp*)AfxGetApp())->SetListboxWidth(m_cUninstall);
		}
	}	
}

//增加卸载项
void CAdddelSoft::OnAdditem() 
{
	CUninstallCom UnDlg;
	int nRes=UnDlg.DoModal();
	static AddNum=0;
	if (nRes==IDOK)
	{
		UnMsg Msg;
		Msg.StrKey.Empty();
		Msg.Command=UnDlg.m_sCommand;
		Msg.DisplayName=UnDlg.m_sDispName;
		Msg.Exist=1;
		int Index=m_cUninstall.AddString(Msg.DisplayName);
		m_cUninstall.SetItemData(Index,(DWORD)Num++);
		m_cUninstall.SetCurSel(Index);
		UnmsgArray.Add(Msg);
		OnChange();
		((CWinSetApp*)AfxGetApp())->SetListboxWidth(m_cUninstall);
	}		
}

//删除卸载项
void CAdddelSoft::OnDelitem() 
{
	CString Title,String;
	int i=m_cUninstall.GetCurSel();
	if (i==LB_ERR)
		return;
	m_cUninstall.GetText(i,Title);
	String.Format("是否删除“ %s ”卸载软件项 ?",Title);
	Title.LoadString(IDS_APPCAPTION);
	if (MessageBox(String,Title,MB_YESNO|MB_ICONQUESTION)==IDYES)
	{
		RemoveItem(i);
	}
}

void CAdddelSoft::OnOK() 
{
	if (Modify)
	{
		RegEdit Reg;
		int Index;
		CString BaseKey="Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\";
		Reg.RootKey=HKEY_LOCAL_MACHINE;
		CWinSetApp *pApp=(CWinSetApp*)AfxGetApp();
		for (int i=0;i<m_cUninstall.GetCount();i++)
		{
			CString StrKey;
			
			Index=m_cUninstall.GetItemData(i);
			StrKey=BaseKey+UnmsgArray[Index].StrKey;
			//是新项,随机产生一键名
			if (UnmsgArray[Index].StrKey.IsEmpty())
			{
				int num=0;
				StrKey=BaseKey+pApp->NumToString(num);
				while (Reg.OpenKey(StrKey))
				{
					num++;
					StrKey=BaseKey+pApp->NumToString(num);
				}
				UnmsgArray[Index].StrKey=pApp->NumToString(num);
				Reg.OpenKey(BaseKey);
				Reg.CreateKey(pApp->NumToString(num));
				Reg.WriteString("DisplayName",UnmsgArray[Index].DisplayName);
				Reg.WriteString("UninstallString",UnmsgArray[Index].Command);
			}
			else if (Reg.OpenKey(StrKey))
			{
				Reg.WriteString("DisplayName",UnmsgArray[Index].DisplayName);
				Reg.WriteString("UninstallString",UnmsgArray[Index].Command);
			}
			UnmsgArray[Index].Exist=0;
		}
		Reg.OpenKey(BaseKey);
		for (i=0;i<UnmsgArray.GetSize();i++)
		{
			if ( UnmsgArray[i].Exist )
			{
				if ( !UnmsgArray[i].StrKey.IsEmpty() ) 
					Reg.DeleteKey(UnmsgArray[i].StrKey);
			}
			else
				UnmsgArray[i].Exist=1;
		}
	}
	CPropertyPage::OnOK();
}


void CAdddelSoft::OnChange()
{
	SetModified(TRUE);	
	Modify=TRUE;
}

//执行反安装程序
void CAdddelSoft::OnExecute() 
{
	int i=m_cUninstall.GetCurSel();
	if (i==LB_ERR)
		return;
	int Index=m_cUninstall.GetItemData(i);
	

	STARTUPINFO StartInfo;
	memset((void*)&StartInfo,0,sizeof(StartInfo));
	StartInfo.cb=sizeof(StartInfo);
	PROCESS_INFORMATION ProInfo;
	if (!::CreateProcess(NULL,UnmsgArray[Index].Command.GetBuffer(UnmsgArray[Index].Command.GetLength()),NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS,NULL,NULL,&StartInfo,&ProInfo))
	{
		CString String,Prompt;

		m_cUninstall.GetText(i,String);
		Prompt.Format("执行“ %s ”卸载程序时发生错误,是否将该项删除?",String);
		String.LoadString(IDS_APPCAPTION);
		if (MessageBox(Prompt,String,MB_YESNO|MB_ICONQUESTION)==IDYES)
		{
			RemoveItem(i);
		}
	}
	UnmsgArray[Index].Command.ReleaseBuffer();
}

//从列表框中删除一项
void CAdddelSoft::RemoveItem(int Index)
{
		m_cUninstall.DeleteString(Index);
		if (m_cUninstall.SetCurSel(Index)==LB_ERR)
			m_cUninstall.SetCurSel(0);
		OnChange();
		((CWinSetApp*)AfxGetApp())->SetListboxWidth(m_cUninstall);
		if (m_cUninstall.GetCount()<1)
			m_cTrashIco.SetIcon(::LoadIcon( AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_TRASHEMPTY)));
		else
			m_cTrashIco.SetIcon(::LoadIcon( AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_TRASHFULL)));

}

//设置颜色
HBRUSH CAdddelSoft::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
	
/*1	int	FrmIDs[]={IDC_ADDDELPROMPT};
	for (int i=0;i<sizeof(FrmIDs)/sizeof(int);i++)
	{
	 if (*GetDlgItem(FrmIDs[i])==*(pWnd))
	 {
		pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHT));
		break;
	 }
	}
	*/
	return hbr;
}

void CAdddelSoft::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	//显示隐藏状态条
	((CWinSetDlg*)AfxGetMainWnd())->ShowStatusBar();
	
	CPropertyPage::OnLButtonDblClk(nFlags, point);
}

void CAdddelSoft::OnMouseMove(UINT nFlags, CPoint point) 
{

	CString Str;
	Str.LoadString(IDS_READY);
	((CWinSetDlg*)AfxGetMainWnd())->SetStatusText(Str);
	
	CPropertyPage::OnMouseMove(nFlags, point);
}

BOOL CAdddelSoft::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	int IDs[]={    IDC_UNINSTALLLIST,IDC_EXECUTE,  IDC_ADDITEM,  IDC_DELITEM  ,IDC_EDITITEM};
	UINT StrIDs[]={IDS_UNINSTALLLIST,IDS_EXECUTEUN,IDS_ADDUNITEM,IDS_DELUNITEM,IDS_EDITUNITEM};
	
	CRect rc;
	CString Str;
	bool Prompt=FALSE;
	for (int i=0;i<sizeof(IDs)/sizeof(int);i++)
	{
		if (*GetDlgItem(IDs[i])==*pWnd)
		{
			Str.LoadString(StrIDs[i]);
			((CWinSetDlg*)AfxGetMainWnd())->SetStatusText(Str);
			Prompt=TRUE;
			break;
		}
	}
	
	return CPropertyPage::OnSetCursor(pWnd, nHitTest, message);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -