没有单一的 API 可以提供这种详细程度。
的WH_MOUSE
和WH_MOUSE_LL
钩子SetWindowsHookEx()
,或者由WM_INPUT
传递的消息RegisterRawInputDevices()
,可以告诉你鼠标何时被交互,该GetCursorPos()
函数可以告诉你点击时鼠标光标在屏幕上的位置,但它不能告诉你它在点击什么上。你必须手动弄清楚。
例如,Desktop 是作为 ListView 控件实现的,因此可以使用WindowFromPoint()
andGetDesktopWindow()
函数来检查鼠标是否位于与桌面窗口本身而不是应用程序窗口对应的坐标处,如果是,则使用LVM_HITTEST
andLVM_GETITEM
消息来确定单击桌面上的哪个图标并提取其显示文本。然后使用SHGetDesktopFolder()
函数和IShellFolder
接口或SHParseDisplayName()
函数来解析该文本并查看它是否返回PIDL
表示路径/文件的 a,如果是,则使用SHGetPathFromIDList()
获取实际路径/文件名。
如果你想用 Windows Explorer 应用程序做同样的事情,它会变得有点复杂。使用WindowFromPoint()
、GetWindowThreadProcessId()
、OpenProcess()
和EnumProcessModules()
确定鼠标是否位于 Windows 资源管理器应用程序上。但是,它的 UI 从 Windows 版本更改为下一个版本,但要点是您必须通过AttachThreadInput()
and手动定位焦点控件GetActiveWindow()
,检查它是否是 TreeView/ListView 控件,如果是,则使用特定于控件的消息来获取有关鼠标光标坐标下方的项目/图标的信息,并IShellFolder
再次用于确定该项目/图标的文本实际代表什么。
Shell 编程是一个非常复杂的系统,不适合虚心进行交互。所以你需要问自己,为什么你首先需要这些信息?