我使用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);
}
但是,系统重启后我的应用程序无法启动。
答案 0 :(得分:3)
有几种方法:
如果总是需要运行,我更喜欢最后一个选项。但您需要添加service handling。
答案 1 :(得分:1)
您可以使用任务计划程序创建任务,以便在计算机启动时运行您的应用程序。
单击“开始”按钮,依次单击“控制面板”,“系统和安全”,“管理工具”,然后双击“任务计划程序”,打开“任务计划程序”。如果系统提示您输入管理员密码或进行确认,请键入密码或提供确认。
单击“操作”菜单,然后单击“创建基本任务”。
键入任务名称和可选说明,然后单击“下一步”。
单击“计算机启动时”,然后单击“下一步”。
要安排程序自动启动,请单击“启动程序”,然后单击“下一步”。
单击“浏览”查找要启动的程序,然后单击“下一步”。
单击“完成”复选框并选择“完成此任务的打开属性”对话框,然后单击“完成”。
在“属性”对话框中,选择“运行是否登录用户”,然后单击“确定”
来源:
PS:您必须以管理员身份登录才能执行这些步骤
答案 2 :(得分:0)
使用您选择的解决方案时,请注意以下几点:
RunOnce
键,操作将只执行一次。如果您希望应用程序始终在用户登录时启动,则应使用Run
密钥。除了上述内容之外,如果要创建值,则必须为其命名。来自RegSetValueEx的lpValueName
参数的文档:
如果
lpValueName
为NULL
或空字符串""
,则该函数会设置密钥未命名或默认值的类型和数据。
默认(未命名)值是使用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);
}