跳到主要内容

Windows应用笔记

阅读量: 101
阅读人次: 102

在开发Windows Qt GUI程序时,常规的设置开机启动,只会在用户登录后才会自动运行。如何做到电脑开机后,用户未登录,应用程序就可以正常启动了?

通常应用程序要想实现开机自启动,可以在 C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 文件夹下创建可执行程序的快捷方式,然后就可以实现在用户登录成功后,应用程序自启。

// 获取自启文件夹路径
QString startupPath = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/Startup";
// 快捷文件的路径
QString shortcutPath = startupPath + "/app.lnk";

// 以下为通过 Windows API 创建应用程序的快捷方式
CoInitialize(NULL);
IShellLink *link = nullptr;
IPersistFile *persistFile = nullptr;
HRESULT result = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&link);
if (SUCCEEDED(result)) {
// 当前可执行程序的路径
QString appPath = QCoreApplication::applicationFilePath();
link->SetPath(appPath.toStdWString().c_str());
link->SetArguments(L"--autostart"); // 可以自定义设置应用程序的启动参数,以标识不用的启动方式
result = link->QueryInterface(IID_IPersistFile, (void **)&persistFile);
if (SUCCEEDED(result)) {
persistFile->Save(shortcutPath.toStdWString().c_str(), TRUE);
persistFile->Release();
}
link->Release();
}
CoUninitialize();

如果我们想做到Windows系统启动时,在用户登录成功之前应用程序就能自启,就需要实现 Windows 的后台服务程序。

由于GUI程序无法直接在Windows服务中显示界面(受Session 0隔离限制),可以将应用拆分为两部分:

  1. 后台服务程序:处理核心逻辑,无界面,随系统启动。
  2. 用户界面程序:用户登录后启动,通过IPC(如共享内存、套接字等)与服务通信。