【发布时间】:2012-01-21 02:06:08
【问题描述】:
在启用快速用户切换的 Mac OS X Snow Leopard 上,是否有 API 可以检测我的应用程序是否在活动用户会话中运行? IE。当前附加到屏幕和键盘的会话。
Objective-C 或 C++ 都可以。
【问题讨论】:
标签: c++ objective-c macos
在启用快速用户切换的 Mac OS X Snow Leopard 上,是否有 API 可以检测我的应用程序是否在活动用户会话中运行? IE。当前附加到屏幕和键盘的会话。
Objective-C 或 C++ 都可以。
【问题讨论】:
标签: c++ objective-c macos
我避免使用用户切换通知,而是发现了另外两种可能性:
使用来自 Core Graphics 的 CGMainDisplayID()。在您的应用首次启动时存储主显示 ID 并继续轮询它。切换到另一个用户时,它将更改为不同的显示 ID。问题是它也可能由于其他原因而改变,例如更改多屏设置中的主显示器。
也使用 Core Graphics 中的 CGSessionCopyCurrentDictionary(),并从字典中检索 kCGSessionOnConsoleKey 布尔值。这表明您的用户会话是否附加到控制台。
这两个都需要轮询,但这对我来说很好。如果您需要事件驱动,用户切换通知将是更好的选择。
【讨论】:
从“Introduction to Multiple User Environments”我只能想到一件事可以满足您的需求:用户切换通知。因此,如果您的应用程序启动,它显然必须处于活动会话中。现在您可以使用用户切换通知来设置新状态,即。 e.应用程序不再在活动会话中运行。
【讨论】:
这对我有用 (10.14 / Swift 4)
//Fast user switch out
NSWorkspace.shared.notificationCenter.addObserver(
self,
selector: #selector(becameInactive),
name: NSWorkspace.sessionDidResignActiveNotification,
object: nil
)
//Fast user switch bak in
NSWorkspace.shared.notificationCenter.addObserver(
self,
selector: #selector(becameActive),
name: NSWorkspace.sessionDidBecomeActiveNotification,
object: nil
)
// Switching workspace (spaces)
NSWorkspace.shared.notificationCenter.addObserver(
self,
selector: #selector(workspaceSwitched),
name: NSWorkspace.activeSpaceDidChangeNotification,
object: nil
)
【讨论】: