合成点击不切换应用程序的菜单栏(Mac OS X) [英] Synthetic click doesn't switch application's menu bar (Mac OS X)
问题描述
这是我的代码,鼠标向上,鼠标向下:
- (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屋!