无法在Internet Explorer上绘制

时间:2009-12-17 22:39:04

标签: c# .net graphics gdi+

我有以下代码在另一个进程的主窗口上绘制一个正方形:

private void DrawOnWindow(string processname)
{
    IntPtr winhandle = GetWindowHandle(processname);
    Graphics grph = Graphics.FromHwnd(winhandle);
    grph.DrawRectangle(Pens.Red, 10, 10, 100, 100);
}

private IntPtr GetWindowHandle(string windowName)
{
    IntPtr windowHandle = IntPtr.Zero;
    Process[] processes = Process.GetProcessesByName(windowName);
    if (processes.Length > 0)
    {
        for (int i = 0; i < processes.Length; i++)
        {
            if (processes[i].MainWindowHandle.ToInt32() > 0)
            {
                windowHandle = processes[i].MainWindowHandle;
                break;
            }
        }
    }
    return windowHandle;
}

当我将“firefox”传递给DrawOnWindow方法时,这是有效的,但是当我传递“iexplore”并且我不明白为什么时它不起作用。我需要做些什么才能让它在Internet Explorer上运行? (IE8)

2 个答案:

答案 0 :(得分:2)

使用IE,您正在绘制的是父窗口,IE8具有WS_CLIPCHILDREN窗口样式集。您需要做的是下降窗口层次结构并确切地确定要渲染的子项,然后在该窗口上转到城镇。

答案 1 :(得分:1)

IE8有一个顶级进程,其中包含主窗口并绘制框架,地址栏和其他控件。 t还有几个子进程,它们拥有一个或多个选项卡及其相应的窗口。

您的代码将返回上一个Iexplore进程的顶级窗口的窗口句柄。但是,如果该过程恰好是子窗口,则存在两个问题:

  • 它没有顶级窗口;
  • 无法保证您当前的可见选项卡属于此过程。\

您需要为IE修改代码和特殊情况,以适应IE进程/窗口层次结构的具体情况。

顺便说一下,如果你决定在Chrome上绘图,你会遇到类似的问题,因为他们也会在这些流程中使用多个流程和窗口层次结构做类似的技巧。

相关问题