UnsafeNativeMethods.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / AccessibleTech / WAP / Automation / UIAutomationClient / MS / Win32 / UnsafeNativeMethods.cs / 1 / UnsafeNativeMethods.cs

                            //---------------------------------------------------------------------------- 
//
// 
//    Copyright (C) Microsoft Corporation.  All rights reserved.
//  
//
// 
// Description: Unsafe P/Invokes used by UIAutomation 
//
// History: 
//  05/29/2003 : [....] removed commented out code which wasn't very
//               useful. Will instead add in as-needed from our old Win32.cs
//               file.
// 
//---------------------------------------------------------------------------
 
using System.Threading; 
using System;
using System.Runtime.InteropServices; 
using System.Collections;
using System.IO;
using System.Text;
using Accessibility; 
using Microsoft.Win32.SafeHandles;
 
namespace MS.Win32 
{
 
    // This class *MUST* be internal for security purposes
    internal static class UnsafeNativeMethods
    {
        public static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); 

 
        // 
        // CloseHandle
        // 

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool CloseHandle(IntPtr handle);
 

        // 
        // OpenProcess 
        //
 
        public const int PROCESS_VM_READ = 0x0010;
        public const int PROCESS_DUP_HANDLE = 0x0040;
        public const int PROCESS_QUERY_INFORMATION = 0x0400;
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr OpenProcess( int dwDesiredAccess, bool fInherit, int dwProcessId ); 
 
        [DllImport("kernel32.dll")]
        public static extern void SetLastError(int dwErrCode); 

        //
        // SendInput related
        // 

        public const int VK_SHIFT    = 0x10; 
        public const int VK_CONTROL  = 0x11; 
        public const int VK_MENU     = 0x12;
 
        public const int KEYEVENTF_EXTENDEDKEY = 0x0001;
        public const int KEYEVENTF_KEYUP       = 0x0002;
        public const int KEYEVENTF_UNICODE     = 0x0004;
        public const int KEYEVENTF_SCANCODE    = 0x0008; 

        public const int MOUSEEVENTF_VIRTUALDESK = 0x4000; 
 
        [StructLayout(LayoutKind.Sequential)]
            public struct INPUT 
        {
            public int    type;
            public INPUTUNION    union;
        }; 

        [StructLayout(LayoutKind.Explicit)] 
            public struct INPUTUNION 
        {
            [FieldOffset(0)] public MOUSEINPUT mouseInput; 
            [FieldOffset(0)] public KEYBDINPUT keyboardInput;
        };

        [StructLayout(LayoutKind.Sequential)] 
            public struct MOUSEINPUT
        { 
            public int    dx; 
            public int    dy;
            public int    mouseData; 
            public int    dwFlags;
            public int    time;
            public IntPtr dwExtraInfo;
        }; 

        [StructLayout(LayoutKind.Sequential)] 
            public struct KEYBDINPUT 
        {
            public short  wVk; 
            public short  wScan;
            public int    dwFlags;
            public int    time;
            public IntPtr dwExtraInfo; 
        };
 
        public const int INPUT_MOUSE             = 0; 
        public const int INPUT_KEYBOARD          = 1;
 
        [DllImport("user32.dll", SetLastError = true)]
        public static extern int SendInput( int nInputs, ref INPUT mi, int cbSize );

        [DllImport("user32.dll", CharSet=CharSet.Auto)] 
        public static extern int MapVirtualKey(int nVirtKey, int nMapType);
 
        [DllImport("user32.dll", CharSet=CharSet.Auto)] 
        public static extern short GetAsyncKeyState(int nVirtKey);
 

        //
        // Hotkeys
        // 

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        public static extern bool RegisterHotKey( NativeMethods.HWND hWnd, int id, int fsModifiers, int vk ); 

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        public static extern bool UnregisterHotKey( NativeMethods.HWND hWnd, int id );


        // 
        // Foreground window
        // 
 
        [DllImport("user32.dll")]
        public static extern void SwitchToThisWindow(NativeMethods.HWND hwnd, bool fAltTab); 

        //
        // IAccessible / OLEACC / WinEvents
        // 

        public const int CHILDID_SELF             = 0; 
        public const int STATE_SYSTEM_UNAVAILABLE = 0x00000001; 
        public const int STATE_SYSTEM_FOCUSED     = 0x00000004;
        public const int OBJID_CARET              = -8; 
        public const int OBJID_CLIENT             = -4;
        public const int OBJID_MENU               = -3;
        public const int OBJID_SYSMENU            = -1;
        public const int OBJID_WINDOW             =  0; 

 
        [DllImport("oleacc.dll")] 
        public static extern int AccessibleObjectFromEvent (
            IntPtr hwnd, 
            int idObject,
            int idChild,
            ref IAccessible ppvObject,
            ref Object varChild ); 

