Cocoa:获取屏幕上当前鼠标位置

30

我需要使用Xcode在Mac上获取鼠标在屏幕上的位置。我有一些代码,据说可以实现这个功能,但它总是返回x和y为0:

void queryPointer()
{

    NSPoint mouseLoc; 
    mouseLoc = [NSEvent mouseLocation]; //get current mouse position

    NSLog(@"Mouse location:");
    NSLog(@"x = %d",  mouseLoc.x);
    NSLog(@"y = %d",  mouseLoc.y);    

}

我做错了什么?如何获取屏幕上的当前位置? 此外,最终需要将该位置(保存在NSPoint中)复制到CGPoint中,以便与另一个函数一起使用,因此我需要将其作为x,y坐标获取或转换。


1
CGEventRef ourEvent = CGEventCreate(NULL); point = CGEventGetLocation(ourEvent); NSLog(@"位置?x=%f,y=%f", (float)point.x,(float)point.y); - wonderer
我不明白为什么你最初的代码不能运行,这段代码对我来说完美无缺。 - Mecki
5个回答

56

作者原始的代码不能工作,因为他试图将浮点数输出为%d。正确的代码应该是:

NSPoint mouseLoc = [NSEvent mouseLocation]; //get current mouse position
NSLog(@"Mouse location: %f %f", mouseLoc.x, mouseLoc.y);

你不需要去使用Carbon来完成这个任务。


4
那是石英事件服务而不是碳,但除此之外,您说得正确:Cocoa可以很好地完成这项工作,而无需创建CGEvent对象。 - Peter Hosey
1
糟糕,作为一个99%的Cocoa开发者,我对底层的术语并不是很擅长。感谢您的澄清 :) - MarcWan
我能否获取起始点、结束点、高度和宽度等信息,就像屏幕上的标尺一样? - Maulik shah

28
CGEventRef ourEvent = CGEventCreate(NULL);
point = CGEventGetLocation(ourEvent);
CFRelease(ourEvent);
NSLog(@"Location? x= %f, y = %f", (float)point.x, (float)point.y);

8
不要忘记释放那个CGEventRef! - kperryua
正如marcwan所回答的那样,问题中的示例由于NSLog出现错误而无法工作,其余部分都是正确的。 - Steph Thirion
我能否获取起始点、结束点、高度和宽度等信息,就像屏幕上的标尺一样? - Maulik shah

15

注意不要混淆NS环境和CG环境。如果你使用NS的mouseLocation方法获取鼠标位置,然后使用CG的CGWarpMouseCursorPosition(cgPoint)方法,则会导致鼠标指针不会移动到屏幕上您期望的位置。这个问题是由于CG使用左上角作为(0,0),而NS使用左下角作为(0,0)造成的。


我能否获取起始点、结束点、高度和宽度等信息,就像屏幕上的标尺一样? - Maulik shah

6

这个问题在Swift中的答案是:

let currentMouseLocation = NSEvent.mouseLocation()
let xPosition = currentMouseLocation.x
let yPosition = currentMouseLocation.y

从左上角开始的位置:CGPoint(NSEvent.mouseLocation()。x,abs(NSEvent.mouseLocation()。y + -NSScreen.mainScreen()!.visibleFrame.height)) - Sentry.co
@Andre 我该如何在mouseLocation发生变化时得到通知? - ixany
@ixany 您需要实现 mouseDragged、mouseEntered 和 mouseExited 事件。这将适用于应用程序窗口本身。 - Andre Yonadam
如果你有一个NSEvent事件源并需要CG坐标,请参考以下内容将其转换为GCEvent坐标:let mouseLocEvent = CGEvent.init(source: eventSource); return mouseLocEvent!.location。在我的情况下,这可以防止鼠标位置的瞬间移动。 - Jason Denney

0
NSLog(@"%@", NSStringFromPoint(point));

NSLog 是真的;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接