Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 当macOS Catalina中存在多个NSScreen时,确定NSScreen上的鼠标光标X位置_Objective C_Cocoa_Screen Resolution_Hid - Fatal编程技术网

Objective c 当macOS Catalina中存在多个NSScreen时,确定NSScreen上的鼠标光标X位置

Objective c 当macOS Catalina中存在多个NSScreen时,确定NSScreen上的鼠标光标X位置,objective-c,cocoa,screen-resolution,hid,Objective C,Cocoa,Screen Resolution,Hid,我的Mac设置如下:5K显示屏布置在Mac内置显示屏的顶部 如果我的鼠标光标位于5K显示屏上,并且我尝试获得如下鼠标位置: CGEventRef ourEvent = CGEventCreate(NULL); NSPoint point = CGEventGetLocation(ourEvent); CFRelease(ourEvent); 我得到了point.x的意外返回值。例如,如果光标位于此位置: 然后我回到鼠标位置X:1950 px。然而,像Xscope这样的应用程序将该x位置报告

我的Mac设置如下:5K显示屏布置在Mac内置显示屏的顶部

如果我的鼠标光标位于5K显示屏上,并且我尝试获得如下鼠标位置:

CGEventRef ourEvent = CGEventCreate(NULL);
NSPoint point = CGEventGetLocation(ourEvent);
CFRelease(ourEvent);
我得到了
point.x
的意外返回值。例如,如果光标位于此位置:

然后我回到
鼠标位置X:1950 px
。然而,像Xscope这样的应用程序将该x位置报告为3900 px

这两个值都不正确,因为屏幕报告为2560宽:

NSScreen *currentScreen = [NSScreen currentScreenForMouseLocation];
NSLog(@"SCREEN WIDTH: %f", currentScreen.frame.size.width);
注意:currentScreenForMouseLocation来自

如果我把安排移到13号“内置显示器偏离中心,但仍在5K显示器下方,
point.x
值更不准确。我可以看到屏幕大小/分辨率的差异之间存在一些相关的数学关系,但我很难准确地找出到底发生了什么,以及如何最终将其转化为代码,从而获得鼠标光标位置的真实
点.x

我试图解决的问题是,我需要以编程方式显示NSStatusItem的菜单,并且我需要确定菜单是否太宽而无法显示在NSStatusItem的右侧。我使用的代码一般都可以正常工作,但在这种垂直排列的显示器的特殊情况下除外。在这种情况下,可能会发生以下情况:


内置显示器被设置为主显示器。您可以在系统首选项的“显示”窗格的屏幕截图中看到,因为符号菜单栏位于其上

这意味着它的左上角是Cocoa坐标系的原点。因此,外部显示器上的任何点都将相对于该点,因此显示器的相对位置会影响光标的报告位置

首先,我建议您使用Cocoa而不是核心图形来获取当前鼠标位置。然后,您需要将其调整为相对于其所在屏幕的原点(如果您感兴趣):

这就是说,听起来你只是将点与屏幕的右边缘进行比较,这也将相对于主显示器的原点进行报告。那么,为什么不将原始点与屏幕帧的MaxX()进行比较呢?”


内置显示器被设置为主显示器。您可以在系统首选项的“显示器”窗格的屏幕截图中看到,因为符号菜单栏位于其上

这意味着它的左上角是Cocoa坐标系的原点。因此,外部显示器上的任何点都将相对于该坐标系,因此显示器的相对位置会影响光标的报告位置

首先,我建议您使用Cocoa,而不是Core Graphics来获取当前鼠标位置。然后,您需要将其调整为相对于屏幕原点(如果您感兴趣的话):

这就是说,听起来您只是将该点与屏幕的右边缘进行比较,这也将相对于主显示器的原点进行报告。因此,为什么不将原始点与屏幕框架的MaxX()进行比较呢?”


currentScreen.frame.origin
的值是多少?在NSStatusItem上捕获单击事件时,5K显示屏上的currentScreen.frame.origin.x/y记录为“x:0.000000,y:0.000000”,而在内置显示屏上记录为“x:641.000000,y:-900.000000”返回。currentScreen.frame.origin的值是多少?在NSStatusItem上捕获单击事件时,5K显示屏上的currentScreen.frame.origin.x/y记录为“x:0.000000,y:0.000000”,而在内置显示屏上返回“x:641.000000,y:-900.000000”。你说得对!(pt.x+menuWidth>=NSMaxX(currentScreen.frame))是我实现此功能所需的全部。非常感谢!你想让你的信用卡上写着“肯·托马斯”吗?有你想让我链接的网站吗?不客气!很高兴我能帮忙。你不必相信我,但如果你相信我,那你就是“肯·托马斯”。没有网站链接。你是对的!(pt.x+menuWidth>=NSMaxX(currentScreen.frame))是我实现此功能所需的全部。非常感谢!你想让你的信用卡上写着“肯·托马斯”吗?有你想让我链接的网站吗?不客气!很高兴我能帮忙。你不必相信我,但如果你相信我,那你就是“肯·托马斯”。没有网站链接。
NSScreen *currentScreen = [NSScreen currentScreenForMouseLocation];
NSLog(@"SCREEN WIDTH: %f", currentScreen.frame.size.width);
NSPoint pt = [NSEvent mouseLocation];
NSScreen* currentScreen = [NSScreen currentScreenForMouseLocation];
pt.x -= currentScreen.frame.origin.x;
pt.y -= currentScreen.frame.origin.y;
NSPoint pt = [NSEvent mouseLocation];
NSScreen* currentScreen = [NSScreen currentScreenForMouseLocation];
if (pt.x + menuWidth >= NSMaxX(currentScreen.frame))
    ...;