        [DllImport("oleacc.dll")] 
        public static extern int WindowFromAccessibleObject ( IAccessible acc, ref IntPtr hwnd ); 

        [DllImport("oleacc.dll", SetLastError = true)] 
        internal static extern IntPtr GetProcessHandleFromHwnd(IntPtr hwnd);

        [DllImport("user32.dll")]
        internal static extern IntPtr SetWinEventHook(int eventMin, int eventMax, IntPtr hmodWinEventProc, NativeMethods.WinEventProcDef WinEventReentrancyFilter, uint idProcess, uint idThread, int dwFlags); 

        [DllImport("user32.dll")] 
        internal static extern bool UnhookWinEvent(IntPtr winEventHook); 

        private struct POINTSTRUCT 
        {
            public int x;
            public int y;
 
            public POINTSTRUCT(int x, int y)
            { 
                this.x = x; 
                this.y = y;
            } 
        }

        [DllImport("user32.dll", EntryPoint = "WindowFromPoint", ExactSpelling = true, CharSet = CharSet.Auto)]
        private static extern IntPtr IntWindowFromPoint(POINTSTRUCT pt); 

        [DllImport("user32.dll", EntryPoint = "WindowFromPhysicalPoint", ExactSpelling = true, CharSet = CharSet.Auto)] 
        private static extern IntPtr IntWindowFromPhysicalPoint(POINTSTRUCT pt); 

        public static IntPtr WindowFromPhysicalPoint(int x, int y) 
        {
            POINTSTRUCT ps = new POINTSTRUCT(x, y);
            if (System.Environment.OSVersion.Version.Major >= 6)
                return IntWindowFromPhysicalPoint(ps); 
            else
                return IntWindowFromPoint(ps); 
        } 

        // 
        // SendMessage and related
        //

        public const int SMTO_ABORTIFHUNG = 2; 

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        public static extern IntPtr SendMessageTimeout( 
            NativeMethods.HWND hwnd, int Msg, IntPtr wParam, IntPtr lParam, int flags, int uTimeout, out IntPtr pResult );
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr SendMessageTimeout(
            NativeMethods.HWND hwnd, int Msg, IntPtr wParam, ref MINMAXINFO lParam, int flags, int uTimeout, out IntPtr pResult );
 
