C# 编写 Windows 动态桌面软件实现 - GIF图片桌面交互功能
C# 编写 Windows 动态桌面软件实现 - GIF图片桌面交互功能
DreamScene2 1.3 版本已经发布了,现在支持鼠标和桌面交互功能。这个功能不会影响性能,基本不占用 CPU。这个功能让我对 Windows 消息机制有了更深入的理解,在这篇博客中我会详细介绍实现方式。 欢迎 Star 和 Fork https://github.com/he55/DreamScene2 实现原理使用 WIN32 API SetWindowsHookEx 函数 Hook 鼠标键盘消息,在钩子处理函数中处理捕获鼠标键盘消息然后调用 PostMessage 函数向动态桌面窗口发送转发消息。 设置鼠标和键盘钩子函数的第一个参数是钩子类型,Hook 鼠标消息可以传 WH_MOUSE_LL,Hook 键盘消息可以传 WH_KEYBOARD_LL。第二个参数是自定义的钩子消息处理函数地址。函数的第三个参数是钩子函数所在的模块句柄,当钩子类型是 WH_MOUSE_LL 或者 WH_KEYBOARD_LL 时,可以直接传当前模块句柄。函数的第四个参数是线程 Id,传 NULL 捕获所有消息。 设置 Hook 代码。保存 SetWindowsHookEx 函数返回值,卸载 Hook 时需要
卸载 Hook 代码
编写钩子处理函数WH_MOUSE_LL 和 WH_KEYBOARD_LL 的钩子处理函数签名相同,wParam 参数是消息类型,lParam 参数是一个指针和钩子函数的类型有关。当钩子类型为 WH_MOUSE_LL 时 lParam 参数是 MSLLHOOKSTRUCT 结构体指针。当钩子类型为 WH_KEYBOARD_LL 时 lParam 参数是 KBDLLHOOKSTRUCT 结构体指针。 钩子处理函数签名
鼠标钩子处理函数
处理 WM_LBUTTONDOWN 鼠标按下消息鼠标钩子处理函数的 wParam 参数就是鼠标消息类型,lParam 参数需要转换成 MSLLHOOKSTRUCT 结构体指针,MSLLHOOKSTRUCT 结构体的 pt 字段鼠标相对于屏幕的坐标。想转发鼠标按下消息,需要看 WM_LBUTTONDOWN 消息的定义:WM_LBUTTONDOWN 消息的 wParam 参数为按键的状态,lParam 参数的低字节为光标的 x 坐标、高字节为光标的 y 坐标。需要注意鼠标钩子处理函数和 PostMessage 函数的 wParam 参数、lParam 参数含义不同,需要转换成 PostMessage 函数需要的参数。 WM_LBUTTONDOWN 处理方法
WM_LBUTTONUP 和 WM_MOUSEMOVE 处理方法一样
优化鼠标消息转发上面的代码会转发所有的鼠标消息,实际上并不想转发所有的鼠标消息。对鼠标按下和松开的消息,只转发焦点在桌面上的鼠标消息。 判断前台窗口是不是桌面
对鼠标移动的消息,转发鼠标在桌面上的鼠标移动消息。
完整的鼠标钩子处理函数代码
键盘钩子处理函数键盘钩子处理函数的 wParam 参数就是键盘消息类型,lParam 参数需要转换成 KBDLLHOOKSTRUCT 结构体指针。KBDLLHOOKSTRUCT 结构体中用到的有 scanCode 字段和 vkCode 字段。键盘消息 WM_KEYDOWN 和 WM_KEYUP 消息的 wParam 参数为 vkCode,lParam 参数的含义比较复杂。 WM_KEYDOWN 消息的 lParam 参数 bit 位说明
WM_KEYUP 消息的 lParam 参数 bit 位说明
完整的键盘钩子处理函数代码
所有代码https://github.com/he55/DreamScene2
参考文档:
开发应用-命令模式(C#实现POS收银功能) C# 实现条码图片自动生成功能 C#实现QQ/MSN等客户端聊天软件从右下角弹出窗体(Popup Window) [原创]C#植入友商网在线服务并实现同步用户注册接口(一) C# GridView列头添加CheckBox控件实现全选功能 C#实现DevExpress控件换肤功能 C#实现UDP穿透NAT(UDP打洞)完整版(原) C# 实现完整功能的截图控件(1)-实现绘图工具栏控件 C#.NET C/S结构版本自动升级解决方案之升级包实现 C# 使用cmd命令安装及卸载WCF Windows 服务 C#源码-Windows服务管理器,实现安装,卸载,启动和停止服务等功能 C#.NET扩展的动态对象支持动态属性和方法以及Json格式与对象互转 C# Winform 开发平台新功能 - C/S系统开发框架旗舰版V5.0 C# Winform软件快速开发框架|软件开发平台 - 界面多语言实现原理 C# Winform 使用SUM CASE WHEN实现动态列交叉数据报表
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |