【问题标题】:windows api - detect when file of certain type is openedwindows api - 检测何时打开某种类型的文件
【发布时间】:2014-01-10 14:24:07
【问题描述】:

是否可以在打开某种类型的文件时执行某些代码?就我而言,我想“监听”视频文件(“.avi、mp4 等”)何时打开(通过 Windows 文件资源管理器外壳,或者直接从视频播放器?),这样我就可以存储播放视频的历史记录。

一个小时的谷歌搜索没有任何结果,所以我求助于你的 stackoverflow。请指出正确的方向。

谢谢。

【问题讨论】:

  • 如果我在十六进制编辑器中打开视频文件,您也会添加到已播放视频的历史记录中???
  • @user2120666 是的,这对我的用例来说是可以接受的。
  • 所以挂钩 CreateFile 和/或 ShellExecute。
  • 谢谢@user2120666。我想我会尝试实现 IShellExecuteHook
  • 挂钩ShellExecute 只会捕获用户从Explorer 打开文件的情况。如果用户已经在媒体播放器中并且对文件执行文件/打开,它很可能看不到它。挂钩CreateFile 将捕获它们(尽管还有很多其他文件,因此开销会高得多)。

标签: windows winapi windows-shell


【解决方案1】:

从任意进程捕获文件系统事件(打开/读/写)的最佳(也是唯一合理的方法)是编写File System MiniFilter

如果您正在开发商业产品,请避免“挂钩”用户模式 ​​API,例如 CreateFile。这样做需要大量特定于平台的 hack,并且是一场兼容性噩梦。

【讨论】:

    【解决方案2】:

    我不会为这份工作勾搭 CreateFile。 Windows 具有内置机制,可以更干净地处理此类作业。

    处理此问题的简单方法是使用带有FILE_NOTIFY_CHANGE_LAST_ACCESS 标志的ReadDirectoryChangesW。任何时候打开一个文件,它的上次访问时间都会更新,因此它会告诉您文件打开的任何时间。

    虽然这种情况非常罕见,但在极少数情况下可能“错过”变化1。如果您必须有 100% 的准确率(而不是 99.9%),您可以改为阅读 change journals,但对于您可能不关心的优势,这是相当多的额外工作。


    1. 有一种情况(不一定)您可能会关心:ReadDirectoryChangesW 仅在/如果您的程序正在运行时才有效。即使您的代码根本没有运行,更改日志也会让您知道发生的事情。

    【讨论】:

    • 这不太可能适用于现代(Windows XP 后)风格的 Windows,因为出于性能原因,默认情况下禁用上次访问时间戳更新。
    • 我还要补充一点,NTFS 更改日志显然是特定于 NTFS 的,如果 OP 希望跟踪驻留在非 NTFS 卷上的文件的此类打开,则无济于事
    • 如果启用,最后访问时间戳会在相应文件 HANDLE 关闭时更新。打开文件时您不会收到通知。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2010-12-31
    • 2014-11-06
    相关资源
    最近更新 更多