        // Overload for use with WM_GETTEXT. StringBuilder is the type that P/Invoke maps to an output TCHAR*, see
        // see MSDN .Net docs on P/Invoke for more details. 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        public static extern IntPtr SendMessageTimeout(
            NativeMethods.HWND hwnd, int Msg, IntPtr wParam, StringBuilder lParam, int flags, int uTimeout, out IntPtr pResult); 


        public const int PM_REMOVE             = 0x0001;
 
        [StructLayout(LayoutKind.Sequential)]
        public struct MSG 
        { 
            public NativeMethods.HWND     hwnd;
            public int      message; 
            public IntPtr   wParam;
            public IntPtr   lParam;
            public int      time;
            public int      pt_x; 
            public int      pt_y;
        } 
 

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        public static extern int GetMessage(
            ref MSG msg, NativeMethods.HWND hwnd, int nMsgFilterMin, int nMsgFilterMax);

        [DllImport("user32.dll", CharSet=CharSet.Auto)] 
        public static extern bool PeekMessage(
            ref MSG msg, NativeMethods.HWND hwnd, int nMsgFilterMin, int nMsgFilterMax, int wRemoveMsg); 
 
        [DllImport("user32.dll", CharSet=CharSet.Auto)]
        public static extern bool TranslateMessage( 
            ref MSG msg);

        [DllImport("user32.dll", CharSet=CharSet.Auto)]
        public static extern IntPtr DispatchMessage( 
            ref MSG msg);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        public static extern bool PostMessage(
            NativeMethods.HWND hWnd, int nMsg, IntPtr wParam, IntPtr lParam); 


        //
        //  Messages and related structs / constants 
        //
 
        public const int WM_NULL                = 0x0000; 
        public const int WM_GETTEXT             = 0x000D;
        public const int WM_GETTEXTLENGTH       = 0x000E; 
        public const int WM_QUIT                = 0x0012;
        public const int WM_GETMINMAXINFO       = 0x0024;

            [StructLayout(LayoutKind.Sequential)] 
            public struct MINMAXINFO
            { 
                public NativeMethods.POINT ptReserved; 
                public NativeMethods.POINT ptMaxSize;
                public NativeMethods.POINT ptMaxPosition; 
                public NativeMethods.POINT ptMinTrackSize;
                public NativeMethods.POINT ptMaxTrackSize;
            };
 
        public const int WM_GETOBJECT           = 0x003D;
 
        public const int WM_NCHITTEST           = 0x0084; 

        public static readonly IntPtr HTTRANSPARENT = new IntPtr(-1); 
        public static readonly IntPtr HTCLIENT = new IntPtr(1);

        public const int WM_SYSCOMMAND          = 0x0112;
        public const int WM_MDIACTIVATE         = 0x0222; 

        public const int SC_SIZE                = 0xF000; 
        public const int SC_MOVE                = 0xF010; 
        public const int SC_MINIMIZE            = 0xF020;
        public const int SC_MAXIMIZE            = 0xF030; 
        public const int SC_CLOSE               = 0xF060;
        public const int SC_RESTORE             = 0xF120;

        public const int WM_HOTKEY              = 0x0312; 

        public const int LB_GETCURSEL = 0x0188; 
 

        // 
        // MsgWaitForMultipleObjects...
        //

        public const int QS_KEY = 0x0001, 
            QS_MOUSEMOVE = 0x0002,
            QS_MOUSEBUTTON = 0x0004, 
            QS_POSTMESSAGE = 0x0008, 
            QS_TIMER = 0x0010,
            QS_PAINT = 0x0020, 
            QS_SENDMESSAGE = 0x0040,
            QS_HOTKEY = 0x0080,
            QS_ALLPOSTMESSAGE = 0x0100,
            QS_MOUSE = QS_MOUSEMOVE | QS_MOUSEBUTTON, 
            QS_INPUT = QS_MOUSE | QS_KEY,
            QS_ALLEVENTS = QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY, 
            QS_ALLINPUT = QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE; 

        public const int INFINITE = unchecked((int)0xFFFFFFFF); 

        [DllImport("user32.dll", SetLastError = true)]
        public static extern int MsgWaitForMultipleObjects(int nCount, IntPtr[] handles, bool fWaitAll, int dwMilliseconds, int dwWakeMask);
 
        public const int WAIT_FAILED = unchecked((int)0xFFFFFFFF);
        public const int WAIT_TIMEOUT = 0x00000102; 
 
        //
        // Window Placement 
        //

        public const int WPF_SETMINPOSITION = 0x0001;
        public const int SW_RESTORE = 0x0009; 
        public const int SWP_NOACTIVATE = 0x0010;
 
        [StructLayout(LayoutKind.Sequential)] 
        public struct WINDOWPLACEMENT
        { 
            public int  length;
            public int  flags;
            public int  showCmd;
            public NativeMethods.POINT ptMinPosition; 
            public NativeMethods.POINT ptMaxPosition;
            public NativeMethods.RECT  rcNormalPosition; 
        }; 

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        public static extern bool SetWindowPlacement( NativeMethods.HWND hwnd, ref WINDOWPLACEMENT wp );

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool GetWindowPlacement( NativeMethods.HWND hwnd, ref WINDOWPLACEMENT wp ); 

 
        public const int SWP_NOSIZE = 0x0001; 
        public const int SWP_NOZORDER = 0x0004;
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern bool SetWindowPos(NativeMethods.HWND hWnd, NativeMethods.HWND hWndInsertAfter, int x, int y, int cx, int cy, int flags);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        internal static extern int MapWindowPoints(NativeMethods.HWND hWndFrom, NativeMethods.HWND hWndTo, [In, Out] ref NativeMethods.POINT pt, int cPoints);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        internal static extern int MapWindowPoints(NativeMethods.HWND hWndFrom, NativeMethods.HWND hWndTo, [In, Out] ref NativeMethods.RECT rc, int cPoints);
 
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool GetMenuBarInfo(IntPtr hwnd, int idObject, uint idItem, ref MENUBARINFO mbi);

        [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] 
        internal static extern int GetMenuState(IntPtr hMenu, int uId, int uFlags);
 
        internal const int MF_BYCOMMAND = 0x00000000; 
        internal const int MF_BYPOSITION = 0x00000400;
 
        internal const int MF_GRAYED = 0x00000001;
        internal const int MF_DISABLED = 0x00000002;

        [StructLayout(LayoutKind.Sequential)] 
        internal struct MENUBARINFO
        { 
            internal int cbSize; 
            internal NativeMethods.RECT rcBar;
            internal IntPtr hMenu; 
            internal NativeMethods.HWND hwndMenu;
            internal int focusFlags;
        }
 
        //
        // GDI 
        // 
        [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern bool DeleteObject(IntPtr hrgn); 

    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK