winapi - 如何检测鼠标悬停在窗口的非客户端部分?
问题描述
我有一个使用 Direct3D 9 绘制到大约 60hz 的客户区的程序,并且鼠标正在干扰,所以我只想在它穿过客户区时摆脱它。
我认为系统调用ShowCursor(false)
时调用WM_MOUSEMOVE
和调用ShowCursor(true)
会WM_NCMOUSEMOVE
起作用,但这会导致行为不佳。
所以我发现这TrackMouseEvent()
可以完成这项工作,但我用以下方式调用它:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static bool g_fMouseTracking = false;
switch (message)
{
case WM_MOUSEMOVE:
if (!g_fMouseTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_NONCLIENT;
tme.dwHoverTime = HOVER_DEFAULT;
tme.hwndTrack = hWnd;
g_fMouseTracking = TrackMouseEvent(&tme);
}
break;
case WM_NCMOUSEHOVER:
ShowCursor(true);
break;
...
并且WM_NCMOUSEHOVER
永远不会被调用。我不知道为什么。
无论如何,这只是一段代码,做我想做的事我知道我需要更多的代码,但如果它没有调用WM_NCMOUSEMOVE
我就不能开始做更高级的鼠标悬停技巧。
解决方案
当您要跟踪时,WM_NCMOUSEHOVER
您必须使用TrackMouseEvent
in WM_NCMOUSEMOVE
。
推荐阅读
- java - Java Spring 4.2.5 Guava Cache 无法添加额外的@Cacheable 注解
- python - 如何解决“urllib2.URLError:
" - db2 - Sqoop 导出 DB2 更新密钥
- python - Tensor MNIST 教程 - cross_entropy 计算
- delphi - 在 Delphi 上使用 Indy 时如何忽略 EIdConnClosedGracefully?
- openmdao - 设计变量的 FD 步骤和缩放之间的差异
- javascript - 如何使用 chart.js 为折线图绘制圆边
- java - Android 活动仅在它们呈现的数据上有所不同
- c# - ASP.NET 和 IIS 模拟不起作用
- java - 将布尔数组从 C 返回到 Java