【发布时间】:2015-01-24 18:53:24
【问题描述】:
我正在编写一个 C# 程序,它侦听文件资源管理器中按下的空格。当按下空格时,我创建一个 WPF 窗口,在 WPF 窗口中显示所选文件。
唯一的问题是,当有人在编辑文件名并为文件名中的空格按下空格时,也会调用此文件 Preview。
有没有办法检测用户是否正在重命名文件?
附加信息:
我知道我可以听 F2,但也可以通过鼠标左键单击两次或右键单击文件并选择重命名来开始重命名文件。所以这不是一个好的解决方案。
技术信息(如果需要):
我使用 GetForegroundWindow 来检查前景中的窗口是否是资源管理器窗口。然后我使用 Hooks 在前台的资源管理器进程中监听按下的键。
要获得选定的项目,我使用 SHDocVw 和 Shell32
Shell32.FolderItems selectedItems = ((Shell32.IShellFolderViewDual2) window.Document).SelectedItems();
【问题讨论】:
-
澄清一下,您正在尝试构建一个类似于 Mac OS X 上的 Finder 的 windows 文件预览功能,即在选择文件时按空格会弹出预览窗口?
-
是的,这正是我所做/所做的。
-
Explorer 已经有一个使用 ALT+P 切换的预览窗格。您是否尝试修改快捷方式的行为?
-
一个想法:你到底是如何与按键挂钩的?全局挂钩?你能分享那个代码吗?对于每次击键通知,您应该获得每次击键发生的控件的窗口句柄 (
HWND/IntPtr)。您必须检查每个此类HWND的窗口类并验证它属于列表视图(资源管理器视图)而不是文本框(文件重命名框)。 -
从
SetWindowsHookEx的 MSDN 文档中,您似乎无法获得使用 @ 时生成事件的焦点子控件的HWND987654329@。也许WH_CALLWNDPROC或WH_CALLWNDPROCRET会在您的场景中为您提供更好的服务。但是,请查看 CodeProject 上的这篇文章,它应该提供一些关于如何使用当前代码解决问题的指导:Control in Focus in Other Processes。