Restrict application to one instance per shell session on Windows

别等时光非礼了梦想. 提交于 2019-12-25 03:22:11

问题


There are a lot of solutions for restricting an application from running twice. Searching by process name, using a named mutex etc. But I all of these methods don't work if I want to restrict my application to the shell session.

A user may have more than login session and shell on windows (right?)? If this is true I want to be able to run one instance of my application in every shell session but allow only one.

Is there a way to get a shell identifier which could then be put into the mutex name?


回答1:


You can create local (session only) or global (whole system) mutexes. See http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx for more info. Look for global and local.




回答2:


The shell identifier you want to use is the user name. This is available as Environment::UserName or GetUserName()




回答3:


You can go from process id of the current process to a WTS session ID, I think that will do what you need. ProcessIdToSessionId

You should be aware that a terminal services session can be disconnected from one desktop and then connected to by another, so the 'shell' can actually change, but the session ID should remain the same.




回答4:


If you want to restrict it to one instance per login session, even if the same user account has multiple login sessions running at the same time (Server/Terminal Server) you could use the handle from GetShellWindow to check if there is a instance running already for this desktop.



来源:https://stackoverflow.com/questions/2285110/restrict-application-to-one-instance-per-shell-session-on-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!