MFC怎样编写后台运行的程序

MFC怎样编写后台运行的程序

---------------------------------------------------------------

http://www.codeproject.com/system/xservice.asp
---------------------------------------------------------------

以下为转载---------
1、实现开机自运行

     我在csdn网站上经常看到有人问这样的问题,其实要实现开机时就自动运行自己的程序并不难。在注册表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run键下可以看到有一系列键值,它们都是开机自动运行的软件的路径。那么我们要做的就是编程实现将我们的程序的路径也添加到这个键值下,就搞定了。著名的“windows优化大师”也就是用去掉不必要的开机运行软件这个方法来实现开机速度优化的。
     既然要读写注册表,就要用到两个重要的操作注册表的函数:RegOpenKey()和RegSetValueEx()。前者用于打开注册表的键,后者则为打开的键设置键值,至于这两个API函数的具体参数,请参见MSDN。为了代码重用的要求,我为此封装了一个专门的函数,如下所示:

BOOL SetAutoRun(CString strPath)//开机自动运行
{
    CString str;
    HKEY hRegKey;
    BOOL bResult;
    str=_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
    if(RegOpenKey(HKEY_LOCAL_MACHINE, str, &hRegKey) != ERROR_SUCCESS)
        bResult=FALSE;
    else
    {
        _splitpath(strPath.GetBuffer(0),NULL,NULL,str.GetBufferSetLength(MAX_PATH+1),NULL);
        strPath.ReleaseBuffer();
        str.ReleaseBuffer();
        if(::RegSetValueEx( hRegKey,
                            str,
                            0,
                            REG_SZ,
                            (CONST BYTE *)strPath.GetBuffer(0),
                            strPath.GetLength() ) != ERROR_SUCCESS)
           bResult=FALSE;
        else
           bResult=TRUE;
        strPath.ReleaseBuffer();
    }
    return bResult;
}

     其中strPath参数表示要设置为自运行的程序的绝对路径。当设置成功时返回true,否则返回false。
这里又带来一个问题:既然需要本程序的绝对路径,那么怎么得到它呢?总不能指定一个值吧,那么当本程序的路径改变时就又要修改程序,太麻烦了。可以用这个封装的函数来实现:
//得到程序文件本身的路径(包括文件名)

CString GetMyPath()
{
    CString strPath;
    GetModuleFileName(NULL,strPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
    strPath.ReleaseBuffer();
    return strPath;
}

     其中GetModuleFileName()是一个得到路径的API函数。本函数将这个API函数封装在其中,为的是简化调用的目的。
     当执行这个函数时,返回本程序所在的绝对路径,包括本程序的文件名。
好了,得到本程序的路径,然后将它加载到注册表中,下次系统启动时,我们的程序就能自动随之启动了。


2、实现运行时自动隐藏

    这是一个很有趣很古老的话题,csdn上经常有人为此讨论不休,提出不少方案,比如在对话框的OnInitDialog()中添加一句:ShowWindow(SW_HIDE);,或者在对话框属性框中去掉对话框的Visible属性;或者将对话框移到桌面以外的地方去;或者首先将对话框最小化,然后实现最小化时隐藏……有趣的是这些很容易想到的常规方法都不能解决这个问题,或者说解决的不够好。我通过查找相关文章和多次修改代码,找出了真正解决这个问题的办法。
    之所以用ShowWindow()函数失效,我认为可能是对话框的DoModal()在作怪,这么一来就只能绕开DoModal(),那么就自然想到可以把对话框变成一个无模式对话框。无模式对话框平时我们用到的不多,它与模式对话框不同,是用Create方法Create出来的,而不是DoModal()创建的。
    假设建立一个VC.NET工程GetTime,首先在CGetTimeApp类中添加一个成员变量:CGetTimeDlg *dlg;然后在InitInstance()中将原来的:

     int nResponse = dlg.DoModal();
     if (nResponse == IDOK)
     {
        // TODO: Place code here to handle when the dialog is
        //   dismissed with OK
     }
     else if (nResponse == IDCANCEL)
     {
        // TODO: Place code here to handle when the dialog is
        //   dismissed with Cancel
     }
以及return FALSE;全部删除掉,改为:      dlg=new CGetTimeDlg;
     m_pMainWnd = dlg;
     return dlg->Create(IDD_GETTIME_DIALOG);
    最后别忘了在ExitInstance()中加上一句:delete dlg;好了,这下把本程序的对话框变成了一个无模式对话框。不过既然是无模式对话框,就不能再用OnOK(),OnCancel()来退出了,要用DestroyWindow()。
    由于在上面的代码中没有将对话框设为可见,所以运行时就实现了隐藏,而且在Windows任务栏上也没有显示。至此,第二个问题得到完美解决。

****************************************************************************************************************************************************

 

基于对话框的的程序,如果要达到完全运行时隐藏,光将对话框的Visible属性设为FALSE是不够的,因为副对话框在App初始化的时候一个DoModal(),对话框就会显示出来,如果在对话框的OnInitDialog()使用如下两行代码:

SetWindowPos(&wndBottom, 0, 0, 0, 0, SWP_HIDEWINDOW); ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);

虽然能去掉窗体和任务栏上的图标,但避免不了,程序窗口的一闪,而且,在任务管理器的任务列表里会有该程序的运行图标。

如果在App的InitInstance()里将显示对话框的模式从“模式”改写为“无模式”,则能达到后台执行该对话框程序的目的,首先将父对话框的Visible属性设为FALSE,然后在程序的App类中定义一个成员变量:

CWnd* m_pWnd;

在程序的App类里面的InitInstance()里面将模式显示部分注释掉,改为:

CMyTestDlg* pDlg = new CMyTestDlg(); m_pWnd = pDlg; m_pMainWnd = pDlg; return pDlg->Create(IDD_MYTEST_DIALOG);

重写ExitInstance(),加入:

delete m_pWnd;

这样就达到了后台启动MFC对话框程序了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c++中的MFC基础知识十分必要,理解MFC的实现原理将有助于更好地掌握它的使用方法。一名程序员需要熟悉并掌握MFC中的各种类和方法,这样才能够写出自己需要的程序。在MFC中,要编写计算器程序需要涉及到很多的类,在设计时要充分考虑程序的结构和设计。计算器程序需要有一些基本的功能,如加减乘除、等于、退格、清空等。要实现这些功能,还需要处理数字的输入和显示,以及错误提示等问题。 在MFC中,可以利用CWnd类来设计计算器的用户界面,利用CEdit类处理数字的输入和显示,利用CButton类来处理各个按钮的操作,如加减乘除、等于、退格、清空等。同时,还需要利用CString类来处理计算的结果,利用CException类来处理错误的提示。 在编写计算器程序时,需要充分考虑程序的可读性和可复用性。程序应该按照逻辑分析和功能分区的原则来组织代码,采用模块设计和面向对象的方法实现各个操作和功能。程序的可读性和可复用性不仅可以提高程序的效率,而且还能够减少代码的冗余程度,使代码更加简洁易懂。 总的来说,编写MFC计算器程序需要充分掌握MFC的基础知识,理解窗口、消息、控件、消息映射等概念。在程序设计时要考虑好程序的结构和设计,使用面向对象的方法来实现各个功能。这样才能够写出高效、简洁、易读的程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值