大虾们请过来看看,又有疑难杂症了,来诊断诊断吧
在dll中有生成一个新的小窗口,希望当鼠标停下时,就把这个小窗口移到鼠标停下的位置。我的主程序是一个对话框,只有鼠标在这个主程序的对话框之内,能达到这个效果,但当鼠标移出对话框时停下来时,哪个小窗口就不动了,还是停在对话框之内,也就是说,哪个小窗口总是不大离开对话框范围。这是为什么?
下面是我的一部分代码请帮我看看:
//这是在dll中;这是系统鼠标钩子
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
passtime=0;
if (nCode<0)
return CallNextHookEx(hHook,nCode,wParam,lParam);
if (wParam==WM_MOUSEMOVE)
{
mPt=(MOUSEHOOKSTRUCT *)lParam;
MousePoint.x=mPt->pt.x;
MousePoint.y=mPt->pt.y;
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
//生成一个小窗口,这个小窗口是在主程序中注册窗口类的
void createwin(HINSTANCE hInstance)
{
globalhwnd1=CreateWindowEx(
WS_EX_TOPMOST,
MOUSE_POINT_WINDOW,
MOUSE_POINT_WINDOW,
WS_CLIPSIBLINGS | WS_POPUP ,
0, 0, 50,6,
NULL,
NULL,
hInstance,
NULL);
if (globalhwnd1==NULL)
{
MessageBox(0," createwin Error!","error",MB_OK);
return;
}
UINT nID = ::SetTimer(globalhwnd1, HOOK_TIMER, 500, TimerProc);
if (nID<0)
return;
ShowWindow(globalhwnd1,SW_SHOW);
UpdateWindow(globalhwnd1);
}
//这是小窗口的窗口函数
LRESULT CALLBACK MouseWndProc(HWND hWnd, UINT Message,
WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_CLOSE:
{
DestroyWindow(hWnd);
PostQuitMessage(0);
}
break;
default:
{
return DefWindowProc(hWnd, Message, wParam, lParam);
}
}
return 0L;
}
//这是定时器
void CALLBACK TimerProc(HWND hwnd, UINT msg, UINT idTimer, DWORD dwTime)
{
globalhwnd2=WindowFromPoint(MousePoint);
if (globalhwnd2==NULL)
MessageBox(0,"globalhwnd2 error","error",MB_OK);
if (passtime==-1) //当passtime=-1时,是由于在这个点上已经抓过词了,避免重复抓词
return;
passtime+=1;
if ((passtime>=2)&&(passtime<5)) //说明鼠标停在某处已经超过一秒了,就把小窗口移到鼠标位置上
{
SetWindowPos(globalhwnd1,HWND_TOPMOST,MousePoint.x,MousePoint.y,30,4,SWP_NOACTIVATE | SWP_SHOWWINDOW);
ShowWindow(globalhwnd1, SW_SHOW);
passtime=7;
}
}
********************************
但是为什么当鼠标移出对话框时鼠标停下,本应小窗口应该移到鼠标停下的位置。但其实并没有实现,这是为什么?但当鼠标在对话框内,能达到这种效果说明,这个程序并没有完全失败,但究竟问题出在那里呢?谢谢指教!
相关推荐
ARDOINO CH341驱动
ARDOINO CH341驱动,Nona最爱,国产板子便宜好用的代表
.NET配置文件读写实战:从XML到JSON的避坑指南
配置文件是应用程序运行时行为的核心控制机制,其本质是结构化数据的持久化与动态加载。理解配置模型的演进原理(如.NET Framework的ConfigurationManager与.NET Core的IConfiguration抽象)有助于规避兼容性陷阱;掌握JSON、XML等格式在注释支持、Schema校验、时区序列化等方面的工程差异,可提升部署稳定性;重视文件原子写入、并发控制、敏感信息加密等技术价值,能保障生产环境可靠性;典型应用场景包括微服务热更新、AB测试分流、金融系统合规配置等。本文聚焦.NET
.NET开发者专业能力进阶:稳定性、性能与架构的实战校准
在.NET开发中,‘专业’并非语法熟练或框架堆砌,而是对运行时稳定性、资源性能可预测性及架构副作用的深度掌控。理解ThreadPool饥饿、GC代际行为、EF Core跟踪查询开销等底层机制,是实现高可用服务的基础;掌握dotnet-counters、dotnet-trace、dotnet-dump等诊断工具链,则构成从开发到生产全链路可观测性的技术底座。本文聚焦.NET 6/7/8真实生产场景,覆盖WPF线程模型穿透、ASP.NET Core中间件顺序陷阱、Blazor WASM冷启动优化等高频痛点,提供
.NET配置系统演进与实战:从app.config到IConfiguration
配置管理是.NET应用运行时的核心基础设施,其本质是将外部参数安全、可扩展、可验证地注入程序生命周期。早期基于XML的ConfigurationManager采用静态单例模式,存在热更新失效、作用域污染和测试隔离难等问题;而.NET Core引入的IConfiguration则构建了可组合、可注入、不可变的管道式架构,支持JSON、环境变量、Key Vault等多源配置,并通过IOptions系列接口实现强类型绑定与动态监听。该机制不仅提升了微服务与云原生场景下的环境适应性,更成为金融、医疗等高合规系统实现
【Trans论文复现】基于Agent的电力市场深度决策梯度(深度强化学习)算法建模研究(Python代码实现)
内容概要:本文围绕《【Trans论文复现】基于Agent的电力市场深度决策梯度(深度强化学习)算法建模研究(Python代码实现)》展开,深入探讨了如何运用深度强化学习中的深度决策梯度方法对复杂电力市场环境进行建模与仿真。研究通过构建多智能体系统,模拟市场主体在电力市场中的博弈行为与优化决策过程,重点实现了智能体在动态市场环境下基于深度神经网络的策略学习机制。文中详细阐述了算法的理论基础、模型架构设计及Python代码实现路径,涵盖市场出清、竞价策略优化、资源配置等关键环节,强调对电力市场动态演化过程的精准刻画与预测能力,为复杂能源系统的智能化决策提供了可复现的技术范式。; 适合人群:具备一定Python编程基础和机器学习背景,从事电力系统、能源经济、智能优化等相关领域研究的研发人员或研究生。; 使用场景及目标:① 掌握深度强化学习在电力市场中的建模方法;② 学习多智能体系统在复杂博弈环境下的决策机制;③ 实现电力市场竞价、调度与资源配置的仿真分析与优化。; 阅读建议:建议读者结合文中提供的Python代码与仿真环境动手实践,深入理解算法细节与模型构建逻辑,同时可参考相关文献进一步拓展至其他能源市场应用场景。


