gpt4 book ai didi

macos - 获取 Mojave 上的鼠标坐标

转载 作者:行者123 更新时间:2023-12-03 16:34:47 30 4
gpt4 key购买 nike

我有一个非常基本的小命令行应用程序,可以在下次单击鼠标时获取鼠标坐标。

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
CGFloat displayScale = 1.0f;
if ([[NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)])
{
displayScale = [NSScreen mainScreen].backingScaleFactor;
}

CGPoint loc = CGEventGetLocation(event);
CFRelease(event);
printf("%dx%d\n", (int)roundf(loc.x * displayScale), (int)roundf(loc.y * displayScale) );
exit(0);
return event;
}

int main(int argc, const char * argv[]) {
@autoreleasepool {

CFMachPortRef eventTap;
CGEventMask eventMask;
CFRunLoopSourceRef runLoopSource;
eventMask = 1 << kCGEventLeftMouseDown;
eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap,
1, eventMask, myCGEventCallback, @"mydata");

runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource,
kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
CFRunLoopRun();
}
return 0;
}

我使用 cmake 使用以下文件构建它:

cmake_minimum_required(VERSION 3.0.0)


project (location)

set(CMAKE_C_FLAGS "-arch x86_64 -mmacosx-version-min=10.12 -std=gnu11 -fobjc-arc -fmodules")

在升级到 Mojave 之前,这一切都运行良好。

稍微研究一下就会发现,这归因于最新的安全更新集和一些hints (CGEventTapCreate() 不返回 null 除外)有关在 Info.plist 中设置某些值以允许应用使用辅助功能 API 的信息。但我正在努力找出将其放在哪里,因为我只有一个包含代码的 .m 文件。

编辑

  • 这需要以非 root 用户身份运行(公司政策)
  • 如果这是让它请求许可的唯一方法,那么它可以扩展为具有最小 UI 的“GUI”应用

此应用程序只是抓取屏幕某个区域的左上角,以提供给第二个应用程序,该应用程序将该屏幕区域传输到第二个设备。流媒体的代码在 Win/Linux/MacOS 中很常见,因此尝试保持屏幕坐标集合完全独立

最佳答案

正如您所猜测的,如果没有无障碍访问权限,事件点击将无法在 Mojave 上运行。来自 documentation :

Event taps receive key up and key down events if one of the following conditions is true: The current process is running as the root user. Access for assistive devices is enabled. In OS X v10.4, you can enable this feature using System Preferences, Universal Access panel, Keyboard view.

GUI 应用程序将在第一次需要时提示用户启用辅助功能,但 CLI 应用程序似乎不会这样做(这是有道理的)。

无法以编程方式或通过脚本启用此功能;用户必须自己完成。

root 身份运行您的工具应该可以工作 - 您能强制执行吗?

否则,您可以将用户引导至系统偏好设置中的正确位置:

tell application "System Preferences"
reveal anchor "Privacy_Accessibility" of pane id "com.apple.preference.security"
activate
end tell

可以使用 Carbon ,如果您的应用未沙盒化。

最后,快速测试表明使用 IOHID 至少可以实现这一点。我无耻地借用了这个answerKeyboardWatcher类。然后,修改设备类型:

[self watchDevicesOfType:kHIDUsage_GD_Keyboard];

进入:

[self watchDevicesOfType:kHIDUsage_GD_Mouse];

最后,我的回调如下所示:

static void Handle_DeviceEventCallback (void *inContext, IOReturn inResult, void *inSender, IOHIDValueRef value)
{
IOHIDElementRef element = IOHIDValueGetElement(value);
IOHIDElementType elemType = IOHIDElementGetType(element);

if (elemType == kIOHIDElementTypeInput_Button)
{
int elementValue = (int) IOHIDValueGetIntegerValue(value);
// 1 == down 0 == up
if (elementValue == 1)
{
CGEventRef ourEvent = CGEventCreate(NULL);
CGPoint point = CGEventGetLocation(ourEvent);
printf("Mouse Position: %.2f, y = %.2f \n", (float) point.x, (float) point.y);
}
}
}

这确实是一项快速的黑客工作,但它表明这是可能的,希望您可以根据您的需求对其进行改进。

关于macos - 获取 Mojave 上的鼠标坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54037083/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com