65.9K
CodeProject 正在变化。 阅读更多。
Home

KDE 鼠标模拟器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (24投票s)

2006年8月24日

MIT

4分钟阅读

viewsIcon

127295

downloadIcon

570

一个小应用程序,模拟 KDE 中鼠标的行为。

Sample Image - kdemouse.png

引言

这是一个模拟 KDE 鼠标行为的小应用程序。它使用了全局窗口挂钩和 WTL。

在 KDE(UNIX 操作系统的一个桌面环境)中,可以在不点击窗口边缘或通过菜单的情况下移动和调整窗口大小。要移动窗口,只需按住 ALT 键并按住鼠标左键,然后移动鼠标即可重新定位窗口。要调整窗口大小,请按住鼠标右键,然后通过移动鼠标来调整右下角的位置。

我选择不写一篇关于此工具的长篇文章,主要是因为我使用的技术已经在 Code Project 和其他地方涵盖过了。我主要利用的技术是 Windows 提供的挂钩机制。搜索 SetWindowsHookEx() 会给你提供大量关于该主题的资料。当你启动应用程序时,托盘区会出现一个图标。该图标是带有滚动轮的典型基础 Microsoft 鼠标的图像。你不会错过它。右键单击它可以选择启用、禁用、关于和退出。提供的 zip 文件包含源代码以及预编译的二进制文件。二进制文件已在发布模式下编译。

该应用程序只会操作具有 WS_THICKFRAME 样式的顶层窗口。因此,你的子窗口和不可调整大小的对话框是安全的。

附加功能

截至 2006 年 8 月 25 日的新功能

  • ALT 键和滚轮向上/向前滚动最大化窗口
  • ALT 键和滚轮向下/向后滚动恢复窗口
  • ALT 键和鼠标中键关闭窗口(发送 WM_CLOSE 消息)

截至 2006 年 8 月 28 日的新功能

  • ALT 键不再是硬编码的。现在可以配置 ALT、CTRL 和 SHIFT 的组合键
  • 正在调整大小或移动的窗口现在可以被激活(置于前台),如果应用程序已为此配置
  • 调整大小现在相对于鼠标光标所在的位置。如果你抓住左上角,窗口会通过移动该角来调整大小。抓住顶部中间,窗口会通过移动顶部边缘来调整大小。

买者自负

由于我使用了全局挂钩,杀毒软件可能会告诉你此应用程序是木马。虽然我声明它不是,但你可以自己检查 - 源代码在 zip 文件中。有一个小 bug,在大多数应用程序中你通常不会注意到。由于我在按下 ALT 键时“消耗”了鼠标点击,因此你无法在应用程序中使用此类组合。Photoshop 就是一个这样的应用程序 - 你将无法使用 ALT 键作为缩放的快捷方式。不过我正在考虑部分解决方案。计划是查看鼠标是否在 WM_xBUTTONDOWNWM_xBUTTONUP 之间移动。如果没有,我将重新生成第一个鼠标 WM_xBUTTONDOWN 消息,然后是 WM_xBUTTONUP。但这仍然无法帮助那些需要 ALT + 按钮 + 鼠标移动的应用程序。这种鼠标行为存在一定的成瘾风险。一旦你习惯了 KDE 鼠标,你就不会回头了(除非你是 Photoshop 用户)。

可改进之处

当然还有改进的空间。除了上面描述的“bug”之外,还有许多其他可以实现的事情。可配置性值得考虑:键绑定和“忽略列表”(让应用程序忽略 Photoshop 等应用)会很不错。虽然我对这个应用程序很满意,但我很乐意收到增强功能。

公共领域

此应用程序及其源代码特此置于公共领域。但是,应用程序附带的图标不属于公共领域。我对其不拥有版权。

参考文献

我使用了 Robert Edward Caldecott 出色的代码,用于轻松处理托盘图标和相关菜单。你可以在 这里 找到他的文章。

更新

  • 2006-08-25:根据 MrARSoft 的请求更新了源代码:移动或调整最大化窗口的大小时取消最大化
  • 2006-08-25:增加了附加功能 - 滚轮和鼠标中键
  • 2006-08-28:可配置性
  • 2006-09-30:新功能:吸附边缘。非常感谢 Thomas Freudenberg!

求助

在实现运行时配置应用程序的功能时,我发现了共享数据段的不良行为。看起来 POD(普通旧数据类型)在共享数据段中仅初始化一次。如果我声明 int x = 0x 只会被初始化一次 0。所有附加到 DLL 的其他进程都会看到 x 的当前状态。对于非 POD,你可能会观察到非常不同的行为。如果你在共享数据段中声明一个对象变量,似乎该对象的构造函数会为每个附加线程执行。要么是这样,要么对象根本就不被共享。如果你恰好知道发生了什么,我将非常感谢你在下面的留言板上留言。

我确实想出了一个解决这个小问题的办法,但它非常笨拙,我很想重写代码,而无需诉诸 C 风格的函数。

© . All rights reserved.