MFC_开机后软件启动管理程序
名称:OpenFile.exe
功能:1.开机启动。
2.选择其他应用程序,并运行。
3.记录当前CheckBox的状态,在下一次程序运行时还原为上一次的状态。
函数:1.a.LONG WINAPI RegCreateKey(HKEY hKey,LPCTSTR lpSubKey,PHKEY phkResult);
b.DWORD WINAPI GetModuleFileName(HMODULE hModule,LPTSTR lpFilename,DWORD nSize);
c.LONG WINAPI RegSetValueEx(HKEY hKey,LPCTSTR lpValueName,DWORD Reserved,DWORD dwType,const BYTE *lpData,DWORD cbData);
d.LONG WINAPI RegDeleteValue(HKEY hKey,LPCTSTR lpValueName);
e.LONG WINAPI RegCloseKey(HKEY hKey);
2.a.CFileDialog::GetPathName
b.UINT WINAPI WinExec(LPCSTR lpCmdLine,UINT uCmdShow);
3.a.BOOL WINAPI WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);.
b.DWORD WINAPI GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize,
LPCTSTR lpFileName);
代码:
OpenExeDlg.h
1 // OpenExeDlg.h : 头文件
2 //
3
4 #pragma once
5
6
7 // COpenExeDlg 对话框
8 class COpenExeDlg : public CDialogEx
9 {
10 // 构造
11 public:
12 COpenExeDlg(CWnd* pParent = NULL); // 标准构造函数
13
14 // 对话框数据
15 enum { IDD = IDD_OPENEXE_DIALOG };
16
17 protected:
18 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
19
20
21 // 实现
22 protected:
23 HICON m_hIcon;
24
25 // 生成的消息映射函数
26 virtual BOOL OnInitDialog();
27 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
28 afx_msg void OnPaint();
29 afx_msg HCURSOR OnQueryDragIcon();
30 DECLARE_MESSAGE_MAP()
31 public:
32 //----------------------------------------------------------------------------------------
33 CString m_path1;//文件路径Edit的关联变量,调用CFileDialog::GetPathName 时用。
34 CString exepath;//用来存放当前程序的绝对路径,调用GetModuleFileName时用。
35 int flag;//开机是否自动启动的标志
36 HKEY hkey;//调用RegCreateKey时用到,得到一个key的句柄
37 afx_msg void OnBnClickedButton1();//Select按键的函数(函数申明)
38 afx_msg void OnBnClickedButtonrun();//Run按键的函数(函数申明)
39 afx_msg void OnBnClickedCheck2();//开机自动启动前的CheckBox的函数(函数申明)
40 };
OpenExeDlg.cpp
1 // OpenExeDlg.cpp : 实现文件
2 //
3
4 #include "stdafx.h"
5 #include "OpenExe.h"
6 #include "OpenExeDlg.h"
7 #include "afxdialogex.h"
8
9 #ifdef _DEBUG
10 #define new DEBUG_NEW
11 #endif
12
13
14 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
15
16 class CAboutDlg : public CDialogEx
17 {
18 public:
19 CAboutDlg();
20
21 // 对话框数据
22 enum { IDD = IDD_ABOUTBOX };
23
24 protected:
25 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
26
27 // 实现
28 protected:
29 DECLARE_MESSAGE_MAP()
30 };
31
32 CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
33 {
34 }
35
36 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
37 {
38 CDialogEx::DoDataExchange(pDX);
39 }
40
41 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
42 END_MESSAGE_MAP()
43
44
45 // COpenExeDlg 对话框
46
47
48
49
50 COpenExeDlg::COpenExeDlg(CWnd* pParent /*=NULL*/)
51 : CDialogEx(COpenExeDlg::IDD, pParent)
52 //----------------------------------------------------------------------------------------
53 , m_path1(_T(""))//文件路径Edit的关联变量m_path1的初始化
54 {
55 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
56 }
57
58 void COpenExeDlg::DoDataExchange(CDataExchange* pDX)
59 {
60 CDialogEx::DoDataExchange(pDX);
61 DDX_Text(pDX, IDC_EDIT1, m_path1);
62 }
63
64 BEGIN_MESSAGE_MAP(COpenExeDlg, CDialogEx)
65 ON_WM_SYSCOMMAND()
66 ON_WM_PAINT()
67 ON_WM_QUERYDRAGICON()
68 //----------------------------------------------------------------------------------------
69 ON_BN_CLICKED(IDC_BUTTON1, &COpenExeDlg::OnBnClickedButton1)//Select按键的函数(消息映射)
70 ON_BN_CLICKED(IDC_BUTTONRUN, &COpenExeDlg::OnBnClickedButtonrun)//Run按键的函数(消息映射)
71 ON_BN_CLICKED(IDC_CHECK2, &COpenExeDlg::OnBnClickedCheck2)//开机自动启动前的checkbox的函数(消息映射)
72 END_MESSAGE_MAP()
73
74
75 // COpenExeDlg 消息处理程序
76
77 BOOL COpenExeDlg::OnInitDialog()
78 {
79 CDialogEx::OnInitDialog();
80
81 // 将“关于...”菜单项添加到系统菜单中。
82
83 // IDM_ABOUTBOX 必须在系统命令范围内。
84 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
85 ASSERT(IDM_ABOUTBOX < 0xF000);
86
87 CMenu* pSysMenu = GetSystemMenu(FALSE);
88 if (pSysMenu != NULL)
89 {
90 BOOL bNameValid;
91 CString strAboutMenu;
92 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
93 ASSERT(bNameValid);
94 if (!strAboutMenu.IsEmpty())
95 {
96 pSysMenu->AppendMenu(MF_SEPARATOR);
97 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
98 }
99 }
100
101 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
102 // 执行此操作
103 SetIcon(m_hIcon, TRUE); // 设置大图标
104 SetIcon(m_hIcon, FALSE); // 设置小图标
105
106 // TODO: 在此添加额外的初始化代码
107 //----------------------------------------------------------------------------------------
108 //从Config.ini文件里读取[Path]下one的值,并且放入m_path1中
109 //(".\\Config.ini"相对于当前exe文件路径的路径)
110 GetPrivateProfileString("Path","One","",m_path1.GetBuffer(MAX_PATH),MAX_PATH,".\\Config.ini");
111 //将文件路径显示在文件路径Edit(IDC_EDIT1)中(第一种在Edit控件显示字符串的方法)
112 SetDlgItemText(IDC_EDIT1,m_path1);
113 //获取Config.ini文件中[AutoRun]下Judge的值,判断上一次程序运行时开机自动启动前的CheckBox的状态
114 flag=GetPrivateProfileInt("AutoRun","Judge",0,".\\Config.ini");
115 //执行CheckBox的函数(OnBnClickedCheck2()),显示上一次程序运行时开机自动启动前的CheckBox的状态
116 OnBnClickedCheck2();
117 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
118 }
119
120 void COpenExeDlg::OnSysCommand(UINT nID, LPARAM lParam)
121 {
122 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
123 {
124 CAboutDlg dlgAbout;
125 dlgAbout.DoModal();
126 }
127 else
128 {
129 CDialogEx::OnSysCommand(nID, lParam);
130 }
131 }
132
133 // 如果向对话框添加最小化按钮,则需要下面的代码
134 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
135 // 这将由框架自动完成。
136
137 void COpenExeDlg::OnPaint()
138 {
139 if (IsIconic())
140 {
141 CPaintDC dc(this); // 用于绘制的设备上下文
142
143 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
144
145 // 使图标在工作区矩形中居中
146 int cxIcon = GetSystemMetrics(SM_CXICON);
147 int cyIcon = GetSystemMetrics(SM_CYICON);
148 CRect rect;
149 GetClientRect(&rect);
150 int x = (rect.Width() - cxIcon + 1) / 2;
151 int y = (rect.Height() - cyIcon + 1) / 2;
152
153 // 绘制图标
154 dc.DrawIcon(x, y, m_hIcon);
155 }
156 else
157 {
158 CDialogEx::OnPaint();
159 }
160 }
161
162 //当用户拖动最小化窗口时系统调用此函数取得光标
163 //显示。
164 HCURSOR COpenExeDlg::OnQueryDragIcon()
165 {
166 return static_cast<HCURSOR>(m_hIcon);
167 }
168
169
170 //----------------------------------------------------------------------------------------
171 //Select按键的函数
172 void COpenExeDlg::OnBnClickedButton1()
173 {
174 // TODO: 在此添加控件通知处理程序代码
175 //创建一个CFileDialog的对象dlg,TRUE为OPEN对话框,FALSE为SAVE AS对话框
176 CFileDialog dlg(TRUE);
177 //如果用户在dlg对话框中点击了确定按键
178 if(dlg.DoModal()==IDOK)
179 //用GetPathName得到选择文件的路径,并将其路径赋值给m_path1
180 m_path1=dlg.GetPathName();
181 //将文件路径显示在文件路径Edit(IDC_EDIT1)中(第二种在Edit控件显示字符串的方法)
182 GetDlgItem(IDC_EDIT1)->SetWindowText(m_path1);
183 //将m_path1的值写入Config.ini中[Path]的One中
184 WritePrivateProfileString("Path","One",m_path1,".\\Config.ini");
185 }
186
187
188
189 //----------------------------------------------------------------------------------------
190 void COpenExeDlg::OnBnClickedButtonrun()
191 {
192 // TODO: 在此添加控件通知处理程序代码
193 //如果文件路径前的CheckBox为选中状态,BST_UNCHECKED为没有选中
194 if ( BST_CHECKED == IsDlgButtonChecked(IDC_CHECK1))
195 {
196 //以SW_SHOW的方式运行m_path1路径下的exe文件
197 WinExec(m_path1.GetBuffer(0),SW_SHOW);
198 }
199 //之后OpenExe.exe程序关闭
200 CDialogEx::OnCancel();
201 }
202
203 //----------------------------------------------------------------------------------------
204 void COpenExeDlg::OnBnClickedCheck2()
205 {
206 // TODO: 在此添加控件通知处理程序代码
207 //判断开机是否自动启动的标志
208 switch(flag)
209 {
210 //1为选中
211 case 1:
212 {
213 //恢复上一次程序运行时,开机自动启动前的CheckBox的状态
214 ((CButton*)GetDlgItem(IDC_CHECK2))->SetCheck(BST_CHECKED);
215 WritePrivateProfileString("AutoRun","Judge","1",".\\Config.ini");
216 //获取HKEY_LOCAL_MACHINE下"Software\\Microsoft\\Windows\\CurrentVersion\\Run"键的句柄
217 RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&hkey);
218 //得到OpenExe.exe文件的绝对路径
219 GetModuleFileName(NULL,exepath.GetBuffer(MAX_PATH),MAX_PATH);
220 //用ReleaseBuffer去掉exepath没有用到的空间(因为exepath.GetBuffer(MAX_PATH)得到了一个存放路径的最大空间)
221 exepath.ReleaseBuffer();
222 //在hkey中注册一个名为exepath的值,其值为(const BYTE*)exepath.GetBuffer(exepath.GetLength()),长度为exepath.GetLength()
223 RegSetValueEx(hkey,exepath,0,REG_SZ,(const BYTE*)exepath.GetBuffer(exepath.GetLength()),exepath.GetLength());
224 //释放指定注册键的句柄hkey
225 RegCloseKey(hkey);
226 //将开机是否自动启动的标志置为0
227 flag=0;
228 }
229 break;
230 //0为没有选中
231 case 0 :
232 {
233 ((CButton*)GetDlgItem(IDC_CHECK2))->SetCheck(BST_UNCHECKED);
234 WritePrivateProfileString("AutoRun","Judge","0",".\\Config.ini");
235 RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&hkey);
236 GetModuleFileName(NULL,exepath.GetBuffer(MAX_PATH),MAX_PATH);
237 exepath.ReleaseBuffer();
238 //在hkey中删除一个名为exepath的值
239 RegDeleteValue(hkey,exepath);
240 RegCloseKey(hkey);
241 flag=1;
242 }
243 break;
244 }
245 }
运行界面:
注意事项:1.请以管理员的身份运行,否则注册表操作失败。
或者(工程->选项->连接器->清单文件->UAC 执行级别 改成requireAdministrator )
2.字符集为ansi。