Qt5 windows开机启动

为什么通过注册表设置开机启动的程序运行目录全是 system32?

写了个程序在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 里面添加了开机启动项(正常工作),但蛋疼的事情发生了,开机自动启动的程序所在的工作目录不是可执行文件所在目录而是system32...结果直接通过".\\xxx.exe"的方式对可执行文件同一目录下程序的调用就会因找不到文件而失败。

求解释求解救TAT

答:是的,注册表里面的启动项,工作目录估计继承了父进程的工作目录,也就是system32目录了。

解决办法也比较简单:
1 如果程序是你写的,自己做工作目录的调整就行了,好像是SetCurrent**Directry什么的,你查一下。

2 如果程序不是你写的,有个简单的做法,给这个程序做个快捷方式,在快捷方式中设置起此目录,再把这个快捷方式作为启动项写进注册表就行了

修改工作目录

  • 你很少需要这个操作如果你用到了,请注意

  bool QDir::setCurrent ( const QString & path ) [static]

  • 而不是

  bool QDir::cd ( const QString & dirName ) bool QDir::cdUp () void QDir::setPath ( const QString & path )

方法1: 在程序代码里设置当前运行的目录。但是这个方法只能适用于固定安装目录的软件

方法2: 这个简单的方法就是保证桌面的快捷方式不能被修改,如果被修改了,开机启动也起不来

获取当前桌面路径的方法:

QString desktop_path = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);

上面的方法会遇到

管理员权限的问题

开机启动和双击桌面快捷方式打开的目录不同

方法3: 使用dos命令的方式

  1. 在安装目录下创建一个后台启动的bat或js文件
  2. 设置注册表启动项值为上个步骤生成的bat或js文件的路径

Test.bat文件的内容:

@echo off

color 0a

set base_dir=%~dp0

%base_dir:~0,2%

pushd %base_dir%

"D:\Rt\body-detect.exe"

hiderun.js文件的内容:

new ActiveXObject(‘WScript.Shell‘).Run(‘cmd /c D:/Rt/Test.bat‘,0);

其中D:/test.bat是你的批处理路径

方法4: 使用vbs方式

start.vbs的内容:(带空格的路径的解决办法)

Set ws = CreateObject("WScript.Shell")

path=chr(34)&"D:\Rt\Test .bat"&chr(34)

ws.run path,vbhide

方式5: 使用bat调用js文件

CScript "C:/Program Files/RT600/hiderun.js"

下面来几个高手整理的

几种隐藏批处理运行窗口的方法 .
(1)通过批处理命令实现。缺点:会看到一个窗口一闪而逝。优点:简单,直接添加即可。

复制代码代码如下:

@echo off 
if "%1"=="h" goto begin 
start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit 
:begin
::以下为正常批处理命令,不可含有pause set/p等交互命令
pause

(2)利用vbs脚本实现隐藏。缺点:调用麻烦点。优点:基本看不到痕迹(非绝对的,指一般用户)

HideRun.vbs

复制代码代码如下:

CreateObject("WScript.Shell").Run "cmd /c D:/test.bat",0

其中D:/test.bat是你的批处理路径
.....................................................................................................................................
另一思路为把bat转换成vbs,然后vbs生成一个临时bat文件,然后WScript.Shell.Run隐藏启动这个临时bat。
HideRun.bat

复制代码代码如下:

echo CreateObject("WScript.Shell").Run "cmd /c D:/test.bat",0>$tmp.vbs
cscript.exe /e:vbscript $tmp.vbs
del $tmp.vbs

这个批处理其实不能使其批处理本身隐藏,但是下面大部分隐藏调用批处理的原理和基础。
HideRun.js

复制代码代码如下:

new ActiveXObject(‘WScript.Shell‘).Run(‘cmd /c D:/Test.bat‘,0);

用Javascript有什么好处呢?js的字符串变量可以用单引号,从而方便命令行作为参数调用,而且js很好的支持多行语句用 ; 分隔写成一行。要注意的是:js要区分大小写,方法
必须用括号,结尾必须有分号。所以就成了下面的命令:

复制代码代码如下:

mshta "javascript:new ActiveXObject(‘WScript.Shell‘).Run(‘cmd /c D:/test.bat‘,0);window.close()"

通常系统管理员会向用户端推送一些脚本并运行,或者拷贝批处理文件到客户端由用户自己运行。但是大部分脚本在运行时会弹出黑色背景的DOS窗口,这会让不少用户不知所
措,甚至误操作关闭正在运行的窗口。好在批处理文件的DOS窗口是可以隐藏的,以下是几种隐藏批处理运行窗口的方法。
1.基础
HideRun.vbs
CreateObject("WScript.Shell").Run "cmd /c D:/test.bat",0
其中D:/test.bat是你的批处理路径
另一思路为把bat转换成vbs,然后vbs生成一个临时bat文件,然后WScript.Shell.Run隐藏启动这个临时bat。
HideRun.bat

复制代码代码如下:

echo CreateObject("WScript.Shell").Run "cmd /c D:/test.bat",0>$tmp.vbs
cscript.exe /e:vbscript $tmp.vbs
del $tmp.vbs

