我正在为 Windows 图片查看器编写一个“附加组件”,需要向其发送命令(例如“显示下一个/上一个图像”)并获取当前所选图像的文件路径。我设法通过 SendMessage 实现发送命令,但我不知道如何从进程请求信息。这可能吗?
到目前为止,我只能从窗口标题中提取文件名,但这限制了只能使用一个文件夹,我需要完整路径。
[编辑]我做了一些搜索,发现(未记录?)可以使用函数 NTQuerySystemInformation 找到进程使用的所有句柄的列表(如此处所示 Delphi - 获取应用程序打开的文件)。
然而,问题是,那里提供的示例根本没有为我显示文件句柄(仅显示非硬盘设备句柄),而我在这里找到了工作示例 http://www.codeguru.com/Cpp/WP/system/processesmodules/article.php/c2827/,似乎图片查看器在从资源管理器启动时不持有任何预览文件的句柄。
I am writing an "add-on" for Windows Picture viewer that will need to send commands to it (like "Show next/previous image") and obtain file path to currently selected image. I managed to implement sending commands via SendMessage, but I don't know how to request info from a process. Is this possible?
So far I can only extract filename from window title, but this restricts usage to just one folder, I need the full path.
[EDIT] I did some search and found, that there's (undocumented?) possibility to find list of all handles used by process, using function NTQuerySystemInformation (As seen here Delphi - get what files are opened by an application).
The problem is, however, that the example provided there doesn't show file handles for me at all (only non-harddrive device handles), and while I found working example here http://www.codeguru.com/Cpp/W-P/system/processesmodules/article.php/c2827/, seems like Picture Viewer doesn't hold any handle to previewed file when launched from explorer.
发布评论
评论(2)
您可以获取进程“当前目录”(如 进程浏览器)。
看一下 使用Delphi获取另一个进程的命令行的两种方法 by RRUZ。
根据该文章,我们可以获取在
RTL_USER_PROCESS_PARAMETERS
(offset 36)结构中找到的CurrentDirectory
:以下是获取
CurrentDirectory 的方法:
You can get the Process "Current Directory" (as shown in Process Explorer).
Take a look at Two ways to get the command line of another process using Delphi by RRUZ.
Based on that article, we could get the
CurrentDirectory
found in theRTL_USER_PROCESS_PARAMETERS
(offset 36) structure:Here is how to obtain
CurrentDirectory
:您无法执行此操作,因为应用程序没有定义可根据请求提供该信息的 COM 接口。正如您所指出的,如果它在窗口标题中显示路径和文件名,您就可以获得它,但因为它没有显示该信息,所以该信息不可用。
You can't do this, as the application has no COM interfaces defined that would provide that info on request. You could get it if, as you've indicated, it displayed the path and filename in the window caption, but because it doesn't the information is unavailable.