Mfc DPI缩放完成后,GET_X_LPARAM()与GetCursorPos()有何不同?

Mfc DPI缩放完成后,GET_X_LPARAM()与GetCursorPos()有何不同?,mfc,windows-10,dpi,system-tray,trayicon,Mfc,Windows 10,Dpi,System Tray,Trayicon,我有一个创建windows托盘图标的应用程序。当用户右键单击它时,将显示关联菜单。在控制面板完成DPI缩放之前,应用程序工作正常。例如,当DPI缩放设置为150%(登录时缩放值)时,关联菜单将正确显示,但当我将DPI缩放更改为125%(不注销并再次登录-注销并再次登录后,他们同意)时,关联菜单将被替换,并显示在远离托盘图标的位置。如果我使用GetCursorPos()而不是GET_X_LPARAM(wParam)和GET_Y_LPARAM(wParam)来获取鼠标坐标,则不会发生这种情况 关于n

我有一个创建windows托盘图标的应用程序。当用户右键单击它时,将显示关联菜单。在控制面板完成DPI缩放之前,应用程序工作正常。例如,当DPI缩放设置为150%(登录时缩放值)时,关联菜单将正确显示,但当我将DPI缩放更改为125%(不注销并再次登录-注销并再次登录后,他们同意)时,关联菜单将被替换,并显示在远离托盘图标的位置。如果我使用
GetCursorPos()
而不是
GET_X_LPARAM(wParam)
GET_Y_LPARAM(wParam)
来获取鼠标坐标,则不会发生这种情况

关于
notifyiconda
()数据结构的MSDN文档说,
GET_X_LPARAM(wParam)
和GET_Y_PARAM(wParam)
,在处理
uCallbackMessage
的回调函数中,应该给出
鼠标右键的X和Y坐标(用于调用托盘图标的上下文菜单)。当以上述方式更改DPI时,不会发生这种情况。
GetCursorPos()
但是会继续提供正确的值

我觉得他们应该总是报告相同的值

编辑1-假设鼠标右键单击后没有移动,在这种情况下,两个鼠标应给出相同的坐标

编辑2-复制(有关复制错误的信息)

看看下面的开源项目。 在中,我添加了以下代码行来打印GET_X_LPARAM()和GetCursorPos()返回的值(在中突出显示了代码)

运行时,程序Picotorrent会创建一个托盘图标。当用户右键单击托盘图标时,单击时鼠标指针位置会显示一个上下文菜单。现在,要显示上下文菜单,可以使用GET_X_LPARAM(wParam)和GET_Y_LPARAM(wParam)获取单击的X、Y坐标

请参阅以下屏幕截图,其中显示了上下文菜单在不同DPI缩放值下相对于托盘图标的位置

下图显示了DPI缩放为150%时上下文菜单的位置。这是我登录系统时的DPI缩放值

下图显示了DPI比例更改为125%时上下文菜单的位置。请注意,windows告诉我注销,然后重新登录。但是,因为我们这里的任务是研究为什么GET_X_LPARAM()和GetCursorPos()显示的值不相同(无论是对是错,都无所谓)。另外,请注意,上下文菜单不再显示在托盘图标附近。请记住,这里我使用GET_X_LPARAM(wParam)和GET_Y_LPARAM(wParam)来获取用于显示菜单的X和Y坐标,而不是GetCursorPos()

现在,让我们在调试器的输出窗口中查看输出

[wParam      :(x,y)=(1539,1045)]
[GetCursorPos:(x,y)=(1539,1045)]


[wParam      :(x,y)=(1606,1054)]
[GetCursorPos:(x,y)=(1927,1265)]
另外,请参见下面的屏幕截图


从输出中,我们可以清楚地看到最初的GET_X_LPARAM()和GetCursorPos()在坐标值上达成一致,但当缩放值改变时,它们就不一样了。

GetCursorPos将返回鼠标光标的当前位置。从LPRAM中提取它将返回消息发送时鼠标光标的位置。因此,它们不同是有道理的,但GET_X_LPRAM应该是wo对于你来说,DPI不应该有什么区别。如果操作系统对DPI撒谎,它应该在两种情况下撒谎。考虑发布RePro代码。HMM,不,这不可能是正确的。125%和150%之间的差异可以用一种叫做“WindowsXP风格DPI缩放”的旧Windows版本来解释。。当它打开时,Windows不会对125%的DPI进行缩放,而是对更高的值进行缩放。一定要完成这一点,并将你的应用程序声明为dpiAware,这样操作系统就不必撒谎。@CodyGray-这正是我的困惑所在,要么Windows应该在这两种情况下都撒谎,要么不应该在这两种情况下都撒谎。是的,我将发布复制代码,同时发布relivant屏幕截图解释了正在发生的事情。@HansPassant-“Windows XP风格的DPI缩放”-我必须阅读相关内容。之后我会给你回复。@CodyGray:我添加了复制和一些相关图像。
[wParam      :(x,y)=(1539,1045)]
[GetCursorPos:(x,y)=(1539,1045)]


[wParam      :(x,y)=(1606,1054)]
[GetCursorPos:(x,y)=(1927,1265)]