【问题标题】:How do I simulate the screenshot function (Mac) Cocoa?如何模拟截图功能(Mac)Cocoa?
【发布时间】:2014-09-14 16:48:32
【问题描述】:

这是我当前不起作用的代码:

CGEventSourceRef src =
CGEventSourceCreate(kCGEventSourceStateHIDSystemState);

CGEventRef cmdd = CGEventCreateKeyboardEvent(src, 0x37, true);
CGEventRef cmdu = CGEventCreateKeyboardEvent(src, 0x37, false);
CGEventRef optd = CGEventCreateKeyboardEvent(src, 0x3A, true);
CGEventRef optu = CGEventCreateKeyboardEvent(src, 0x3A, false);
CGEventRef dd = CGEventCreateKeyboardEvent(src, 0x02, true);
CGEventRef du = CGEventCreateKeyboardEvent(src, 0x02, false);

CGEventSetFlags(dd, kCGEventFlagMaskCommand ^ kCGEventFlagMaskAlternate);
CGEventSetFlags(du, kCGEventFlagMaskCommand ^ kCGEventFlagMaskAlternate);


CGEventTapLocation loc = kCGHIDEventTap; // kCGSessionEventTap also works
CGEventPost(loc, cmdd); //Cmd down
CGEventPost(loc, optd); //Option down
CGEventPost(loc, dd);   //D down
CGEventPost(loc, cmdu); //Cmd up
CGEventPost(loc, optu); //Option up
CGEventPost(loc, du);   //D up

CFRelease(cmdd);
CFRelease(cmdu);
CFRelease(optd);
CFRelease(optu);
CFRelease(dd);
CFRelease(du);
CFRelease(src);

我需要进行哪些更改才能使其正常工作?有谁知道为什么它不能工作?

【问题讨论】:

    标签: objective-c xcode macos cocoa simulation


    【解决方案1】:

    我无法理解您为什么要通过模拟键盘命令来截取屏幕截图(顺便说一句,它可以更改,所以它很脆弱)。以编程方式简单地执行此操作在各方面都要好得多。 Apple 对此有 example codeQuartz Display Services documentation 可以帮助您超越这一点。

    【讨论】:

    • 我一直在尝试这样做,但人们说这是不可能的,哈哈!我最初想以编程方式进行。谢谢!
    • 该示例仅允许全屏捕获,我想使用 UI 功能选择区域。这也可能吗?
    • 使用 `CGDisplayCreateImageForRect() 代替 CGDisplayCreateImage()。您可以使用自己的 UI 让用户选择矩形(一个透明的覆盖窗口,您可以在其中绘制一个半透明的选择矩形)。
    • @CloudSync 即使没有CGDisplayCreateImageForRect(),您也可以轻松拍摄全屏照片并根据触发拍摄的选择矩形对其进行修剪。您并不总是需要精确函数匹配来实现您的目标。
    【解决方案2】:

    查看“screencapture”命令行工具 - 手册页在这里: man screencapture

    这至少从 10.6 开始可用,这样您就不必自己编写逻辑代码了。

    例如,在终端中执行“screencapture -s ~/Desktop/screenshot.png”将运行基于区域的屏幕捕获并将输出放在桌面上的“screenshot.png”中。

    您可以使用 C 库的“system()”函数调用命令行工具。

    【讨论】:

      【解决方案3】:

      我设法解决了我的问题

      我是这样做的:

      1. 我制作了一个执行命令“screencapture -s /temp/tempscr/png”的shell脚本文件
      2. 然后我将 .sh 文件复制到我的应用程序中的“支持文件”文件夹中
      3. 然后我执行了以下代码:

        NSString *path = @"/Applications/CloudSyncMac.app/Contents/Resources/screencapture.sh";
        NSArray *args = [NSArray arrayWithObjects:nil, nil];
        [[NSTask launchedTaskWithLaunchPath:path arguments:args] waitUntilExit];
        
      4. 有效!!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-29
        • 1970-01-01
        • 2018-07-19
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 2018-08-07
        相关资源
        最近更新 更多