2

我是 Windows 编程新手,主要完成 Java(Java SE、Java ME、Android、Java EE),所以要详细而温和。

我想捕获“在 Windows 中单击的文件/路径的名称,例如单击桌面上的文件”?

进一步研究http://www.codeproject.com/Articles/6362/Global-System-Hooks-in-NET,这是一个小的 c#/c++ 不错的应用程序,它使用 Global System Hooks 来捕获坐标、点击等鼠标事件,ETC。

那么捕获文件图标事件的正确 API 或全局系统挂钩是什么?

4

1 回答 1

4

没有单一的 API 可以提供这种详细程度。

WH_MOUSEWH_MOUSE_LL钩子SetWindowsHookEx(),或者由WM_INPUT传递的消息RegisterRawInputDevices(),可以告诉你鼠标何时被交互,该GetCursorPos()函数可以告诉你点击时鼠标光标在屏幕上的位置,但它不能告诉你它在点击什么上。你必须手动弄清楚。

例如,Desktop 是作为 ListView 控件实现的,因此可以使用WindowFromPoint()andGetDesktopWindow()函数来检查鼠标是否位于与桌面窗口本身而不是应用程序窗口对应的坐标处,如果是,则使用LVM_HITTESTandLVM_GETITEM消息来确定单击桌面上的哪个图标并提取其显示文本。然后使用SHGetDesktopFolder()函数和IShellFolder接口或SHParseDisplayName()函数来解析该文本并查看它是否返回PIDL表示路径/文件的 a,如果是,则使用SHGetPathFromIDList()获取实际路径/文件名。

如果你想用 Windows Explorer 应用程序做同样的事情,它会变得有点复杂。使用WindowFromPoint()GetWindowThreadProcessId()OpenProcess()EnumProcessModules()确定鼠标是否位于 Windows 资源管理器应用程序上。但是,它的 UI 从 Windows 版本更改为下一个版本,但要点是您必须通过AttachThreadInput()and手动定位焦点控件GetActiveWindow(),检查它是否是 TreeView/ListView 控件,如果是,则使用特定于控件的消息来获取有关鼠标光标坐标下方的项目/图标的信息,并IShellFolder再次用于确定该项目/图标的文本实际代表什么。

Shell 编程是一个非常复杂的系统,不适合虚心进行交互。所以你需要问自己,为什么你首先需要这些信息?

于 2013-01-14T22:24:56.160 回答