我是Windows编程的新手,主要完成Java(Java SE,Java ME,Android,Java EE),所以要细致而温和。
我想捕获“在窗口中单击的文件/路径的名称,例如单击桌面上的文件”?
进一步研究http://www.codeproject.com/Articles/6362/Global-System-Hooks-in-NET,它是一个使用全局系统挂钩的小型c#/ c ++优秀应用程序,用于捕获坐标,点击等鼠标事件。
那么在文件图标上捕获事件的API或全局系统挂钩是什么?
答案 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编程是一个非常复杂的系统,而不是为了与之交互的虚假。所以你需要问问自己,为什么你首先需要这些信息?