如何检查进程的所有者是否是当前登录的用户? (QT应用程序)

时间:2014-05-21 11:32:29

标签: windows macos qt desktop-application

我有一个通过USB与外部设备通信的应用程序。它在后台运行,并定期检查设备是否连接到USB并开始从中读取数据。连接设备后,应用程序会向用户显示一个窗口。该应用程序按用户安装,并在用户登录时启动。该应用程序使用QT以C ++编写,适用于Windows和Mac OS X.

问题是,如果2个用户安装了应用程序并且同时登录(例如,通过"切换用户"功能),则有2个应用程序运行实例,并且他们将开始与设备通信,这会导致数据损坏。

如果流程的所有者当前没有活动,我想实施一项阻止应用启动通信的检查。然后,只有活动用户启动的实例才会与设备通信(这假设只有一个用户可以处于活动状态,但对个人计算机来说这很好)。理想情况下,我很高兴看到基于QT的解决方案适用于Windows和OS X,但平台特定的解决方案也会很好。

我想知道是否有一个激活应用程序窗口的解决方案,以及在此之后窗口是否处于活动状态的检查是否有效。

祝你好运, 米甲

2 个答案:

答案 0 :(得分:0)

您可以使用QSystemSemaphore来同步对USB设备的访问。

否则,您可以将其与QSharedMemory结合使用,以更精确地协调访问。

答案 1 :(得分:0)

虽然在OSX上存在函数QGuiApplication :: sessionId(),但它返回一个空字符串。

OSX docs中有关于如何处理多用户会话的指南。

您需要的是当前的会话ID。当用户登录并启动应用程序时,检索当前会话ID并将其存储在应用程序中。以下是您获取该会话ID的方法: -

#include <security/AuthSession.h>

unsigned int GetSessionId() const
{
    OSStatus error;
    SecuritySessionId mySession;
    SessionAttributeBits sessionInfo;

    error = SessionGetInfo(callerSecuritySession, &mySession, &sessionInfo);

    if(error != errSessionSuccess)
    {
        qDebug() << "Error retrieving session info");
        return 0;
    }

    return mySession;
}

您需要在项目文件(.pro)中包含安全框架: -

LIBS += -framework Security

因此,当应用程序需要与USB设备通信时,检索存储的会话ID并将其与当前会话ID进行比较,再次调用GetSessionId。如果它们不相等,则应用程序不会从当前登录的会话中运行,您可以跳过读取,允许其他应用程序实例继续。

假设QGuiApplication :: sessionId()在Windows中按预期工作,您可以使用它。