|
|
#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_)
|