如何知道进程是否从服务运行

时间:2013-02-01 08:52:02

标签: winapi service findwindow

我制作了一个必须在我的DELL服务器上运行的GUI应用程序,以便24小时发送查询。

如果应用程序被随机用户或其他任何用户停止,我创建了一个服务程序来检测它何时停止运行,并再次执行它。

问题是,在服务中,FindWindow()无法正常工作(始终返回nullptr),因为Microsoft自XP以来更改了其OS服务策略。而且我的服务程序无法查找程序是否在进程列表中。

我在互联网上找到了一些解决方案,即“允许服务与服务面板上的桌面交互”,但由于它是很久以前所以不太适合当前的操作系统版本。

我应该使用IPC吗?或任何其他方法来修复?

我认为必须有一种方法可以做到这一点,因为使用CreateProcessAsUser()也可以从服务执行进程。

任何建议都将得到真正的赞赏。

提前致谢。

1 个答案:

答案 0 :(得分:0)

所以我做了Remy Lebeau为我提出的建议,它适用于Windows 7和2008。

这是我一步一步走的。

  1. 在GUI应用程序的全局命名空间中创建一个命名的互斥锁。

    ::CreateMutex(nullptr, false, L"Global\\MyMutex");
    
  2. 定期检查互斥锁是否已消失 通过使用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);
    }
    
  3. 看得见。