新しいものを起動して既存の IE 10 インスタンスに接続する C# .NET 4 WinForms アプリ (MSHTML 7 を使用) があります。すべての画像を繰り返し処理し、それらをダウンロードして操作します。イメージはすでに IE によってダウンロードされているため、このアプローチは時間がかかり、冗長です。
私はどこでも検索しましたが、この件について議論しているフォーラムはほんの一握りですが、すべて mshtml.IHTMLImgElement オブジェクトを mshtml.IHTMLElementRender にキャストできます (C++ コードではあります)。
Unable to cast COM object of type 'mshtml.HTMLImgClass' to interface type 'mshtml.IHTMLElementRender'.
This operation failed because the QueryInterface call on the COM component for the interface with IID '{3050F669-98B5-11CF-BB82-00AA00BDCE0B}' failed due to the following error:
No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
もちろん、目的は完全なイメージにアクセスすることなので、別のアプローチも歓迎されます。上記の例外を引き起こしているコードは次のとおりです。
public static void Main (string [] args)
{
mshtml.HTMLDocument document = null;
SHDocVw.InternetExplorer explorer = null;
System.IntPtr hdc = System.IntPtr.Zero;
mshtml.IHTMLElementRender render = null;
mshtml._RemotableHandle handle = default(mshtml._RemotableHandle);
try
{
explorer = new SHDocVw.InternetExplorer();
explorer.Visible = true;
try
{
explorer.Navigate("http://www.google.com/ncr");
while (explorer.Busy)
{
// Striped events for SO example.
System.Threading.Thread.Sleep(100);
}
document = (mshtml.HTMLDocument) explorer.Document;
foreach (mshtml.IHTMLImgElement image in document.images)
{
Console.WriteLine();
if ((image.width > 0) && (image.height > 0))
{
// The following [if] will return false if uncommented.
//if (image.GetType().GetInterfaces().ToList().Contains(typeof(mshtml.IHTMLElementRender)))
{
using (Bitmap bitmap = new Bitmap(image.width, image.height))
{
using (Graphics graphics = Graphics.FromImage(bitmap))
{
hdc = graphics.GetHdc();
handle.fContext = hdc.ToInt32();
render = (mshtml.IHTMLElementRender) image; // Causes the exception.
//handle = (mshtml._RemotableHandle) Marshal.PtrToStructure(hdc, typeof(mshtml._RemotableHandle));
render.DrawToDC(ref handle);
graphics.ReleaseHdc(hdc);
// Process image here.
Console.Write("Press any key to continue...");
Console.ReadKey();
}
}
}
}
}
}
catch (System.Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Stack Trace: " + e.StackTrace);
}
explorer.Quit();
}
catch (System.Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Stack Trace: " + e.StackTrace);
}
finally
{
}
#if (DEBUG)
Console.WriteLine();
Console.Write("Press any key to continue...");
Console.ReadKey();
#endif
}
私が役に立たなかったリンクのいくつか: