Hello,

I am trying to convert an object to IntPtr so that I can pass it to the Win32 function GetWindowRect. I have used the code below, but my program just hangs

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
       static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
     public int Left;
     public int Top;
     public int Right;
     public int Bottom;
}

RECT rct;
IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(IE));
Marshal.StructureToPtr(IE, pt, true);
GetWindowRect(pt, out rct);

IE is of type object

Hope someone can help
Thanks

Recommended Answers

All 2 Replies

This works fine:

[DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
      public int Left;
      public int Top;
      public int Right;
      public int Bottom;
    }


    private void button1_Click(object sender, EventArgs e)
    {
      RECT rct;
      bool b = GetWindowRect(this.Handle, out rct);
      System.Diagnostics.Debugger.Break();
    }

I changed ref RECT lpRect to out RECT lpRect . You need to declare it with "out" and not "ref". Also what is IE? You said it is an "object" but the first parameter of the win32 should be a window handle.

This works fine:

[DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
      public int Left;
      public int Top;
      public int Right;
      public int Bottom;
    }


    private void button1_Click(object sender, EventArgs e)
    {
      RECT rct;
      bool b = GetWindowRect(this.Handle, out rct);
      System.Diagnostics.Debugger.Break();
    }

I changed ref RECT lpRect to out RECT lpRect . You need to declare it with "out" and not "ref". Also what is IE? You said it is an "object" but the first parameter of the win32 should be a window handle.

IE is SHDocVw.InternetExplorer.
I am using the DocumentComplete event which only allows you to access an instance of Internet Explorer as an object (and the URL of the loaded document).

I want to convert the object to an IntPtr without having to use FindWindow to get the handle of the Internet Explorer window.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.