查看完整版本: [-- Windows下设置程序自动运行代码 --]

QTCN开发网 -> Qt代码秀 -> Windows下设置程序自动运行代码 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

XChinux 2012-07-15 11:46

Windows下设置程序自动运行代码

基本原理是创建一个快捷方式到程序->启动目录下,这里并没有用注册表方式(编译器为msvc2008)
头文件包含

  1. #ifdef Q_WS_WIN
    #include <windows.h>
    #include <shlobj.h>
    #endif

在.pro中加入下面库链接

  1. win32:LIBS += -lshell32 -lole32 -luser32




  1. // 获取程序启动快捷方式
    QString GetStartUpPath()//{{{
    {
        QString strPath;
    #ifdef Q_WS_WIN
        LPITEMIDLIST    pidl;
        LPMALLOC        pShellMalloc;
        wchar_t         szDir[1024];
        if (SUCCEEDED(SHGetMalloc(&pShellMalloc)))
        {
            if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_STARTUP, &pidl)))
            {
                if (SHGetPathFromIDList(pidl, szDir))
                {
                    strPath = QString::fromWCharArray(szDir) + "\\MyApp.lnk";
                }
                pShellMalloc->Free(pidl);
            }
            pShellMalloc->Release();
        }
    #endif
        return strPath;
    }//}}}

    // 设置是否自动运行
    void setAutoRunStatus(bool bAutoRun)//{{{
    {
        QString strExe = QApplication::applicationFilePath();
        QString strLink = GetStartUpPath();
        if (bAutoRun)
        {
    #ifdef Q_WS_WIN
            HRESULT hr = CoInitialize(NULL);
            if (SUCCEEDED(hr))
            {
                IShellLink *pisl;
                hr = CoCreateInstance(CLSID_ShellLink, NULL,
                        CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pisl);
                if (SUCCEEDED(hr))
                {
                    IPersistFile* pIPF;

                    //这里是我们要创建快捷方式的原始文件地址
                    pisl->SetPath(strExe.toStdWString().c_str());
                    hr = pisl->QueryInterface(IID_IPersistFile, (void**)&pIPF);
                    if (SUCCEEDED(hr))
                    {
                        //这里是我们要创建快捷方式的目标地址
                        pIPF->Save(strLink.toStdWString().c_str(), FALSE);
                        pIPF->Release();
                    }
                    pisl->Release();
                }
                CoUninitialize();
            }
    #endif
        }
        else
        {
            QFile::remove(strLink);
        }
    }//}}}

    // 获取自动运行状态
    bool getAutoRunStatus()//{{{
    {
        QString strLink = GetStartUpPath();
        bool bAutoRun = QFile::exists(strLink);
        return bAutoRun;
    }//}}}


计划 2012-07-15 11:57
学习一下,一直想知道如何能自动启动啊,感谢分享!

计划 2012-07-15 12:25
请问,用QtSDK还需要包含其它头文件吗?

XChinux 2012-07-15 12:39
已添加头文件和库。

计划 2012-07-15 17:06
添加头文件之后编译还有一个错误,我是个初学者,上边的代码都读不懂,能否给个实例,让我修改一下就能使用。

XChinux 2012-07-15 17:12
我用的是MSVC2008,你用的是mingw,你得网上查一下,它在哪个库中,修改下链接库。

XChinux 2012-07-15 17:14
引用第4楼计划于2012-07-15 17:06发表的 回 3楼(XChinux) 的帖子 :
添加头文件之后编译还有一个错误,我是个初学者,上边的代码都读不懂,能否给个实例,让我修改一下就能使用。

加上
win32:LIBS += -luuid

计划 2012-07-15 17:24
OK,我试一下。

zhucl1006 2012-08-08 16:39
学习了

lyjbbq 2012-08-17 09:13
  

toby520 2012-10-08 15:18
版主多分享些技术

liuyuanan 2012-11-13 09:24
   顶楼主,设置成功了

cyuyuanc 2013-01-13 22:36

stream966 2013-02-04 10:01
支持了  看看了

walnut_tom 2013-09-06 23:51
快捷方式创建 可以用 QFile::link 函数

XChinux 2013-09-07 09:11
引用第14楼walnut_tom于2013-09-06 23:51发表的  :
快捷方式创建 可以用 QFile::link 函数

这个可以吗?如果可以的话,那太好了。
我原来一直以为windows下这个方法创建的可能与 linux下ln命令相似,都是创建软链接或硬链接。我然后试试看。

滴血雄鹰 2013-10-17 15:33
收藏下

big_mouse 2020-04-15 09:39


查看完整版本: [-- Windows下设置程序自动运行代码 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled