合成单击不会切换应用程序的菜单栏 (Mac OS X)

发布于 2024-08-28 21:46:42 字数 1577 浏览 1 评论 0原文

我正在为 iPhone 平台开发某种空中鼠标应用程序。该应用程序连接到一台计算机服务,该服务在 Mac OS X 上生成鼠标事件。我使用 CGEventCreateMouseEvent() 和 CGEventPost() 生成此事件。但我遇到了一个问题。假设您正在使用 Safari,然后单击可用桌面空间。如果您使用普通鼠标执行此操作,它将隐藏 Safari 的顶部菜单栏并显示 Finder 菜单栏。但在这些合成事件上,它的行为却并非如此。我是否必须发布其他一些事件或设置一些其他属性?

这是我的鼠标向上、鼠标向下的代码:

- (void)mouseUp:(int)button {
    int type = (button == LEFT_BUTTON) ? kCGEventLeftMouseUp : kCGEventRightMouseUp;
    int mouseButton = (button == LEFT_BUTTON) ? kCGMouseButtonLeft : kCGMouseButtonRight;
    leftMouseDown = (button == LEFT_BUTTON) ? NO : leftMouseDown;
    rightMouseDown = (button == RIGHT_BUTTON) ? NO : rightMouseDown;
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
    CGEventRef event = CGEventCreateMouseEvent (source, type, CGSCurrentInputPointerPosition(), mouseButton);
    CGEventSetType(event, type);
    CGEventPost(kCGHIDEventTap, event);
    CFRelease(event);
}
- (void)mouseDown:(int)button {
    int type = (button == LEFT_BUTTON) ? kCGEventLeftMouseDown : kCGEventRightMouseDown;
    int mouseButton = (button == LEFT_BUTTON) ? kCGMouseButtonLeft : kCGMouseButtonRight;
    leftMouseDown = (button == LEFT_BUTTON) ? YES : leftMouseDown;
    rightMouseDown = (button == RIGHT_BUTTON) ? YES : rightMouseDown;
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
    CGEventRef event = CGEventCreateMouseEvent (source, type, CGSCurrentInputPointerPosition(), mouseButton);
    CGEventSetType(event, type);
    CGEventPost(kCGHIDEventTap, event);
    CFRelease(event);
}

I'm developing some sort of air mouse application for iPhone platform. This applications connects to one computer service which generates mouse events on Mac OS X. I'm generating this events with CGEventCreateMouseEvent() and CGEventPost(). But I've encountered one problem. Let's say you are using Safari and then you click on free desktop space. If you do this with regular mouse it will hide Safari's top menu bar and show Finder menu bar. But on these synthetic events it doesn't act like that. Do I have to post some other event or set some additional properties?

Here is my code for mouse up, mouse down:

- (void)mouseUp:(int)button {
    int type = (button == LEFT_BUTTON) ? kCGEventLeftMouseUp : kCGEventRightMouseUp;
    int mouseButton = (button == LEFT_BUTTON) ? kCGMouseButtonLeft : kCGMouseButtonRight;
    leftMouseDown = (button == LEFT_BUTTON) ? NO : leftMouseDown;
    rightMouseDown = (button == RIGHT_BUTTON) ? NO : rightMouseDown;
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
    CGEventRef event = CGEventCreateMouseEvent (source, type, CGSCurrentInputPointerPosition(), mouseButton);
    CGEventSetType(event, type);
    CGEventPost(kCGHIDEventTap, event);
    CFRelease(event);
}
- (void)mouseDown:(int)button {
    int type = (button == LEFT_BUTTON) ? kCGEventLeftMouseDown : kCGEventRightMouseDown;
    int mouseButton = (button == LEFT_BUTTON) ? kCGMouseButtonLeft : kCGMouseButtonRight;
    leftMouseDown = (button == LEFT_BUTTON) ? YES : leftMouseDown;
    rightMouseDown = (button == RIGHT_BUTTON) ? YES : rightMouseDown;
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
    CGEventRef event = CGEventCreateMouseEvent (source, type, CGSCurrentInputPointerPosition(), mouseButton);
    CGEventSetType(event, type);
    CGEventPost(kCGHIDEventTap, event);
    CFRelease(event);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

江挽川 2024-09-04 21:46:42

您可以尝试 CGPostMouseEvent ,它似乎可以解决这些问题,但还有其他缺点。(例如,当将指针移到停靠栏顶部时,至少在我的机器上,无法正确突出显示停靠栏上的图标。

更新

我想我有它,为了让 Finder 更改您的应用程序菜单栏,您还必须提供 MouseEventNumber Integerfield,例如通过

if (type == kCGEventLeftMouseDown) {
   eventNumber++;
   CGEventSetIntegerValueField (event, kCGMouseEventNumber, eventNumber);
}
if (type == kCGEventLeftMouseUp) {
   CGEventSetIntegerValueField (event, kCGMouseEventNumber, eventNumber);
}

You can try CGPostMouseEvent which seems to workaround these issue, but has other drawbacks .(e.g. doesn't highlight the icons on the dock correctly when move the pointer on top of it, at least on my machine.

Update

I think i have it. In order to let Finder cange your Application Menu Bar, you have to deliver also the MouseEventNumber Integerfield, e.g. by

if (type == kCGEventLeftMouseDown) {
   eventNumber++;
   CGEventSetIntegerValueField (event, kCGMouseEventNumber, eventNumber);
}
if (type == kCGEventLeftMouseUp) {
   CGEventSetIntegerValueField (event, kCGMouseEventNumber, eventNumber);
}
有深☉意 2024-09-04 21:46:42

我尝试 eventNumber=16384 ,它有效!但我根本不明白这意味着什么。

I try eventNumber=16384 and it works! But I simply don't understand what it means.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文