我可以使用Global System Hooks来捕获单击的文件吗?

时间:2013-01-14 00:59:57

标签: c++ windows winapi

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

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

进一步研究http://www.codeproject.com/Articles/6362/Global-System-Hooks-in-NET,它是一个使用全局系统挂钩的小型c#/ c ++优秀应用程序,用于捕获坐标,点击等鼠标事件。

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

1 个答案:

答案 0 :(得分:4)

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

WH_MOUSE的{​​{1}}和WH_MOUSE_LL挂钩,或SetWindowsHookEx()发送的WM_INPUT消息,可以判断鼠标何时与之发生冲突,以及RegisterRawInputDevices()函数可以告诉您点击时鼠标光标在屏幕上的位置,但它无法告诉您点击的内容。你必须手动解决这个问题。

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

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

Shell编程是一个非常复杂的系统,而不是为了与之交互的虚假。所以你需要问问自己,为什么你首先需要这些信息?