如何调用"强制退出应用程序"在Mac上

时间:2016-11-14 15:39:31

标签: macos user-interface

有没有办法以编程方式启动"强制退出应用程序"可以从Apple菜单中启动的应用程序'或者按下Command-Option-Esc。

enter image description here

我还没有找到它是一个单独的应用程序,还是可以通过命令行参数调用Activity Monitor。

我已经尝试过模拟按键,但它似乎无法正常工作:

              CGEventFlags flags = kCGEventFlagMaskAlternate | kCGEventFlagMaskCommand;
              CGKeyCode virtualKey = kVK_Escape;

              CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
              CGEventRef KbdEvent = CGEventCreateKeyboardEvent(source, virtualKey, YES);
              CGEventSetFlags(KbdEvent, (CGEventFlags)flags);
              CGEventTapLocation location = kCGHIDEventTap;

              CGEventPost(location, KbdEvent);

              CFRelease(KbdEvent);
              CFRelease(source);

1 个答案:

答案 0 :(得分:1)

我还注意到CGEvents无法触发“强制退出应用程序”窗口,也许它仅适用于较低的IOHID级别(如Xcode Simulator)。

调用我发现的窗口的唯一方法是使用系统事件:

system("osascript -l JavaScript -e \"Application('System Events').processes['Finder'].menuBars[0].menus['Apple'].menuItems['Force Quit…'].click()\"");

您可以使用以下命令检查窗口是否打开:

#include <Carbon/Carbon.h>

int IsForceQuitOpen() {
  int found = 0;
  CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
  CFIndex numWindows = CFArrayGetCount(windowList);

  for (int i = 0; i < (int)numWindows; i++) {
    CFDictionaryRef info = (CFDictionaryRef)CFArrayGetValueAtIndex(windowList, i);
    CFStringRef appName = (CFStringRef)CFDictionaryGetValue(info, kCGWindowOwnerName);

    if (CFEqual(appName, CFSTR("loginwindow"))) {
      found = 1;
    }
  }
  return found;
}