背景:自己开发的监控程序需要在开机时自启动,并且启动后会监听host主机的报文。当收到需要启动本地的某个图形化软件命令后,会执行此图形化软件,从而在桌面显示图形软件。
问题点:
通过windows的“任务计划程序” 自启动的程序有两种执行方式,
- 一种是选择用户登录系统后执行,这种方式启动的监控程序可以直接拉起其它的图形化软件。但本人使用QT的控制器程序开发的监控软件通过此种方式自启动后会弹出一个CMD控制台界面,这是无法接受的。需要想办法解决。
- 一种是不管开机后用户是否登录都会执行,这种执行方式下自启动的程序会在后台执行,多次尝试拉起图形化软件,但图形化软件也是后台执行,不显示界面图形。
综上所述,只能采用方法1)实现我的场景,但还需要解决自启动程序弹控制台界面问题。
实现步骤:
1、在windows的“任务计划程序”中设置开机登录后启动自己开发的程序
设置的过程中需要注意上面截图的2和3两点即可。
2、在QT的CMakeList.txt文件中添加关闭console控制台的逻辑,贴上我的文件供参考,主要看 # Remove the console of gui program这段。
cmake_minimum_required(VERSION 3.0.0)
project(remoteMonitorTool VERSION 0.1 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(Monitor_header
remoteMonitorTool.h)
set(Monitor_src
remoteMonitorTool.cpp)
#find_package(Qt5Core)
find_package(Qt5 COMPONENTS Core Network REQUIRED)
add_executable(${PROJECT_NAME}
"main.cpp"
${Monitor_header}
${Monitor_src}
)
*# Remove the console of gui program*
if(WIN32)
if(MSVC)
set_target_properties(${PROJECT_NAME} PROPERTIES
WIN32_EXECUTABLE YES
LINK_FLAGS "/ENTRY:mainCRTStartup"
)
elseif(CMAKE_COMPILER_IS_GNUCXX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not tested
else()
message(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)")
endif(MSVC)
elseif(APPLE)
set_target_properties(${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE YES
)
elseif(UNIX)
# Nothing special required
else()
message(SEND_ERROR "You are on an unsupported platform! (Not Win32, Mac OS X or Unix)")
endif(WIN32)
target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Network)
这样构建生成的可执行程序.exe在执行时就不会再弹出console控制台界面了。
梳理下:
我的监控程序在开机登录后就会自启动,并且不会弹出console控制台的黑框。然后它就在一直监控本地端口。当接受到host的启动第三方软件命令时,它可以正常拉起图形界面的软件。