我有一个应用程序,必须运行所有的时间(如果用户同意这一点)。
当用户退出应用程序时,我将前台应用程序转换为LSUIElement (应用程序只有一个菜单栏图标,停靠图标和菜单消失)。
我在菜单项中有一个选项,可以正常工作,并将LSUIElement转换为前台应用程序(我使用函数[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]和[NSApp activateIgnoringOtherApps:YES])。
当用户双击应用程序时,我的问题就出现了。我再次使用了委托方法applicationWillUnhide:(NSNotification *)notification中的[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular],除了没有出现的菜单之外,其他的都工作得很好。如果我转到另一个应用程序,然后我回来了,菜单就会出现。我尝试了不同的方法,但我找不到一个好的。
我想知道的是当用户双击应用程序时调用的委托方法,或者在那一刻调用的NSApplication函数是什么,因为我认为在applicationWillUnhide函数中使用setActivationPolicy:为时已晚。
发布于 2012-10-15 23:50:44
为了将普通应用程序转换为LSUIElement,我使用了
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToUIElementApplication);并将其改回前台:
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);发布于 2020-01-05 09:35:09
这就是答案。在我找到这个问题之前,我已经做了隐藏/显示。这个问题让我得到了最终的答案。
下面的代码实现了以下功能:
我已经删除了其他不直接相关的代码。
你可能会注意到的其他事情:
my Info.plist的
代码:
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
private let statusItem = NSStatusBar.system.statusItem(withLength:NSStatusItem.squareLength)
weak private var window:NSWindow? = nil
func applicationDidFinishLaunching(_ aNotification: Notification) {
setupMenubarTray()
self.window = NSApp.orderedWindows.first
NotificationCenter.default.addObserver(self, selector: #selector(windowWillClose(_:)), name: NSWindow.willCloseNotification, object: self.window!)
}
func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
if !window!.isVisible {
activeApp()
return false
}
return true
}
}
extension AppDelegate {
@objc func windowWillClose(_ noti:Notification) {
removeFromDock()
}
private func showInDock() {
NSApp.setActivationPolicy(.regular)
}
private func removeFromDock() {
NSApp.setActivationPolicy(.accessory)
}
}
// MARK: - setup menubar button
extension AppDelegate {
private func setupMenubarTray() {
guard let button = statusItem.button else {
fatalError()
}
setTrayIcon(for:button)
button.action = #selector(mouseLeftButtonClicked)
}
private func setTrayIcon(for button:NSStatusBarButton) {
let useMonochromeIcon = UserDefaults.standard.bool(forKey: DefaultsKey.useMonochromeIcon.key)
button.image = NSImage(imageLiteralResourceName: useMonochromeIcon ? "MonochromeIcon" : "TrayIcon")
}
@objc private func mouseLeftButtonClicked() {
if NSApp.isHidden || !window!.isKeyWindow {
self.activeApp()
} else {
self.hide()
}
}
private func activeApp() {
showInDock()
window?.makeKeyAndOrderFront(nil)
NSApp.activate(ignoringOtherApps: true)
checker.sendNotification()
}
private func hide() {
removeFromDock()
NSApp.hide(nil)
}
}https://stackoverflow.com/questions/12897214
复制相似问题