gpt4 book ai didi

c# - 获取 WM_NCHITTEST 消息的坐标?

转载 作者:太空狗 更新时间:2023-10-29 19:49:21 27 4
gpt4 key购买 nike

如何在 C# 代码中获取 WM_NCHITTEST 消息的坐标?
我希望获得最快的方式,因为性能是一项要求。

最佳答案

直到今天早上,我都会 100% 同意 Thomas Levesques 的回答,我从 msdn 中提取了相同的信息并且代码(看起来)运行完美。但是,有一种情况会咬到你,我今天下午花了三个小时才找到原因。

我的症状是,在我的一台开发机器上,在 VS2010 IDE 中,当我在某个 y 位置单击它时,只能通过单击来选择我的控件。表单顶部的非常小的控件根本无法通过单击来选择。不可点击区域的大小看起来与 Windows 窗体设计器周围的 IDE 大小相同,所以起初我以为我有一些奇怪的鲜为人知的 DesignMode 问题。最令人困惑的一点是,完全相同的项目(在另一台机器上从 TFS checkout )不会显示此行为。

这是发生了什么:

考虑你有一个双显示器设置,如下所示(抱歉是德语屏幕截图,我手头没有英语操作系统):

Double monitor setup

如您所见,显示器 2 的左上角位于坐标 (1280, -256) 处。如果您使用上面显示的解决方案,如果鼠标确实位于 -30,您将得到类似 65505 的 y。这是因为位置存储为 LParam 的高位和低位 WORD。因此,执行 (lParam.ToInt32() & 0xFFFF0000) >> 16 将为您提供 y 位置的正确位。但是,将其转换为 int 会产生 65505,因为您正在转换为错误的数据类型。

解决方法:

int x = (short)(lParam.ToInt32() & 0x0000FFFF);
int y = (short)((lParam.ToInt32() & 0xFFFF0000) >> 16);
Point pos = new Point(x, y);

转换为 short 可为您提供正确的位置值。我也转换了 x,因为您可以按照第二个显示器位于主显示器左侧的方式安排您的显示器,因此 x 位置会有同样的问题。

我最近发现 Point 的构造函数之一将为您工作。所以,简短的版本是:

Point pos = new Point(lParam.ToInt32());

关于c# - 获取 WM_NCHITTEST 消息的坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4471231/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com