这个批处理其实不能使其批处理本身隐藏,但是下面大部分隐藏调用批处理的原理和基础。
HideRun.js
new ActiveXObject(‘WScript.Shell‘).Run(‘cmd /c D:/Test.bat‘,0);
用Javascript有什么好处呢?js的字符串变量可以用单引号,从而方便命令行作为参数调用,而且js很好的支持多行语句用 ; 分隔写成一行。要注意的是:js要区分大小写,方法
必须用括号,结尾必须有分号。所以就成了下面的命令:
mshta "javascript:new ActiveXObject(‘WScript.Shell‘).Run(‘cmd /c D:/test.bat‘,0);window.close()"
2.用快捷方式
如果要使一个批处理本身隐藏,可以参考附件里的一个快捷方式,修改附件中的相关路径即可隐藏启动你的批处理。可以用vbs来建立一个 .lnk,其实用批处理也行(先echo一个
vbs出来)
3.利用系统服务
可以建立一个系统服务然后启动这个服务来启动批处理。缺点是启动服务较慢,需要管理员权限
runassrv add /cmdline:"C:/Windows/System32/cmd.exe /c D:/test.bat" /name:"mysrv"
net start mysrv
4.利用at计划任务
用at可以建立一个计划任务,在不输入 /interactive 参数可以后台运行。但是建使用at必须有管理员权限
at 09:10 "cmd /c D:/Test.bat"
然后在 9:10 系统就会自动后台以SYSTEM权限运行这个bat

5.利用ftype文件关联
ftype batfile=C:/Windows/System32/mshta "javascript:new ActiveXObject(‘WScript.Shell‘).Run(‘cmd /c%1‘,0);window.close();"
6.其他用户
Windows 2k/XP支持多用户,如果能在后台登陆另一个账户的桌面然后运行一个批处理,就能完全达到隐藏的目的
7.编译成可执行文件

不少方法可以实现,可以直接利用的工具有 Quick Batch file compiler。

时间: 2024-11-05 16:12:37

Qt5 windows开机启动的相关文章

关于windows 开机启动的方法(小结)

1. 程序>>>附件>>>启动  ###登录后方可执行.. 2. 注册表:machine 和 user 下的 software>>>microsoft>>>windows>>>currentverion  RUN或RUNONCE&RUNXE   ###登录后执行.. 3.组策略 cmd >>> gpedit.msc >>> 计算机策略(管理硬件) + 用户侧路(用户登录后方

python 定制windows 开机启动项

最近发现电脑开机速度越来越慢了.准备用python写一个开机启动的小程序: 1:开机后等待12s等待网络连接,之后判断网络,如果还是连接不上,就放弃开机启动的项目. 1:判断开机的日期,如果是周六日的时候就不用开启工作时候的程序了. startup.py =============================== import os,time,datetime # what day is it today? weekday=int(time.strftime("%w")) #sta

windows 开机启动 CassiniDev(IIS替代软件)

CassiniDev(IIS替代软件) 使用asp.net的时候,要部署一个iis,或者部署iis express,有时候你嫌麻烦, 这是一个替代品. 功能完全的. 下载地址:http://cassinidev.codeplex.com window开机自动启动 注册表方式: 1. 打开运行对话框(win键+R),输入命令 打开注册表编辑器,在开始菜单的搜索栏里或者打开"运行"程序,输入 regedit 后回车(若出现UAC提示,点击"是"): 2.找到以下键值:

windows开机启动项

原来就一个命令呀:msconfig 1.在开始菜单中输入 msconfig 命令,回车 2.在弹出的对话框中取消不想启动的程序 3.点击应用->确定->不启动

Windows开机自动启动VirtualBox(以无界面方式启动)-虚拟机

windows 开机启动 虚拟机 (以无界面方式启动) 桌面上出现了一个快捷方式, 右键快捷方式 -- 属性, 在目标中添加 --type headless 表示"无界面启动" http://www.cnblogs.com/stevenluo/p/4231897.html 然后 Win + R -->   shell:startup 把刚刚编辑的快捷方式移动到打开的文件夹

windows将某个应用加入开机启动项的解决办法

找到计算机以下位置,将要加入开机启动项的程序的快捷方式直接Copy到该目录下,下次开机该程序则会自动启动 C:\Users\pc\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup[注意:路径中的PC是我本机的电脑登录用户,实际情况需要对其进行适当替换]

Windows手动添加开机启动项

@方法1. 添加程序完整路径到注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run下 或者添加到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run下 @方法2. 将一个.lnk文件添加到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup目录下 @方法3. 使用命令行命令如

如何把自己写的程序加入到开机启动项(Windows)

①autoexec.bat ②winstart.bat  它的功能跟autoexec.bat的功能是一样的 ③开始菜单"启动"栏  在Windows完成启动后启动的栏目,由于windows已经完全启动,所以可以利用它来完成功能,你想要完成什么启动项目就只用把快捷方式拖到: C:\WINDOWS\Start Menu\Programs\启动 中就可以了 ④注册表的分支  HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersio

【定时任务|开机启动】Windows Server 2008/2012 计划任务配置(任务计划程序)每分钟执行BAT

打开计划任务快捷方式(在 “管理工具”内): C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\Task Scheduler.lnk 很多人在问我: 1.Windows Server 2008 计划任务在哪里配置? 2.Windows Server 2008 可以配置每分钟或是每小时执行我的任务吗? 答案是:可以! 首先Windows Server 2008不同于其他服务器操作系统和Windows