有很多解决方案可以限制应用程序运行两次。按进程名称搜索,使用命名互斥锁等。但如果我想将我的应用程序限制在 shell 会话中,所有这些方法都不起作用。
用户在 Windows 上可能拥有的不仅仅是登录会话和 shell(对吗?)?如果这是真的,我希望能够在每个 shell 会话中运行我的应用程序的一个实例,但只允许一个。
有没有办法获得一个外壳标识符,然后可以将其放入互斥锁名称中?
有很多解决方案可以限制应用程序运行两次。按进程名称搜索,使用命名互斥锁等。但如果我想将我的应用程序限制在 shell 会话中,所有这些方法都不起作用。
用户在 Windows 上可能拥有的不仅仅是登录会话和 shell(对吗?)?如果这是真的,我希望能够在每个 shell 会话中运行我的应用程序的一个实例,但只允许一个。
有没有办法获得一个外壳标识符,然后可以将其放入互斥锁名称中?
您可以创建本地(仅限会话)或全局(整个系统)互斥锁。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx。寻找全局和本地。
您要使用的外壳标识符是用户名。这可作为Environment::UserName
或GetUserName()
您可以从当前进程的进程 ID 转到 WTS 会话 ID,我认为这将满足您的需求。 ProcessIdToSessionId
您应该知道,终端服务会话可以与一个桌面断开连接,然后由另一个桌面连接,因此“shell”实际上可以更改,但会话 ID 应该保持不变。
如果您想将其限制为每个登录会话一个实例,即使同一个用户帐户同时运行多个登录会话(服务器/终端服务器),您也可以使用句柄 fromGetShellWindow
检查是否有一个实例已经在运行这个桌面。