Csharp/C Sharp/Windows/Windows API

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

BitBlt

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; public class Form1 : Form {

   const int SRCCOPY = 0xcc0020;
   [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
   private static extern int BitBlt(
     IntPtr hdcDest,     // handle to destination DC (device context)
     int nXDest,         // x-coord of destination upper-left corner
     int nYDest,         // y-coord of destination upper-left corner
     int nWidth,         // width of destination rectangle
     int nHeight,        // height of destination rectangle
     IntPtr hdcSrc,      // handle to source DC
     int nXSrc,          // x-coordinate of source upper-left corner
     int nYSrc,          // y-coordinate of source upper-left corner
     System.Int32 dwRop  // raster operation code
     );
   public Form1() {
       InitializeComponent();
   }
   private void Form1_Paint(object sender, PaintEventArgs e) {
       Graphics g = e.Graphics;
       g.FillRectangle(Brushes.White, ClientRectangle);
       g.DrawRectangle(Pens.Black, 10, 10, 40, 40);
       IntPtr dc = g.GetHdc();
       BitBlt(dc, 70, 0, 60, 60, dc, 0, 0, SRCCOPY);
       g.ReleaseHdc(dc);
   }
   private void InitializeComponent() {
       this.SuspendLayout();
       this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.ClientSize = new System.Drawing.Size(292, 268);
       this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
       this.ResumeLayout(false);
   }
   [STAThread]
   static void Main() {
       Application.EnableVisualStyles();
       Application.Run(new Form1());
   }

}

</source>


DLL: GetVersionEx

<source lang="csharp"> using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] class OSVersionInfo {

   public int dwOSVersionInfoSize;
   public int dwMajorVersion;
   public int dwMinorVersion;
   public int dwBuildNumber;
   public int dwPlatformId;
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
   public String szCSDVersion;

} class MainClass {

   [DllImport("kernel32.dll")]
   public static extern bool GetVersionEx([In, Out] OSVersionInfo osvi);
   static void Main(string[] args) {
       OSVersionInfo osvi = new OSVersionInfo();
       osvi.dwOSVersionInfoSize = Marshal.SizeOf(osvi);
       GetVersionEx(osvi);
       Console.WriteLine("Class size: " + osvi.dwOSVersionInfoSize);
       Console.WriteLine("Major Version: " + osvi.dwMajorVersion);
       Console.WriteLine("Minor Version: " + osvi.dwMinorVersion);
       Console.WriteLine("Build Number: " + osvi.dwBuildNumber);
       Console.WriteLine("Platform Id: " + osvi.dwPlatformId);
       Console.WriteLine("CSD Version: " + osvi.szCSDVersion);
       Console.WriteLine("Platform: " + Environment.OSVersion.Platform);
       Console.WriteLine("Version: " + Environment.OSVersion.Version);
   }

}

</source>


Get OS Version from kernel32.dll

