假设的应用场景:
当hook住鼠标按钮被按下的事件时, 要先执行鼠标按钮被按下的自定义处理,再转到处理鼠标被按下的事件.
假设自定义处理为: 将鼠标光标所在的按钮禁止和隐藏.
实现流程:
* 得到鼠标光标所在位置的子窗体句柄, 判断该子窗体(窗口类名,窗口文本, 窗口风格...)是否是我们要处理的按钮.
* 如果是要处理的按钮, 再判断该鼠标是按下还是弹出菜单, 如果鼠标为按下, 才去执行自定义处理.
这时遇到的问题是, 用户有可能交换了鼠标的左右键. 如果没交换鼠标左右键, 鼠标左键是按下的动作, 鼠标右键是弹出菜单.
在msdn上有个例子,可以解决"鼠标左右键是否已经交换"的问题~
- /// @file testMouseSwap.cpp
- /// @brief 判断鼠标键是否被用户设置成"左右键交换"
- #include "stdafx.h"
- #include <Windows.h>
- #include <tchar.h>
- /// @fn IsMouseSwap
- /// @brief 测试鼠标左右键是否已经交换
- /// @param void
- /// @return boolen, true = 鼠标左右键已经交换, false = 鼠标左右键没有交换
- /// @note 如果鼠标左右键没有交换, 鼠标左键是按下, 鼠标右键是弹出菜单
- bool IsMouseSwap();
- int _tmain(int argc, _TCHAR* argv[])
- {
- _tprintf(L"IsMouseSwap = %s\n", IsMouseSwap() ? L"TRUE" : L"FALSE");
- /** operating results
- IsMouseSwap = FALSE
- */
- /// @note 交换"鼠标左右键"之后的实验已经做过, IsMouseSwap()有效
- getchar();
- return 0;
- }
- bool IsMouseSwap()
- {
- int iRc = 0;
- iRc = GetSystemMetrics(SM_MOUSEPRESENT);
- if(0 == iRc)
- return false; ///< 鼠标没安装
- iRc = GetSystemMetrics(SM_SWAPBUTTON);
- return (0 == iRc) ? false : true;
- }