Search
Module:
Directory

   Desktop Functions:

   Smart Device Functions:


Show Recent Changes
Subscribe (RSS)
Misc. Pages
Comments
FAQ
Helpful Tools
Playground
Suggested Reading
Website TODO List
Download Visual Studio Add-In

GetWindowInfo (user32)
 
.
Summary

C# Signature:

[DllImport("user32.dll")]
static extern bool GetWindowInfo(IntPtr hwnd, ref WINDOWINFO pwi);

VB Signature:

Public Declare Auto Function GetWindowInfo Lib "user32" _
(ByVal hwnd As IntPtr, ByRef pwi As WINDOWINFO) As Boolean

VB.Net Signature:

<DllImport("User32.dll")> _
Public Function GetWindowInfo(ByVal hwnd As IntPtr, ByRef pwi As WINDOWINFO) As Boolean
End Function

User-Defined Types:

None.

Notes:

You must assign the cbSize parameter prior to calling GetWindowInfo(). For example:

In C#

    WINDOWINFO info = new WINDOWINFO();
    info.cbSize = (uint)Marshal.SizeOf(info);
    GetWindowInfo(Handle, ref info);

In VB

    Dim instance As Process
    Dim info As New WINDOWINFO
    info.cbSize = Convert.ToUInt32(Marshal.SizeOf(info))

To get a WINDOWINFO see http://pinvoke.net/default.aspx/Structures.WINDOWINFO

* WARNING * The size of this (http://pinvoke.net/default.aspx/Structures.WINDOWINFO) structure is 96 bytes, while what the function expects is 60 bytes. The structure format is wrong.

The correct structure format is as follows:

    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct tagWINDOWINFO
    {
        /// DWORD->unsigned int
        public uint cbSize;

        /// RECT->tagRECT
        public tagRECT rcWindow;

        /// RECT->tagRECT
        public tagRECT rcClient;

        /// DWORD->unsigned int
        public uint dwStyle;

        /// DWORD->unsigned int
        public uint dwExStyle;

        /// DWORD->unsigned int
        public uint dwWindowStatus;

        /// UINT->unsigned int
        public uint cxWindowBorders;

        /// UINT->unsigned int
        public uint cyWindowBorders;

        /// ATOM->WORD->unsigned short
        public ushort atomWindowType;

        /// WORD->unsigned short
        public ushort wCreatorVersion;
    }

with tagRECT being:

    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct tagRECT
    {

        /// LONG->int
        public int left;

        /// LONG->int
        public int top;

        /// LONG->int
        public int right;

        /// LONG->int
        public int bottom;
    }

* UPDATE * The proposed "fixed" structure above is the same. The difference is in the fact that the default packing size in managed code is 8 bytes, while the default packing in unmanaged code is 4 bytes. So, when marshalled to the API, the struct size is 60.

By the way, the StructLayoutAttribute is optional, because the C# compiler applies by default the Sequential layout kind on structures (but not on classes).

Tips & Tricks:

Note that the members of the RECT structure should be int, not long. In some other API functions they are long, so this can be confusing.

Sample Code:

Please add some!

Alternative Managed API:

Do you know one? Please contribute it!

Documentation

Please edit this page!

Do you have...

  • helpful tips or sample code to share for using this API in managed code?
  • corrections to the existing content?
  • variations of the signature you want to share?
  • additional languages you want to include?

Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).

 
Access PInvoke.net directly from VS:
Terms of Use
Find References
Show Printable Version
Revisions