合成点击不切换应用程序的菜单栏(Mac OS X) [英] Synthetic click doesn't switch application's menu bar (Mac OS X)

查看:180
本文介绍了合成点击不切换应用程序的菜单栏(Mac OS X)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为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(事件,类型);
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)?是:leftMouseDown;
rightMouseDown =(button == RIGHT_BUTTON)?是:rightMouseDown;
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
CGEventRef event = CGEventCreateMouseEvent(source,type,CGSCurrentInputPointerPosition(),mouseButton);
CGEventSetType(事件,类型);
CGEventPost(kCGHIDEventTap,event);
CFRelease(event);
}


解决方案

您可以尝试CGPostMouseEvent解决这些问题,但有其他缺点(例如,当移动指针在其上方时,至少在我的机器上时,不会突出显示Dock上的图标。



更新



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

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


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);
}

解决方案

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);
}

这篇关于合成点击不切换应用程序的菜单栏(Mac OS X)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