我制作了一个必须在我的DELL服务器上运行的GUI应用程序,以便24小时发送查询。
如果应用程序被随机用户或其他任何用户停止,我创建了一个服务程序来检测它何时停止运行,并再次执行它。
问题是,在服务中,FindWindow()无法正常工作(始终返回nullptr),因为Microsoft自XP以来更改了其OS服务策略。而且我的服务程序无法查找程序是否在进程列表中。
我在互联网上找到了一些解决方案,即“允许服务与服务面板上的桌面交互”,但由于它是很久以前所以不太适合当前的操作系统版本。
我应该使用IPC吗?或任何其他方法来修复?
我认为必须有一种方法可以做到这一点,因为使用CreateProcessAsUser()也可以从服务执行进程。
任何建议都将得到真正的赞赏。
提前致谢。
答案 0 :(得分:0)
所以我做了Remy Lebeau为我提出的建议,它适用于Windows 7和2008。
这是我一步一步走的。
在GUI应用程序的全局命名空间中创建一个命名的互斥锁。
::CreateMutex(nullptr, false, L"Global\\MyMutex");
定期检查互斥锁是否已消失 通过使用CreateMutex(),并且不要忘记将引用计数处理到句柄。
HANDLE hDetector = ::CreateMutex(nullptr, false, L"Global\\MyMutex");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
// The GUI application is still running.
// ...
::CloseHandle(hDetector);
}
else
{
// The GUI application is not running.
// ...
::CloseHandle(hDetector);
}
看得见。