• 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。

     

  • 相关阅读:
    groovy hello world
    windows下使用命令行给通过genymotion创建的虚拟机配制IP地址
    洛谷1781 宇宙总统 解题报告
    洛谷1042 乒乓球 解题报告
    洛谷1031 均分纸牌 解题报告
    洛谷1023 税收与补贴问题 解题报告
    洛谷1540 机器翻译 解题报告
    洛谷1017 进制转换 解题报告
    [SDOI2011] 染色(Luogu 2486)
    树链剖分详解
  • 原文地址:https://www.cnblogs.com/luzhiyuan/p/2265388.html
Copyright © 2020-2023  润新知