VC写的程序怎样可以使它再系统启动时自动启动,而不需用户亲自启动。必须把他注册成Windows服务?怎样注册?还是有其他方法?
我是想程序既能自动启动也能由用户启动。
谢谢!

解决方案 »

  1.   

    注册表可以!!
    还可以改windows启动日志!
    都可以用程序来实现!!
    后者98可以!!
      

  2.   

    系统自动启动程序之十大藏身之所 
      Windows启动时通常会有一大堆程序自动启动。不要以为管好了“开始→程序→启动”菜单就万事大吉,实际上,在Windows XP/2K中,让Windows自动启动程序的办法很多,下文告诉你最重要的两个文件夹和八个注册键。   一、当前用户专有的启动文件夹 
      这是许多应用软件自动启动的常用位置,Windows自动启动放入该文件夹的所有快捷方式。用户启动文件夹一般在:\Documents and Settings\<用户名字>\“开始”菜单\程序\启动,其中“<用户名字>”是当前登录的用户帐户名称。   二、对所有用户有效的启动文件夹   这是寻找自动启动程序的第二个重要位置,不管用户用什么身份登录系统,放入该文件夹的快捷方式总是自动启动——这是它与用户专有的启动文件夹的区别所在。该文件夹一般在:\Documents and Settings\All Users\“开始”菜单\程序\启动。   三、Load注册键   介绍该注册键的资料不多,实际上它也能够自动启动程序。位置:HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows\load。   四、Userinit注册键   位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Userinit。这里也能够使系统启动时自动初始化程序。通常该注册键下面有一个userinit.exe,如图一,但这个键允许指定用逗号分隔的多个程序,例如“userinit.exe,OSA.exe”(不含引号)。 
      五、Explorer\Run注册键   和load、Userinit不同,Explorer\Run键在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有,具体位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run。   六、RunServicesOnce注册键   RunServicesOnce注册键用来启动服务程序,启动时间在用户登录之前,而且先于其他通过注册键启动的程序。RunServicesOnce注册键的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce。   七、RunServices注册键   RunServices注册键指定的程序紧接RunServicesOnce指定的程序之后运行,但两者都在用户登录之前。RunServices的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices。   八、RunOnce\Setup注册键   RunOnce\Setup指定了用户登录之后运行的程序,它的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\Setup。   九、RunOnce注册键   安装程序通常用RunOnce键自动运行程序,它的位置在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce和HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce。HKEY_LOCAL_MACHINE下面的RunOnce键会在用户登录之后立即运行程序,运行时机在其他Run键指定的程序之前。HKEY_CURRENT_USER下面的RunOnce键在操作系统处理其他Run键以及“启动”文件夹的内容之后运行。如果是XP,你还需要检查一下HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx。   十、Run注册键   Run是自动运行程序最常用的注册键,位置在:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run。HKEY_CURRENT_USER下面的Run键紧接HKEY_LOCAL_MACHINE下面的Run键运行,但两者都在处理“启动”文件夹之前。
      

  3.   

    给我一个看看,
    [email protected]
      

  4.   

    我的问题可能没有说太清楚。除了自动启动外,启动之后还要能自动执行程序的一些(或所有)功能,类似于windows服务,但注册Windows服务是不是太麻烦了。
    各位大侠所说的方法,是不是也实现了这样的功能?
      

  5.   

    to beyondtkl(大龙驹宣言:抵制日货,从我做起) (:
     give me!
     thanks a lot!
    [email protected]
      

  6.   

    基本代码如下
    CRegKey m_regAutoRun;开始
    m_regAutoRun.Create(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run");char fileNameBuf[MAX_PATH];
    long iLen = 0;
    iLen = GetModuleFileName(NULL,fileNameBuf,255); // 默认当前的exe
    fileNameBuf[iLen] = NULL;
    m_regAutoRun.SetValue(fileNameBuf,"YourKey");最后
    m_regAutoRun.Close();
      

  7.   

    以下为转载---------
    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任务栏上也没有显示。至此,第二个问题得到完美解决。