我想在重启系统时重启我的应用程序

时间:2012-12-28 09:40:30

标签: c++ winapi

我使用GetModuleFileName获取应用程序的绝对路径,使用RegOpenKeyEx打开RunOnce注册表项并使用RegSetValueEx设置值。

if (RegOpenKeyEx (HKEY_CURRENT_USER, 
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce",0, KEY_SET_VALUE, &hk1) == ERROR_SUCCESS) 

{ 
    RegSetValueEx(hk1, // subkey handle 
                  "", // value name 
                  0, // must be zero 
                  REG_SZ, // value type 
                  (LPBYTE) &path, sizeof(DWORD)); // length of value data    
    RegCloseKey(hk1); 
} 

但是,系统重启后我的应用程序无法启动。

4 个答案:

答案 0 :(得分:3)

有几种方法:

  • 将您的应用程序放在启动文件夹中。这是一种非常简单的方法。当您的系统(PC)重新启动时,应用程序将启动(您需要登录);
  • 使用Windows任务计划程序;
  • 使应用程序成为service

如果总是需要运行,我更喜欢最后一个选项。但您需要添加service handling

答案 1 :(得分:1)

您可以使用任务计划程序创建任务,以便在计算机启动时运行您的应用程序。

  1. 单击“开始”按钮,依次单击“控制面板”,“系统和安全”,“管理工具”,然后双击“任务计划程序”,打开“任务计划程序”。如果系统提示您输入管理员密码或进行确认,请键入密码或提供确认。

  2. 单击“操作”菜单,然后单击“创建基本任务”。

  3. 键入任务名称和可选说明,然后单击“下一步”。

  4. 单击“计算机启动时”,然后单击“下一步”。

  5. 要安排程序自动启动,请单击“启动程序”,然后单击“下一步”。

  6. 单击“浏览”查找要启动的程序,然后单击“下一步”。

  7. 单击“完成”复选框并选择“完成此任务的打开属性”对话框,然后单击“完成”。

  8. 在“属性”对话框中,选择“运行是否登录用户”,然后单击“确定”

  9. 来源:

    Windows 7 - Schedule a task

    PS:您必须以管理员身份登录才能执行这些步骤

答案 2 :(得分:0)

使用您选择的解决方案时,请注意以下几点:

  • 当系统启动时,应用程序不会启动,而是在当前用户登录时启动。
  • 如果您写入RunOnce键,操作将只执行一次。如果您希望应用程序始终在用户登录时启动,则应使用Run密钥。

除了上述内容之外,如果要创建值,则必须为其命名。来自RegSetValueExlpValueName参数的文档:

  

如果lpValueNameNULL或空字符串"",则该函数会设置密钥未命名或默认值的类型和数据。

默认(未命名)值是使用regedit时显示为(Default)的值。要使其工作,您必须提供值的名称。这应该是唯一的,以便它不会与该密钥下的其他值冲突。

在技术性较低的说明中,只有在彻底考虑后才能为应用程序实现自动启动功能。

答案 3 :(得分:0)

您将错误的参数值传递给RegSetValueEx()。你需要像这样使用它:

TCHAR path[MAX_PATH+1] = {0}
GetModuleFileName(NULL, path, MAX_PATH);

if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce"), 0, KEY_SET_VALUE, &hk1) == ERROR_SUCCESS) 
{ 
    RegSetValueEx(hk1, // subkey handle 
                  TEXT("MyApp"), // value name 
                  0, // must be zero 
                  REG_SZ, // value type 
                  (LPBYTE) path,
                  (lstrlen(path)+1) * sizeof(TCHAR)); // length of value data, in bytes
    RegCloseKey(hk1); 
} 
相关问题