我希望在我的应用程序/游戏的主循环中获取光标位置。
从做一些研究来看,似乎有两种方法可以做到这一点: 首先侦听WM_MOUSEMOVE事件并检查 lParam。 其次使用 GetCursorPos(),然后使用 ScreenToClient() 跟进它。
我有一个设置为 1680x1050 的窗口,但是当查看来自任一方法的数据时,我最终在窗口的最右侧得到的值约为 1660。
我找不到任何资源来解释为什么会发生这种情况,我想知道它是否与窗口创建有关?
这是我用来为应用程序创建窗口的代码
//Register the window class
WNDCLASS windowClass;
windowClass = {};
windowClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = handleWindowMessages;
windowClass.hInstance = hInstance;
windowClass.hCursor = LoadCursor(nullptr, IDC_ARROW);
windowClass.lpszClassName = L"D3D11 Rendering";
if (!RegisterClass(&windowClass))
{
return 0;
}
//Create the window
HWND windowHandle
= CreateWindowEx(0,
windowClass.lpszClassName,
L"D3D11 Rendering",
(WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME) | WS_VISIBLE, //According to stackoverflow.com WS_OVERLAPPEDWINDOW ^ (XOR) WS_THICKFRAME will prevent window resizing
CW_USEDEFAULT,
CW_USEDEFAULT,
gResolutionX,
gResolutionY,
0, 0, hInstance, 0);
然后在主循环中,我正在执行以下操作:
POINT p;
GetCursorPos(&p);
ScreenToClient(windowHandle, &p);
任何指示、提示或信息将不胜感激。
编辑:应用程序窗口未最大化和/或超过任务栏。在 x 和 y 轴上都出现问题。我注意到顶部的标题栏将 y 位置保持在 0,而光标位于其中。有没有办法进入屏幕的可渲染区域?使用我希望游戏运行的分辨率创建窗口时,我希望中间的位(不确定实际术语 - 没有边框和标题栏的位)与分辨率匹配。
窗口内的区域(不包括标题栏和边框等)称为工作区。WM_MOUSEMOVE
消息将为您提供工作区中的坐标,该坐标将位于该内部部分左上角的 (0, 0)。
GetCursorPos
将返回屏幕空间中的鼠标光标位置(因此您对ScreenToClient
的调用是正确的)。由于窗口没有最大化,并且您仍在指定边框(WS_OVERLAPPEDWINDOW
定义为WS_OVERLAPPED | WS_THICKFRAME | etc...
,并且您正在删除WS_THICKFRAME
但WS_OVERLAPPED
仍然包含边框),我的猜测是窗口的布局,包括边框,将吞噬额外的 20 像素。如果创建全屏无边框窗口(如此大小和位置以填充屏幕,并且仅使用WS_POPUP
样式),则应看到工作区填充了可用空间。