Macos 如何调用;“强制退出申请”;在Mac上

Macos 如何调用;“强制退出申请”;在Mac上,macos,user-interface,Macos,User Interface,有没有一种方法可以通过编程方式启动“强制退出应用程序”应用程序,该应用程序可以从“Apple菜单”或按命令选项Esc启动 我一直无法确定它是一个单独的应用程序,还是一个可以由命令行参数调用到Activity Monitor的应用程序 我尝试过模拟击键,但似乎不起作用: CGEventFlags flags = kCGEventFlagMaskAlternate | kCGEventFlagMaskCommand; CGKeyCode vi

有没有一种方法可以通过编程方式启动“强制退出应用程序”应用程序,该应用程序可以从“Apple菜单”或按命令选项Esc启动

我一直无法确定它是一个单独的应用程序,还是一个可以由命令行参数调用到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);

我还注意到CGEvents不能触发“Force Quit Applications”窗口,也许它只能在较低的IOHID级别上工作(比如Xcode模拟器)

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

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;
}
#包括
int IsForceQuitOpen(){
int=0;
CFArrayRef windowList=CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly,kCGNullWindowID);
CFIndex numWindows=CFArrayGetCount(窗口列表);
对于(int i=0;i<(int)numWindows;i++){
CFDictionaryRef info=(CFDictionaryRef)CFArrayGetValueAtIndex(windowList,i);
CFStringRef appName=(CFStringRef)CFDictionaryGetValue(信息,KCGWindowwnerName);
if(CFEqual(appName,CFSTR(“loginwindow”)){
发现=1;
}
}
发现退货;
}