日期:2014-05-18  浏览次数:20791 次

【WIN32API】监控发生复制操作的窗口(word、pdf reader等)当前打开的文件的路径
本人想完成这样的功能:
当在word 或者 PDF reader等程序打开的文件内进行复制(右键复制或者直接CTRL+C)操作时,找到当前程序打开的此活动文件的具体路径。
现在已经实现的:
1、我使用nextClipboardViewer = (IntPtr)SetClipboardViewer((int) this.Handle)监视剪贴板
2、当WndProc()接收到的m.Msg是WM_DRAWCLIPBOARD时,使用actHwnd = GetForegroundWindow();//当前活动窗口句柄(因为foxit pdf reader使用GetClipboardOwner() 返回的句柄为null,故使用了获取活动窗口的句柄)。
3、通过GetWindowThreadProcessId(actHwnd, out Pid) 和Process.GetProcessById(Pid) 得到了发生复制操作的窗体的线程和进程信息。
4、 myProcess.MainModule.FileName和myProcess.MainWindowTitle能得到程序的具体路径和窗体的名称,其中窗体的名称基本上就能得到打开文件的名字了,如xxxx.doc[兼容模式]等信息。

需要的:
因为我需要的是word等程序打开的当前活动的文件的路径,而想word、pdf等的一个进程都能打开好几个文件,我该怎么取获取当前的这个文件的路径。
我在网上找的思路,有说使用ZwQuerySystemInformation 枚举系统打开的所以句柄,然后使用ZwQueryInformationFile判断为文件型句柄,从而获取文件信息。
但是这方面的例子基本上都是c++写的,我只会c# ,不知道该怎么在c#里实现。所以在这里发帖希望能得到对api这方面比较熟悉的高手解难。

另外我想知道能不能直接得到属于某个进程或者线程的所有句柄,而不是枚举系统所有句柄,然后判断是不是文件型。
编程菜鸟,忘高手赐教

------解决方案--------------------
你不是菜鸟
这问题太难了
我还是吹吹水吧