<source lang="csharp"> using System; using System.Runtime.InteropServices; public class Starter {

   public static void Main() {
       API.OSVERSIONINFO info = new API.OSVERSIONINFO();
       info.dwOSVersionInfoSize = Marshal.SizeOf(info);
       bool resp = API.GetVersionEx(ref info);
       if (resp == false) {
           Console.WriteLine("GetVersion failed");
       }
       Console.WriteLine("{0}.{1}.{2}",
           info.dwMajorVersion,
           info.dwMinorVersion,
           info.dwBuildNumber);
   }

} public class API {

   [DllImport("kernel32.dll")]
   public static extern
       bool GetVersionEx(ref OSVERSIONINFO lpVersionInfo);
   [StructLayout(LayoutKind.Sequential)]
   public struct OSVERSIONINFO {
       public System.Int32 dwOSVersionInfoSize;
       public System.Int32 dwMajorVersion;
       public System.Int32 dwMinorVersion;
       public System.Int32 dwBuildNumber;
       public System.Int32 dwPlatformId;
       [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
       public String szCSDVersion;
   }

}

</source>


Get the Total Free Space on a Drive by using kernel32.dll

<source lang="csharp"> using System; using System.Runtime.InteropServices; public class GetFreeSpace {

   [DllImport("kernel32.dll", EntryPoint="GetDiskFreeSpaceExA" )]
   private static extern long GetDiskFreeSpaceEx(string lpDirectoryName, out long lpFreeBytesAvailableToCaller, out long lpTotalNumberOfBytes, out long lpTotalNumberOfFreeBytes);
   private static void Main() {
       long result, total, free, available;
       result = GetDiskFreeSpaceEx("c:", out available, out total, out free);
       if (result != 0) {
           Console.WriteLine("Total Bytes: {0:N}", total);
           Console.WriteLine("Free Bytes: {0:N}", free);
           Console.WriteLine("Available Bytes: {0:N}", available);
       }
   }

}

</source>


import CreateDirectory and FormatMessage

<source lang="csharp"> using System; using System.Text; using System.Runtime.InteropServices; public class Starter {

   public static void Main() {
       bool resp = API.CreateDirectory(@"c*:\file.txt", IntPtr.Zero);
       if (resp == false) {
           StringBuilder message;
           int errorcode = Marshal.GetLastWin32Error();
           API.FormatMessage(API.FORMAT_MESSAGE_ALLOCATE_BUFFER | API.FORMAT_MESSAGE_FROM_SYSTEM | API.FORMAT_MESSAGE_IGNORE_INSERTS,IntPtr.Zero, errorcode,0, out message, 0, IntPtr.Zero);
           Console.WriteLine(message);
       }
   }

} public class API {

   [DllImport("kernel32.dll", SetLastError = true)]
   public static extern bool CreateDirectory(string lpPathName, IntPtr lpSecurityAttributes);
   [DllImport("kernel32.dll", SetLastError = false)]
   public static extern System.Int32 FormatMessage(
       System.Int32 dwFlags,
       IntPtr lpSource,
       System.Int32 dwMessageId,
       System.Int32 dwLanguageId,
       out StringBuilder lpBuffer,
       System.Int32 nSize,
       IntPtr va_list);
   public const int FORMAT_MESSAGE_ALLOCATE_BUFFER = 256;
   public const int FORMAT_MESSAGE_IGNORE_INSERTS = 512;
   public const int FORMAT_MESSAGE_FROM_STRING = 1024;
   public const int FORMAT_MESSAGE_FROM_HMODULE = 2048;
   public const int FORMAT_MESSAGE_FROM_SYSTEM = 4096;
   public const int FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192;
   public const int FORMAT_MESSAGE_MAX_WIDTH_MASK = 255;

}

</source>


imports the GetModuleHandleW function specifically

<source lang="csharp"> using System; using System.Runtime.InteropServices; public class Starter {

   public static void Main() {
       int hProcess = API.GetModuleHandleW(null);
   }

} public class API {

   [DllImport("kernel32.dll", ExactSpelling = true)]
   public static extern int GetModuleHandleW(string filename);

}

</source>


imports the printf function

<source lang="csharp"> using System; using System.Runtime.InteropServices; public class Starter {

   public static void Main() {
       int val1 = 5, val2 = 10;
       API.printf("%d+%d=%d", val1, val2, val1 + val2);
   }

} public class API {

   [DllImport("msvcrt.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
   public static extern int printf(string formatspecifier, int lhs, int rhs, int total);

}

</source>


imports three functions to display the vertical and horizontal size of the screen.

<source lang="csharp"> using System; using System.Runtime.InteropServices; public class Starter {

   public static void Main() {
       IntPtr hDC = API.GetDC(IntPtr.Zero);
       int v = API.GetDeviceCaps(hDC, API.HORZRES);
       Console.WriteLine("Vertical size of window {0}mm.", v);
       int h = API.GetDeviceCaps(hDC, API.HORZRES);
       Console.WriteLine("Horizontal size of window {0}mm.", h);
       int resp = API.ReleaseDC(IntPtr.Zero, hDC);
       if (resp != 1) {
           Console.WriteLine("Error releasing hdc");
       }
   }

} public static class API {

   [DllImport("user32.dll")]
   public static extern IntPtr GetDC(IntPtr hWnd);
   [DllImport("user32.dll")]
   public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
   [DllImport("gdi32.dll")]
   public static extern int GetDeviceCaps(IntPtr hDC, int nIndex);
   public const int HORZSIZE = 4;  // horizontal size in pixels
   public const int VERTSIZE = 6;  // vertical size in pixels
   public const int HORZRES = 8;   // horizontal size in millimeters
   public const int VERTRES = 10;  // vertical size in millimeters

}

</source>


Keyboard timer: GetTickCount

<source lang="csharp"> using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; public class KeyTimer : System.Windows.Forms.Form {

   private System.ruponentModel.Container components = null;
   private uint start = 0;
   private uint stop = 0;
   [DllImport("kernel32.dll")]
   public static extern uint GetTickCount();
   public KeyTimer() {
   }
   [STAThread]
   static void Main() {
       Application.Run(new KeyTimer());
   }
   protected override void OnKeyDown(KeyEventArgs args) {
       start = GetTickCount();
   }
   protected override void OnKeyUp(KeyEventArgs args) {
       stop = GetTickCount();
       uint elapsed = (stop - start);
       MessageBox.Show(Convert.ToString(args.KeyData) + ", time elapsed: " + Convert.ToString(elapsed) + " msecs");
   }

}

</source>


marshals string for unmanaged memory as ANSI.

<source lang="csharp"> using System; using System.Runtime.InteropServices; public class Starter {

   public static void Main() {
       int hProcess = API.GetModuleHandle(null);
   }

} public class API {

   [DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
   public static extern int GetModuleHandle(string filename);

}

</source>


MessageBox from user32.dll

<source lang="csharp"> using System; using System.Runtime.InteropServices; public class Starter {

   public static void Main() {
       string caption = "Visual C# 2005";
       string text = "Hello, world!";
       API.ShowMessage(0, text, caption, 0);
   }

} public class API {

   [DllImport("user32.dll", EntryPoint = "MessageBox")]
   public static extern int ShowMessage(int hWnd,
       string text, string caption, uint type);

}

</source>