region Получение имени текущего пользователя
namespace GetUserName { public class WinAPIClass { # region Получение имени текущего пользователя /// <summary> /// Получение имени текущего пользователя. /// </summary> /// <param name="nameFormat">Формат имени из перечисления NameFormat.</param> /// <param name="userName">Выходной параметр — имя.пользователя</param> /// <param name="userNameSize">Количество символов в имени.</param> /// <returns></returns> //Подключение библиотеки secur32.dll [DllImport("secur32.dll", CharSet=CharSet.Auto)] public static extern int GetUserNameEx (int nameFormat, StringBuilder userName, ref uint userNameSize); /// <summary> /// Формат имени. /// </summary> public enum NameFormat:int { NameUnknown = 0, NameFullyQualifiedDN = 1, NameSamCompatible = 2, NameDisplay = 3, NameUniqueId = 6, NameCanonical = 7, NameUserPrincipal = 8, NameCanonicalEx = 9, NameServicePrincipal = 10, NameDnsDomain = 12 }; #endregion } } |
Листинг 5.1. |
Закрыть окно |
using System; using System.Runtime.InteropServices; namespace MessageBox { public class WinAPIClass { # region Вызов диалогового окна MessageBox /// <summary> /// Вызов диалогового окна MessageBox. /// </summary> /// <param name="handle">Родительская форма окна</param> /// <param name="text">Текст окна.</param> /// <param name="title">Заголовок окна.</param> /// <param name="type">Тип окна.</param> /// <returns></returns> [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int MessageBox(IntPtr handle, string text, string title, uint type); /// <summary> /// Тип диалогового окна. /// </summary> public enum MessageBoxType:int { /// <summary> /// Три кнопки — Abort, Retry, Ignore /// </summary> MB_ABORTRETRYIGNORE = 2, /// <summary> /// Три кнопки — Cancel, Try, Continue /// </summary> MB_CANCELTRYCONTINUE = 6, /// <summary> /// Одна кнопка — Ok. /// </summary> MB_OK = 0, /// <summary> /// Две кнопки — Ok, Cancel. /// </summary> MB_OKCANCEL = 1, /// <summary> /// Две кнопки — Retry, Cancel /// </summary> MB_RETRYCANCEL = 5, /// <summary> /// Две кнопки — Yes, No /// </summary> MB_YESNO = 4, /// <summary> /// Три кнопки — Yes, No, Cancel /// </summary> MB_YESNOCANCEL = 3, /// <summary> /// Иконка-восклицание /// </summary> MB_ICONEXCLAMATION = 0x30, /// <summary> /// Иконка-предупреждение /// </summary> MB_ICONWARNING = 0x30, /// <summary> /// Иконка-информация /// </summary> MB_ICONINFORMATION = 0x40, /// <summary> /// Иконка-вопрос /// </summary> MB_ICONQUESTION = 0x20, /// <summary> /// Иконка-стоп /// </summary> MB_ICONSTOP = 0x10, /// <summary> /// Иконка-ошибка /// </summary> MB_ICONERROR = 0x10, } /// <summary> /// Тип возвращаемого значения. /// </summary> public enum MessageBoxReturnType:int { IDABORT = 3, IDCANCEL = 2, IDCONTINUE = 11, IDIGNORE = 5, IDNO = 7, IDOK = 1, IDRETRY = 4, IDTRYAGAIN = 10, IDYES = 6 } #endregion } } |
Листинг 5.2. |
Закрыть окно |
private void btnABORTRETRYIGNORE_Click(object sender, System.EventArgs e) { // Текст сообщения string text = "Hello World"; //Заголовок окна string title = "From WinApi"; // Тип данных IntPtr — указатель на объект. WinAPIClass.MessageBox(IntPtr.Zero, text, title, (uint)(WinAPIClass.MessageBoxType.MB_ABORTRETRYIGNORE | WinAPIClass.MessageBoxType.MB_ICONQUESTION)); } private void btnYESNOCANCEL_Click(object sender, System.EventArgs e) { string text = "Hello World"; string title = "From WinApi"; WinAPIClass.MessageBox(IntPtr.Zero, text, title, (uint)(WinAPIClass.MessageBoxType.MB_YESNOCANCEL | WinAPIClass.MessageBoxType.MB_ICONINFORMATION)); } private void btnOK_Click(object sender, System.EventArgs e) { string text = "Hello World"; string title = "From WinApi"; WinAPIClass.MessageBox(IntPtr.Zero, text, title, (uint)(WinAPIClass.MessageBoxType.MB_OK | WinAPIClass.MessageBoxType.MB_ICONSTOP)); } private void btnYESNO_Click(object sender, System.EventArgs e) { string text = "Hello World"; string title = "From WinApi"; WinAPIClass.MessageBox(IntPtr.Zero, text, title, (uint)(WinAPIClass.MessageBoxType.MB_YESNO | WinAPIClass.MessageBoxType.MB_ICONEXCLAMATION)); } |
Листинг 5.3. |
Закрыть окно |
using System; using System.Runtime.InteropServices; namespace EasySound { public class WinAPIClass { #region Вызов сигнала /// <summary> /// Вызов сигнала. /// </summary> /// <param name="frequency">Частота сигнала в герцах. Диапазон от 37 до 32767 Гц.</param> /// <param name="duration">Продолжительность сигнала в миллисекундах.</param> /// <returns></returns> [DllImport("Kernel32.dll")] public static extern bool Beep (int frequency, int duration); #endregion } } |
Листинг 5.4. |
Закрыть окно |
private void btnDo_Click(object sender, System.EventArgs e) { // В скобках: первый параметр — частота, второй — продолжительность сигнала WinAPIClass.Beep(1000, 100); } private void btnRe_Click(object sender, System.EventArgs e) { WinAPIClass.Beep(3000, 100); } private void btnMi_Click(object sender, System.EventArgs e) { WinAPIClass.Beep(5000, 100); } private void btnFa_Click(object sender, System.EventArgs e) { WinAPIClass.Beep(7000, 100); } private void btnSol_Click(object sender, System.EventArgs e) { WinAPIClass.Beep(9000, 100); } private void btnLya_Click(object sender, System.EventArgs e) { WinAPIClass.Beep(11000, 100); } private void btnC_Click(object sender, System.EventArgs e) { WinAPIClass.Beep(13000, 100); } |
Листинг 5.5. |
Закрыть окно |
using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace AnimatedWindow { public class WinAPIClass { #region Анимация окна /// <summary> /// Тип анимации окна. Перечисление возвращает тип данных int /// после приведения. Каждому элементу перечисления присвоено /// свое значение типа int. /// </summary> [Flags] public enum AnimateWindowFlags:int { AW_HOR_POSITIVE = 1, AW_HOR_NEGATIVE = 2, AW_VER_POSITIVE = 4, AW_VER_NEGATIVE = 8, AW_CENTER = 16, AW_HIDE = 65536, AW_ACTIVATE = 131072, AW_SLIDE = 262144, AW_BLEND = 524288 }; /// <summary> /// Анимация окна. /// </summary> /// <param name="hwnd">Окно.</param> /// <param name="dwTime">Время.</param> /// <param name="dwFlags">Тип анимации. Если в неуправляемом /// коде используется перечисление, то его нужно конвертировать /// в тип данных int. </param> /// <returns></returns> [DllImportAttribute("user32.dll",EntryPoint="AnimateWindow",SetLastError=true)] public static extern bool AnimateWindow(IntPtr hwnd,int dwTime,int dwFlags); /// <summary> /// Анимация окна. /// </summary> /// <param name="ctrl">Окно.</param> /// <param name="dwTime">Время.</param> /// <param name="Flags">Флаги.</param> /// <returns></returns> public static bool AnimateWindow(Control ctrl,int dwTime, AnimateWindowFlags Flags) { return AnimateWindow(ctrl.Handle,dwTime,(int)Flags); } #endregion } } |
Листинг 5.6. |
Закрыть окно |
private void btnAW_BLEND_Click(object sender, System.EventArgs e) { // Скрываем окно this.Hide(); // Запускаем анимацию. Второй параметр в скобках — время анимации в миллисекундах. WinAPIClass.AnimateWindow(this, 3000, WinAPIClass.AnimateWindowFlags.AW_ACTIVATE|WinAPIClass.AnimateWindowFlags.AW_BLEND); // Отображаем кнопки после анимации this.btnAW_BLEND.Invalidate(); this.btnHOR_AW_SLIDE.Invalidate(); this.btnCenter_AW_SLIDE.Invalidate(); } private void btnHOR_AW_SLIDE_Click(object sender, System.EventArgs e) { this.Hide(); WinAPIClass.AnimateWindow(this, 3000, WinAPIClass.AnimateWindowFlags.AW_HOR_POSITIVE|WinAPIClass.AnimateWindowFlags.AW_SLIDE); this.btnAW_BLEND.Invalidate(); this.btnHOR_AW_SLIDE.Invalidate(); this.btnCenter_AW_SLIDE.Invalidate(); } private void btnCenter_AW_SLIDE_Click(object sender, System.EventArgs e) { this.Hide(); WinAPIClass.AnimateWindow(this, 3000, WinAPIClass.AnimateWindowFlags.AW_CENTER|WinAPIClass.AnimateWindowFlags.AW_SLIDE); this.btnAW_BLEND.Invalidate(); this.btnHOR_AW_SLIDE.Invalidate(); this.btnCenter_AW_SLIDE.Invalidate(); } |
Листинг 5.7. |
Закрыть окно |
using System; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Text; namespace StartTurnOff { public class WinAPIClass { #region Завершение работы Windows. /// <summary> /// Завершение работы. /// </summary> /// <param name="shutDownType">Тип завершения работы.</param> /// <param name="reason">Причина</param> /// <returns></returns> [DllImport("user32.dll")] public static extern bool ExitWindowsEx(uint shutDownType, string reason); // To shut down or restart the system, the calling process must use the //AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. // Для выключения или перезагрузки системы вызываемый процесс //должен использовать функцию AdjustTokenPrivileges для получения //определенного уровня доступа (привилегии) /// <summary> /// Тип завершения работы. /// </summary> public enum ShutdownType:int { LogOf = 0, Shutdown = 0x00000001, Reboot = 0x00000002, PowerOf = 0x00000008 } #endregion // Дополнительные переменные public const int SE_PRIVILEGE_ENABLED = 2; public const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege"; public const int ANYSIZE_ARRAY = 1; public const int TOKEN_QUERY = 8; public const int TOKEN_ADJUST_PRIVILEGES = 32;//0x00000020; // Структура, используемая для передачи в метод AdjustTokenPrivileges // в качестве необходимой привилегии. [StructLayout(LayoutKind.Sequential, Pack=1)] internal struct TokPriv1Luid { // Количество привилегий в наборе. public int Count; public long Luid; // Тип привилегии. public int Attr; } /// <summary> /// Возвращение указателя на текущий процесс. /// </summary> /// <returns></returns> [DllImport("kernel32.dll", ExactSpelling=true) ] internal static extern IntPtr GetCurrentProcess(); /// <summary> /// Открывание процесса access token, который содержит информацию о ///безопасности текущего пользователя, /// привязанного к заданному процессу. /// </summary> /// <param name="h">Указатель на процесс.</param> /// <param name="acc">Тип access token.</param> /// <param name="phtok">Указатель на access token.</param> /// <returns></returns> [DllImport("advapi32.dll", ExactSpelling=true) ] internal static extern bool OpenProcessToken( IntPtr h, int acc, ref IntPtr phtok ); /// <summary> /// Возвращение значения переменной в текущей сессии ОС. /// </summary> /// <param name="host">Название системы. Если значение null, ///поиск осуществляется /// в локальной системе.</param> /// <param name="name">Название переменной.</param> /// <param name="pluid">Указатель на значение переменной.</param> /// <returns></returns> [DllImport("advapi32.dll") ] internal static extern bool LookupPrivilegeValue( string host, string name, ref long pluid ); /// <summary> /// Включение указанной привилегии. /// </summary> /// <param name="htok">Указатель на access token</param> /// <param name="disall">Необходимость выключения всех привилегий.</param> /// <param name="newst">Новое значение привилегии. Если предыдущее /// значение установлено в true, /// то это значение не учитывается.</param> /// <param name="len">Размер буфера для следующего значения.</param> /// <param name="prev">Предыдущая привилегия.</param> /// <param name="relen">Указатель на размер полученных привилегий.</param> /// <returns></returns> [DllImport("advapi32.dll", ExactSpelling=true) ] internal static extern bool AdjustTokenPrivileges( IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen ); } } |
Листинг 5.8. |
Закрыть окно |
private void btnCancel_Click(object sender, System.EventArgs e) { this.Close(); } private void btnUserOut_Click(object sender, System.EventArgs e) { WinAPIClass.ExitWindowsEx((uint)WinAPIClass.ShutdownType.LogOf, "Win Api test"); } private void btnTurnOff_Click(object sender, System.EventArgs e) { RestartOrShotDown(WinAPIClass.ShutdownType.Shutdown); } private void btnRestart_Click(object sender, System.EventArgs e) { RestartOrShotDown(WinAPIClass.ShutdownType.Reboot); } void RestartOrShotDown(WinAPIClass.ShutdownType type) { WinAPIClass. TokPriv1Luid tp; IntPtr hproc = WinAPIClass.GetCurrentProcess(); IntPtr hToken = IntPtr.Zero; WinAPIClass.OpenProcessToken( hproc, WinAPIClass.TOKEN_ADJUST_PRIVILEGES | WinAPIClass.TOKEN_QUERY, ref hToken ); tp.Count = 1; tp.Luid = 0; tp.Attr = WinAPIClass.SE_PRIVILEGE_ENABLED; WinAPIClass.LookupPrivilegeValue(null, WinAPIClass.SE_SHUTDOWN_NAME, ref tp.Luid ); WinAPIClass.AdjustTokenPrivileges(hToken, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero ); WinAPIClass.ExitWindowsEx((uint)type, "Win Api test"); } private void btnCancel2_Click(object sender, System.EventArgs e) { this.Close(); } |
Листинг 5.9. |
Закрыть окно |
using System; using System.Runtime.InteropServices; using System.Security; namespace PrecisionCounter { public class MechanismCounter { static Int64 _start; static Int64 finish; static Int64 freq; /// <summary> /// Начало подсчета времени выполнения. /// </summary> public static void Start() { MechanismCounter._start = 0; MechanismCounter.QueryPerformanceCounter(ref _start); } /// <summary> /// Завершение подсчета времени выполнения и возвращение времени в секундах. /// </summary> /// <returns>Время в секундах, потраченное на выполнение участка /// кода. Десятичная часть отражает доли секунды.</returns> public static float Finish() { MechanismCounter.finish = 0; MechanismCounter.QueryPerformanceCounter(ref finish); MechanismCounter.freq = 0; MechanismCounter.QueryPerformanceFrequency(ref freq); return (((float)(MechanismCounter.finish - MechanismCounter._start))/((float)MechanismCounter.freq)); } /// <summary> /// Получение текущего значения тактов процессора. /// </summary> /// <param name="performanceCount">Переменная, в которую запишется значение.</param> /// <returns></returns> [SuppressUnmanagedCodeSecurity] [DllImport("Kernel32.dll")] static extern bool QueryPerformanceCounter(ref Int64 performanceCount); /// <summary> /// Получение текущей частоты (количество тактов / секунда) работы процессора. /// </summary> /// <param name="frequency">Переменная, в которую запишется значение.</param> /// <returns></returns> [SuppressUnmanagedCodeSecurity] [DllImport("Kernel32.dll")] static extern bool QueryPerformanceFrequency(ref Int64 frequency); } } |
Листинг 5.10. |
Закрыть окно |
using System; using System.Text; namespace PrecisionCounter { class TestCounter { [STAThread] static void Main(string[] args) { Output(" Запуск процесса подсчета времени выполнения сложения строк с использованием типа данных string"); MechanismCounter.Start(); string s = String.Empty; for(int i = 0; i < 10000; i++) { s+="TestPerfCounter"; } float timeString = MechanismCounter.Finish(); Output("Завершение процесса подсчета времени. Время выполнения (сек): " + timeString); Output("Запуск процесса подсчета времени выполнения сложения строк с использованием типа данных StringBuilder"); MechanismCounter.Start(); StringBuilder sb = new StringBuilder(); for(int i = 0; i < 10000; i++) { sb.Append("TestCounter"); } float timeStringBuilder = MechanismCounter.Finish(); Output("Завершение процесса подсчета времени. Время выполнения (сек): " + timeStringBuilder); } /// <summary> /// Вывод на экран заданного значения. /// </summary> /// <param name="s">Значение.</param> static void Output(string s) { Console.WriteLine(s); } } } |
Листинг 5.11. |
Закрыть окно |
using System; using System.Runtime.InteropServices; using System.Drawing.Imaging; using System.Drawing; using System.IO; namespace ScreenShot { /// <summary> /// Класс для создания снимков экрана /// </summary> public class ScreenShotDll { /// <summary> ///Создание снимка /// </summary> /// <param name="fileName">Название файла.</param> /// <param name="imageFormat">Формат изображения.</param> public void CaptureScreen(string fileName,ImageFormat imageFormat) { int hdcSrc = User32.GetWindowDC(User32.GetDesktopWindow()), hdcDest = GDI32.CreateCompatibleDC(hdcSrc), hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, GDI32.GetDeviceCaps(hdcSrc,8),GDI32.GetDeviceCaps(hdcSrc,10)); GDI32.SelectObject(hdcDest,hBitmap); GDI32.BitBlt(hdcDest,0,0,GDI32.GetDeviceCaps(hdcSrc,8), GDI32.GetDeviceCaps(hdcSrc,10), hdcSrc,0,0,0x00CC0020); SaveImageAs(hBitmap,fileName,imageFormat); Cleanup(hBitmap,hdcSrc,hdcDest); } /// <summary> /// Получение снимка в формате Windows Bitmap /// </summary> /// <returns></returns> public Bitmap CaptureScreen() { int hdcSrc = User32.GetWindowDC(User32.GetDesktopWindow()), hdcDest = GDI32.CreateCompatibleDC(hdcSrc), hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, GDI32.GetDeviceCaps(hdcSrc,8),GDI32.GetDeviceCaps(hdcSrc,10)); GDI32.SelectObject(hdcDest,hBitmap); GDI32.BitBlt(hdcDest,0,0,GDI32.GetDeviceCaps(hdcSrc,8), GDI32.GetDeviceCaps(hdcSrc,10), hdcSrc,0,0,0x00CC0020); Bitmap btm = GetImage(hBitmap); Cleanup(hBitmap,hdcSrc,hdcDest); return btm; } /// <summary> /// Освобождение ресурсов системы. /// </summary> /// <param name="hBitmap">Указатель на структуру данных.</param> /// <param name="hdcSrc">Указатель на структуру данных источника.</param> /// <param name="hdcDest">Указатель на структуру данных назначения.</param> private void Cleanup(int hBitmap, int hdcSrc, int hdcDest) { User32.ReleaseDC(User32.GetDesktopWindow(),hdcSrc); GDI32.DeleteDC(hdcDest); GDI32.DeleteObject(hBitmap); } /// <summary> /// Сохранение снимка /// </summary> /// <param name="hBitmap">Указатель на изображение.</param> /// <param name="fileName">Название файла.</param> /// <param name="imageFormat">Формат изображения.</param> private void SaveImageAs(int hBitmap, string fileName, ImageFormat imageFormat) { Bitmap image = new Bitmap(Image.FromHbitmap(new IntPtr(hBitmap)), Image.FromHbitmap(new IntPtr(hBitmap)).Width, Image.FromHbitmap(new IntPtr(hBitmap)).Height); image.Save(fileName,imageFormat); } /// <summary> /// Возвращение изображения по указателю. /// </summary> /// <param name="hBitmap">Указатель на изображение.</param> /// <returns></returns> private Bitmap GetImage(int hBitmap) { Bitmap image = new Bitmap(Image.FromHbitmap(new IntPtr(hBitmap)), Image.FromHbitmap(new IntPtr(hBitmap)).Width, Image.FromHbitmap(new IntPtr(hBitmap)).Height); return image; } } /// <summary> /// Реализация методов библиотеки User32 /// </summary> class User32 { /// <summary> /// Возвращение указателя на рабочий стол. /// </summary> /// <returns></returns> [DllImport("User32.dll")] public static extern int GetDesktopWindow(); /// <summary> /// Получение структуры данных. /// </summary> /// <param name="hWnd">Указатель на окно.</param> /// <returns></returns> [DllImport("User32.dll")] public static extern int GetWindowDC(int hWnd); /// <summary> /// Освобождение структуры данных. /// </summary> /// <param name="hWnd">Указатель на окно.</param> /// <param name="hDC">Указатель на структуру данных.</param> /// <returns></returns> [DllImport("User32.dll")] public static extern int ReleaseDC(int hWnd,int hDC); } /// <summary> /// Реализация методов библиотеки GDI32 /// </summary> class GDI32 { /// <summary> /// Передача изображения. /// </summary> /// <param name="hdcDest">Указатель на назначение передачи.</param> /// <param name="nXDest">Х координата верхнего левого угла назначения.</param> /// <param name="nYDest">У координата верхнего левого угла назначения.</param> /// <param name="nWidth">Ширина прямоугольника.</param> /// <param name="nHeight">Высота прямоугольника.</param> /// <param name="hdcSrc">Указатель на источник.</param> /// <param name="nXSrc">Х координата верхнего левого угла источника.</param> /// <param name="nYSrc">У координата верхнего левого угла источника.</param> /// <param name="dwRop">Код растровой операции.</param> /// <returns></returns> [DllImport("GDI32.dll")] public static extern bool BitBlt(int hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, int hdcSrc, int nXSrc, int nYSrc,int dwRop); /// <summary> /// Создание и запись в структуру данных изображения. /// </summary> /// <param name="hdc">Указатель на структуру данных.</param> /// <param name="nWidth">Ширина изображения.</param> /// <param name="nHeight">Высота изображения.</param> /// <returns></returns> [DllImport("GDI32.dll")] public static extern int CreateCompatibleBitmap(int hdc,int nWidth, int nHeight); /// <summary> /// Создание и сохранение в памяти структуры данных, совместимой с указанным устройством вывода. /// Для помещения изображения в структуру данных /// необходимо указать высоту, ширину и цветовой режим изображения. /// Это можно сделать с помощью функции CreateCompatibleBitmap, поддерживаемой устройствами с растровым выводом. /// Для получения информации об этих устройствах используется функция GetDeviceCaps. /// После использования структуры данных ее нужно удалить с помощью функции DeleteDC. /// </summary> /// <param name="hdc">Указатель на существующую структуру данных. Если указатель равен null, /// то функция создает структуру для экрана текущего приложения.</param> /// <returns></returns> [DllImport("GDI32.dll")] public static extern int CreateCompatibleDC(int hdc); /// <summary> /// Удаление указанной структуры данных. /// </summary> /// <param name="hdc">Структура данных.</param> /// <returns></returns> [DllImport("GDI32.dll")] public static extern bool DeleteDC(int hdc); /// <summary> /// Удаление графических объектов с освобождением системных ресурсов. /// </summary> /// <param name="hObject">Указатель на графический объект.</param> /// <returns></returns> [DllImport("GDI32.dll")] public static extern bool DeleteObject(int hObject); /// <summary> /// Возвращение информации об указанной структуре. /// </summary> /// <param name="hdc">Указатель на структуру данных.</param> /// <param name="nIndex">Индекс совместимости. .</param> /// <returns></returns> [DllImport("GDI32.dll")] public static extern int GetDeviceCaps(int hdc, int nIndex); /// <summary> /// Выбор объекта, находящегося в указанной структуре данных. /// </summary> /// <param name="hdc">Указатель на структуру данных.</param> /// <param name="hgdiobj">Указатель на объект.</param> /// <returns></returns> [DllImport("GDI32.dll")] public static extern int SelectObject(int hdc, int hgdiobj); } } |
Листинг 5.12. |
Закрыть окно |