InfoPath 揭秘 (一)
OK. 接下来, 我们要将Logic Inspector中的内容抓取出来. 下面的代码展示了如何获取IE控件中的内容. 在文章的附件中会有完整的代码.
- EnumWindows(new EnumWindowsProc(EvalWindow), IntPtr.Zero);
- foreach (IntPtr hwnd in ipHwnds)
- {
- StringBuilder sb = new StringBuilder(256);
- GetWindowText(hwnd, sb, 256);
- IntPtr hwndIPIE = IntPtr.Zero;
- IntPtr parentHwnd = hwnd;
- String className = String.Empty;
- while (!className.Equals("Internet Explorer_Server"))
- {
- EnumChildProc childProc = new EnumChildProc(EnumChildWindows);
- EnumChildWindows(parentHwnd, childProc, ref hwndIPIE);
- className = GetClassName(hwndIPIE);
- parentHwnd = hwndIPIE;
- }
- IHTMLDocument2 htmlDoc = IEDOMFromhWnd(hwndIPIE);
- String htmlText = htmlDoc.body.parentElement.outerHTML;
- StreamWriter sw = new StreamWriter(String.Format("d:\\{0}.html", sb.ToString()));
- sw.Write(htmlText);
- sw.Close();
- }
以下是从Logic Inspector 抓取的内容:
- <html>
- <head>
- <title>Logic Inspector</title>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta>
- </head>
- <frameset id="idframeset" framespacing="2" border="2" cols="50%,50%">
- <FRAME id=overallFrame src="res://1033\ipdsintl.dll/InspectorOverallFrames.html" scrolling=yes>
- <FRAME id=fieldFrame src="res://1033\ipdsintl.dll/InspectorFieldFrames.html" scrolling=yes>
- </frameset>
- </html>
很明显, Logic Inspector 由2个Frame组成: "overallFrame" 和 "fieldFrame". 从名字即可知道"overallFrame"指代Logic Inspector的左半部, "fieldFrame" 指代Logic Inspector的右半部.
如果你足够细心, 就会发现一个奇妙的地方. 这2个Frame的source居然是从一个dll中读取的. 而这个ipdsintl.dll就是揭开InfoPath 秘密的重点.
IPDSINTL.DLL -- InfoPath 的资源文件
首先我们要找到IPDSINTL.DLL到底在哪. 从它的上级目录"1033"来看, 这个文件应该在Microsoft Office文件夹下. 如我所料, 它确实是老老实实呆在这的:
%ProgramFiles%\Microsoft Office\Office12\1033\IPDSINTL.DLL
把这个DLL拖到Visual Studio中, 可以看到其实它是InfoPath重要的资源文件.
还记得2个frame的路径吗? 赶紧看看HTML文件夹下的内容吧:
在这里不仅找到了2个Frame的source, 还有InfoPath所用控件的定义. 接下来的任务就是修改相应的文件, 并且保存回DLL. 再用新的DLL覆盖原来的DLL. 相信这是每个程序员都能做的事, 我就不赘述了.
使用附件中的"INSPECTORFIELD.HTML"文件覆盖IPDSINTL.DLL相应的文件, 可以得到如下效果:
"Copy Text" 可以复制当前Logic Inspector 的文字内容至剪贴板.
"Copy HTML" 可以复制当前Logic Inspector 的HTML内容至剪贴板.
Conclusion
发现了IPDSINTL.DLL后, 我们不仅仅能修改Logic Inspector, 连InfoPath内置的控件也可以修改了. 接下来就需要大家发挥自己的想象力了~
转载于:https://blog.51cto.com/jimma/303734