首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用辅助监视器时,如何获得相对于window.onmousemove上主机屏幕的e.creen X/Y?

当使用辅助监视器时,如何获得相对于window.onmousemove上主机屏幕的e.creen X/Y?
EN

Stack Overflow用户
提问于 2020-06-05 17:51:29
回答 2查看 852关注 0票数 8

我以为这件事很容易,但事实证明并非如此。

以下面的情况为例:底部有主桌面,主桌面上方有次级桌面。

目标是获得鼠标X和Y相对于屏幕的位置托管窗口的辅助桌面。天真的做法是:

代码语言:javascript
复制
const onMouseMove = e => {
  const hostScreenX = e.screenX;
  const hostScreenY = e.screenY;

  document.body.innerHTML = `${hostScreenX}x${hostScreenY}`;
};

window.addEventListener("mousemove", onMouseMove, false);

结果,当在辅助屏幕(顶部)上运行时,这将返回screenY的负数。主屏幕被视为“零边界”,在此之前的一切都是在一个负空间中。

我们可以使用screen.availTopscreen.availLeft对此进行解释。

代码语言:javascript
复制
const onMouseMove = e => {
  const hostScreenX = e.screenX - window.screen.availLeft;
  const hostScreenY = e.screenY - window.screen.availTop;

  document.body.innerHTML = `${hostScreenX}x${hostScreenY}`;
};

window.addEventListener("mousemove", onMouseMove, false);

好得多,除非它实际上是不正确的:因为availTop空间包含永久操作系统UI的空间(在MacOS工具栏上,如果将工具栏从默认底部移到顶部,则在MacOS工具栏上),所以我们错误地减去了工具栏空间。

例如,当鼠标移动到最远的顶部时,在以铬表示的hostScreenY上,会给我们一个80的,而它应该是103 ( MacOS工具栏是23像素)。

然后,您可能会认为,我们可以通过添加身高的差异来解决这个问题- availHeight:

代码语言:javascript
复制
const onMouseMove = e => {
  const hostScreenX = e.screenX - window.screen.availLeft + (window.screen.width - window.screen.availWidth);
  const hostScreenY = e.screenY - window.screen.availTop + (window.screen.height - window.screen.availHeight);

  document.body.innerHTML = `${hostScreenX}x${hostScreenY}`;
};

window.addEventListener("mousemove", onMouseMove, false);

事实上,这在MacOS上似乎是完美的。

问题是,--这假设操作系统的工具栏位于屏幕的顶部,这在上通常是不正确的(尽管有时将工具栏移到顶部时也是如此)。因此,这些值被工具栏空间所抵消。

,当我们在Javascript中的mousemove事件上使用二级(甚至三级)监视器时,如何获得相对于托管当前窗口的屏幕的screenX和screenY?

EN

回答 2

Stack Overflow用户

发布于 2020-06-10 10:16:01

这个解决方案适合您的需求吗?

它还与第一个显示器左侧的第二个监视器一起工作,在第一个监视器的右侧使用操作系统的工具栏。

代码语言:javascript
复制
const onMouseMove = e => {
  const { screen } = window;
  const { availLeft, availTop } = screen;
  const hostScreenX=e.screenX-availLeft+ (availLeft ? (screen.width - screen.availWidth) : 0);
  const hostScreenY=e.screenY-availTop+ (availTop ? (screen.height - screen.availHeight) : 0);

  document.body.innerHTML = `${devicePixelRatio} ${hostScreenX}x${hostScreenY} ` +
    `${hostScreenX * devicePixelRatio}x${hostScreenY * devicePixelRatio}`;
};

window.addEventListener("mousemove", onMouseMove, false);

附注:

我只有一台Windows 10 PC,我只能在我的平台上测试这个

编辑:,如果我们需要实际屏幕分辨率中的坐标,我们可以使用devicePixelRatio多人游戏。问题是devicePixelRatio可能会在屏幕之间发生变化。如果我们只需要知道坐标,直到鼠标指针在屏幕上承载我们的窗口,没有问题;如果我们需要继续获得其他屏幕上的坐标,许多其他问题出现在现场。如果真的需要的话,我建议在以后的编辑中讨论。

票数 0
EN

Stack Overflow用户

发布于 2020-06-11 20:46:09

根据我的研究,JavaScript目前不可能获得关于屏幕和屏幕大小的不同信息,更不用说macOS菜单栏之类的特定操作系统的位置和/或大小了。

例如,看看用javascript测试多个屏幕,其中最好的想法是做出有根据的猜测。

我尝试了MediaDevices API (mediaDevices.enumerateDevices),但这并没有显示屏幕设备的信息:

我担心我们不会在短期内获得这些信息,至少在没有征得用户同意的情况下是这样,因为浏览器供应商会不遗余力地阻止浏览器指纹(请参见amiunique.org的解释)。

如果可以将代码打包为电子应用,则可以访问所有需要的信息( API接口 )。

例如,电子REPL:

代码语言:javascript
复制
$ npx electron --interactive
> const { screen } = require('electron')
undefined
> screen.getAllDisplays()
[
  {
    id: 69733632,
    bounds: { x: 0, y: 0, width: 1440, height: 900 },
    workArea: { x: 0, y: 23, width: 1440, height: 877 },
    accelerometerSupport: 'unknown',
    monochrome: false,
    colorDepth: 30,
    colorSpace: '{primaries:SMPTEST432_1, transfer:IEC61966_2_1, matrix:RGB, range:FULL}',
    depthPerComponent: 10,
    size: { width: 1440, height: 900 },
    workAreaSize: { width: 1440, height: 877 },
    scaleFactor: 2,
    rotation: 0,
    internal: false,
    touchSupport: 'unknown'
  }
]

(我目前没有附加第二次显示)

使用bounds: { x: 0, y: 0, width: 1440, height: 900 } (和workArea: ...),您可以计算占据屏幕空间的元素的大小和位置,如菜单栏、工具栏或停靠。

如果您可以将代码打包到Chrome扩展中,则可以使用API接口getInfo()workArea

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62221409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档