Windows计划任务的一个问题

发布时间 2023-04-01 03:15:35作者: 平静寄居者

我的办公桌朝东,早上太阳刺眼,需要适当提高屏幕亮度才能看清楚屏幕,过了一会儿太阳不直射了,又要降低屏幕亮度以保护视力。老是手工操作嫌烦,就写了个小程序,放进Windows计划任务(Task Scheduler)。小程序调试的时候一切正常,但从计划任务启动时却不工作。

开始怀疑是权限的问题。设置任务以管理员账号运行,还是不行。

干脆用启动命令行的方式:

ProcessStartInfo pinfo = new ProcessStartInfo(
    FileName = "cmd.exe",
    Arguments = "/c foo.exe");
Process.Start(pinfo);

却发现根本启动不了。

又查了不少资料,最后才偶然发现,原来问题出在一个小小的设置。计划任务缺省设置是Run whether the user is logged on or not,即不管用户是否登录都运行,改成只有登录了才运行,就一切正常了。查了下,如果程序需要用户交互,比如需要打开命令行窗口,或者打开一个图形程序等,就必须设置成只有用户登录了才运行。

但是我的程序并没有界面,只是通过pinvoke调用了user32.dll和dxva2.dll里的几个api,如EnumDisplayMonitors,GetNumberOfPhysicalMonitorsFromHMONITOR,GetPhysicalMonitorsFromHMONITOR,SetMonitorBrightness等。看来,这几个api被认为是需要用户交互。

另外调用的PowrProf.dll里的几个api如PowerWriteACValueIndex,PowerSetActiveScheme等,不需要设置成只有用户登录才运行。看来,这些api被认为是不需要用户交互。