You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
400 lines
12 KiB
400 lines
12 KiB
#if !defined(AFX_PAGESTARTUP_H__928475DA_B332_47F4_8180_5C8B79DFC203__INCLUDED_)
|
|
#define AFX_PAGESTARTUP_H__928475DA_B332_47F4_8180_5C8B79DFC203__INCLUDED_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include "PageBase.h"
|
|
#include "MSConfigState.h"
|
|
|
|
//============================================================================
|
|
// The CStartupItem class is used to encapsulate an individual startup
|
|
// item. Pointers to these objects are maintained in the list.
|
|
//============================================================================
|
|
|
|
class CStartupItem
|
|
{
|
|
public:
|
|
//------------------------------------------------------------------------
|
|
// Constructor and destructor.
|
|
//------------------------------------------------------------------------
|
|
|
|
CStartupItem() { }
|
|
virtual ~CStartupItem() { }
|
|
|
|
//------------------------------------------------------------------------
|
|
// If the derived classes use the base class member variables, these won't
|
|
// need to be overridden.
|
|
//------------------------------------------------------------------------
|
|
|
|
virtual void GetDisplayInfo(CString & strItem, CString & strLocation, CString & strCommand)
|
|
{
|
|
strItem = m_strItem;
|
|
strLocation = m_strLocation;
|
|
strCommand = m_strCommand;
|
|
}
|
|
|
|
virtual BOOL IsLive()
|
|
{
|
|
return m_fLive;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
// Set whether or not the startup item is enabled. If disabling the
|
|
// startup item, add a registry entry so it will be loaded again.
|
|
// If enabling the startup item, delete the registry entry.
|
|
//
|
|
// Of course, do the appropriate thing to registry keys, etc.
|
|
//------------------------------------------------------------------------
|
|
|
|
virtual BOOL SetEnable(BOOL fEnable) = 0;
|
|
|
|
protected:
|
|
BOOL m_fLive;
|
|
CString m_strItem;
|
|
CString m_strLocation;
|
|
CString m_strCommand;
|
|
};
|
|
|
|
//============================================================================
|
|
// The CStartupItemRegistry class is used to encapsulate an individual startup
|
|
// item stored in the registry.
|
|
//============================================================================
|
|
|
|
class CStartupItemRegistry : public CStartupItem
|
|
{
|
|
public:
|
|
//------------------------------------------------------------------------
|
|
// Overridden methods for this type of startup item.
|
|
//------------------------------------------------------------------------
|
|
|
|
CStartupItemRegistry();
|
|
CStartupItemRegistry(HKEY hkey, LPCTSTR szKey, LPCTSTR szName, LPCTSTR szValueName, LPCTSTR szValue);
|
|
CStartupItemRegistry(LPCTSTR szKey, LPCTSTR szName, LPCTSTR szValueName, LPCTSTR szValue);
|
|
BOOL SetEnable(BOOL fEnable);
|
|
|
|
//------------------------------------------------------------------------
|
|
// Functions for this subclass.
|
|
//------------------------------------------------------------------------
|
|
|
|
BOOL Create(LPCTSTR szKeyName, HKEY hkey);
|
|
static void RemovePersistedEntries();
|
|
|
|
private:
|
|
HKEY m_hkey;
|
|
CString m_strKey;
|
|
CString m_strValueName;
|
|
BOOL m_fIniMapping;
|
|
};
|
|
|
|
//============================================================================
|
|
// The CStartupItemFolder class is used to encapsulate an individual startup
|
|
// stored in the startup folder.
|
|
//============================================================================
|
|
|
|
class CStartupItemFolder : public CStartupItem
|
|
{
|
|
public:
|
|
//------------------------------------------------------------------------
|
|
// Class used to get information about a shortcut from a function running
|
|
// in a different thread.
|
|
//------------------------------------------------------------------------
|
|
|
|
class CIconInfo
|
|
{
|
|
public:
|
|
TCHAR szPath[MAX_PATH * 2];
|
|
TCHAR szTarget[MAX_PATH * 2];
|
|
TCHAR szArgs[MAX_PATH * 2];
|
|
HRESULT hResult;
|
|
};
|
|
|
|
public:
|
|
//------------------------------------------------------------------------
|
|
// Overridden methods for this type of startup item.
|
|
//------------------------------------------------------------------------
|
|
|
|
CStartupItemFolder();
|
|
BOOL SetEnable(BOOL fEnable);
|
|
|
|
//------------------------------------------------------------------------
|
|
// Functions for this subclass.
|
|
//------------------------------------------------------------------------
|
|
|
|
BOOL Create(LPCTSTR szKeyName, HKEY hkey);
|
|
BOOL Create(const WIN32_FIND_DATA & fd, HKEY hkey, LPCTSTR szRegPathToFolder, LPCTSTR szFolder, LPCTSTR szDir);
|
|
static void RemovePersistedEntries();
|
|
HRESULT GetIconInfo(CIconInfo & info);
|
|
|
|
private:
|
|
CString m_strFilePath;
|
|
CString m_strBackupPath;
|
|
};
|
|
|
|
//============================================================================
|
|
// The class which implements the startup tab.
|
|
//============================================================================
|
|
|
|
class CPageStartup : public CPropertyPage, public CPageBase
|
|
{
|
|
DECLARE_DYNCREATE(CPageStartup)
|
|
|
|
// Construction
|
|
public:
|
|
CPageStartup();
|
|
~CPageStartup();
|
|
|
|
// Dialog Data
|
|
//{{AFX_DATA(CPageStartup)
|
|
enum { IDD = IDD_PAGESTARTUP };
|
|
// NOTE - ClassWizard will add data members here.
|
|
// DO NOT EDIT what you see in these blocks of generated code !
|
|
//}}AFX_DATA
|
|
|
|
|
|
// Overrides
|
|
// ClassWizard generate virtual function overrides
|
|
//{{AFX_VIRTUAL(CPageStartup)
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
protected:
|
|
// Generated message map functions
|
|
//{{AFX_MSG(CPageStartup)
|
|
virtual BOOL OnInitDialog();
|
|
afx_msg void OnDestroy();
|
|
afx_msg void OnItemChangedList(NMHDR* pNMHDR, LRESULT* pResult);
|
|
afx_msg void OnButtonDisableAll();
|
|
afx_msg void OnButtonEnableAll();
|
|
afx_msg void OnSetFocusList(NMHDR* pNMHDR, LRESULT* pResult);
|
|
afx_msg void OnButtonRestore();
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
public:
|
|
//=========================================================================
|
|
// Functions overridden from CPageBase
|
|
//=========================================================================
|
|
|
|
TabState GetCurrentTabState();
|
|
BOOL OnApply();
|
|
void CommitChanges();
|
|
void SetNormal();
|
|
void SetDiagnostic();
|
|
LPCTSTR GetName() { return _T("startup"); };
|
|
|
|
private:
|
|
//=========================================================================
|
|
// Functions specific to this tab.
|
|
//=========================================================================
|
|
|
|
void LoadStartupList();
|
|
void LoadStartupListLiveItems();
|
|
void LoadStartupListLiveItemsRunKey();
|
|
void LoadStartupListLiveItemsStartup();
|
|
void LoadStartupListLiveItemsWinIniKey();
|
|
void LoadStartupListDisabledItems();
|
|
void GetCommandName(CString & strCommand);
|
|
void InsertStartupItem(CStartupItem * pItem);
|
|
void EmptyList(BOOL fFreeMemoryOnly);
|
|
void SetEnableForList(BOOL fEnable);
|
|
|
|
HWND GetDlgItemHWND(UINT nID)
|
|
{
|
|
HWND hwnd = NULL;
|
|
CWnd * pWnd = GetDlgItem(nID);
|
|
if (pWnd)
|
|
hwnd = pWnd->m_hWnd;
|
|
ASSERT(hwnd);
|
|
return hwnd;
|
|
}
|
|
|
|
private:
|
|
BOOL m_fModified;
|
|
void SetModified(BOOL bChanged = TRUE)
|
|
{
|
|
m_fModified = bChanged;
|
|
CPropertyPage::SetModified(bChanged);
|
|
}
|
|
|
|
//=========================================================================
|
|
// Member variables.
|
|
//=========================================================================
|
|
|
|
CWindow m_list;
|
|
int m_iNextPosition;
|
|
BOOL m_fIgnoreListChanges;
|
|
TabState m_stateRequested; // save the requested state in case there are no startup items
|
|
};
|
|
|
|
//============================================================================
|
|
// CRestoreStartup implements a dialog box which allows the user to restore
|
|
// startup items disabled during upgrade.
|
|
//============================================================================
|
|
|
|
#define DISABLED_KEY _T("Software\\Microsoft\\Windows\\CurrentVersion\\Setup\\DisabledRunKeys")
|
|
#define ENABLED_KEY _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run")
|
|
#define DISABLED_STARTUP _T("\\Disabled Startup")
|
|
|
|
class CRestoreStartup : public CDialog
|
|
{
|
|
// Construction
|
|
public:
|
|
CRestoreStartup(CWnd* pParent = NULL); // standard constructor
|
|
|
|
// Dialog Data
|
|
//{{AFX_DATA(CRestoreStartup)
|
|
enum { IDD = IDD_RESTORE };
|
|
// NOTE: the ClassWizard will add data members here
|
|
//}}AFX_DATA
|
|
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CRestoreStartup)
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
public:
|
|
static BOOL AreItemsToRestore();
|
|
|
|
private:
|
|
//-------------------------------------------------------------------------
|
|
// These classes are used to represent the various types of disabled
|
|
// startup items we might restore. CStartupDisabled is an abstract base.
|
|
//-------------------------------------------------------------------------
|
|
|
|
class CStartupDisabled
|
|
{
|
|
public:
|
|
CStartupDisabled() {};
|
|
virtual ~CStartupDisabled() {};
|
|
virtual void GetColumnCaptions(CString & strItem, CString & strLocation) = 0;
|
|
virtual void Restore() = 0;
|
|
};
|
|
|
|
//-------------------------------------------------------------------------
|
|
// CStartupDisabledRegistry represents Run key items in the registry that
|
|
// were disabled.
|
|
//-------------------------------------------------------------------------
|
|
|
|
class CStartupDisabledRegistry : public CStartupDisabled
|
|
{
|
|
public:
|
|
CStartupDisabledRegistry(LPCTSTR szValueName, LPCTSTR szValue, LPCTSTR szLocation, HKEY hkeyBase) :
|
|
m_strValueName(szValueName),
|
|
m_strValue(szValue),
|
|
m_strLocation(szLocation),
|
|
m_hkeyBase(hkeyBase) {};
|
|
~CStartupDisabledRegistry() {};
|
|
|
|
void GetColumnCaptions(CString & strItem, CString & strLocation)
|
|
{
|
|
strItem = m_strValueName + CString(_T(" = ")) + m_strValue;
|
|
strLocation = ((m_hkeyBase == HKEY_LOCAL_MACHINE) ? CString(_T("HKLM\\")) : CString(_T("HKCU\\"))) + m_strLocation;
|
|
}
|
|
|
|
void Restore()
|
|
{
|
|
// Create the value in the Run registry key.
|
|
|
|
CRegKey regkey;
|
|
if (ERROR_SUCCESS != regkey.Open(m_hkeyBase, m_strLocation, KEY_WRITE))
|
|
return;
|
|
BOOL fSet = (ERROR_SUCCESS == regkey.SetValue(m_strValue, m_strValueName));
|
|
regkey.Close();
|
|
|
|
// Delete it from the disabled location.
|
|
|
|
if (fSet)
|
|
{
|
|
if (ERROR_SUCCESS != regkey.Open(m_hkeyBase, DISABLED_KEY, KEY_WRITE))
|
|
return;
|
|
regkey.DeleteValue(m_strValueName);
|
|
regkey.Close();
|
|
}
|
|
}
|
|
|
|
private:
|
|
CString m_strValueName;
|
|
CString m_strValue;
|
|
CString m_strLocation;
|
|
HKEY m_hkeyBase;
|
|
};
|
|
|
|
//-------------------------------------------------------------------------
|
|
// CStartupDisabledStartup represents startup group items that were
|
|
// disabled.
|
|
//-------------------------------------------------------------------------
|
|
|
|
class CStartupDisabledStartup : public CStartupDisabled
|
|
{
|
|
public:
|
|
CStartupDisabledStartup(LPCTSTR szFile, LPCTSTR szDestination, LPCTSTR szCurrentLocation) :
|
|
m_strFile(szFile),
|
|
m_strDestination(szDestination),
|
|
m_strCurrentLocation(szCurrentLocation) {};
|
|
~CStartupDisabledStartup() {};
|
|
|
|
void GetColumnCaptions(CString & strItem, CString & strLocation)
|
|
{
|
|
strItem = m_strFile;
|
|
strLocation = m_strDestination;
|
|
}
|
|
|
|
void Restore()
|
|
{
|
|
// Move the file to the startup directory.
|
|
|
|
CString strExisting(m_strCurrentLocation);
|
|
if (strExisting.Right(1) != CString(_T("\\")))
|
|
strExisting += CString(_T("\\"));
|
|
strExisting += m_strFile;
|
|
|
|
CString strDestination(m_strDestination);
|
|
if (strDestination.Right(1) != CString(_T("\\")))
|
|
strDestination += CString(_T("\\"));
|
|
strDestination += m_strFile;
|
|
|
|
::MoveFileEx(strExisting, strDestination, 0);
|
|
}
|
|
|
|
private:
|
|
CString m_strFile;
|
|
CString m_strDestination;
|
|
CString m_strCurrentLocation;
|
|
};
|
|
|
|
private:
|
|
CWindow m_list;
|
|
int m_iNextPosition;
|
|
|
|
private:
|
|
void InsertDisabledStartupItem(CStartupDisabled * pItem);
|
|
BOOL LoadDisabledStartupGroup();
|
|
BOOL LoadDisabledRegistry();
|
|
BOOL LoadDisabledItemList();
|
|
void EmptyList();
|
|
void SetOKState();
|
|
|
|
protected:
|
|
|
|
// Generated message map functions
|
|
//{{AFX_MSG(CRestoreStartup)
|
|
virtual BOOL OnInitDialog();
|
|
afx_msg void OnDestroy();
|
|
virtual void OnOK();
|
|
afx_msg void OnItemChangedRestoreList(NMHDR* pNMHDR, LRESULT* pResult);
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
//{{AFX_INSERT_LOCATION}}
|
|
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
|
|
|
#endif // !defined(AFX_PAGESTARTUP_H__928475DA_B332_47F4_8180_5C8B79DFC203__INCLUDED_)
|