Надстройка для user32.dll - C#

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток. Меня тут ВНЕЗАПНО осенила идея, что пользоватьсы функциями из user32.dll не очень то удобно, и я решил сделать для нее надстройку в виде какой-нибудь дружественной пользователю библиотеки (то, что имеется на данный момент, можно посмотреть во вложении). Так вот, появилось у меня целых два вопроса: Первый - есть ли где-нибудь перечисление всех функций из user32.dll, желательно с коментариями на русском языке? (на MSDN это все, конечно, есть, но не слишком удобно в обращении). И второй, самый главный вопрос - это вообще кроме меня хоть кому-нибудь нужно? Исходник в текстовом виде:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
 
namespace win32api
{
    #region Служебный класс
    class intercom
    {
        [DllImport("user32.dll")]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
        [DllImport("user32.dll")]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
 
        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
 
        [DllImport("user32.dll")]
        public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
 
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetWindowRect(IntPtr hWnd, out Win32.RECT lpRect);
 
        [Flags]
        public enum MouseEventFlags
        {
            LEFTDOWN = 0x00000002,
            LEFTUP = 0x00000004,
            MIDDLEDOWN = 0x00000020,
            MIDDLEUP = 0x00000040,
            MOVE = 0x00000001,
            ABSOLUTE = 0x00008000,
            RIGHTDOWN = 0x00000008,
            RIGHTUP = 0x00000010,
            WHEEL = 0x0800
        }
    }
    #endregion
 
    public class Win32
    {
        #region Полезные дополнения
        /// <summary>
        /// Controls various aspects of mouse motion and button clicking.
        /// </summary>
        public enum MouseEvent
        {
            /// <summary>
            /// The left button is down.
            /// </summary>
            LeftDown,
            /// <summary>
            /// The left button is up.
            /// </summary>
            LeftUp,
            /// <summary>
            /// The middle button is down.
            /// </summary>
            MiddleDown,
            /// <summary>
            /// The middle button is up.
            /// </summary>
            MiddleUp,
            /// <summary>
            /// Movement occurred.
            /// </summary>
            Move,
            /// <summary>
            /// The dx and dy parameters contain normalized absolute coordinates. If not set, those parameters contain relative data: the change in position since the last reported position. This flag can be set, or not set, regardless of what kind of mouse or mouse-like device, if any, is connected to the system. For further information about relative mouse motion, see the following Remarks section.
            /// </summary>
            Absolute,
            /// <summary>
            /// The right button is down.
            /// </summary>
            RightDown,
            /// <summary>
            /// The right button is up.
            /// </summary>
            RightUp,
            /// <summary>
            /// The wheel has been moved, if the mouse has a wheel. The amount of movement is specified in dwData
            /// </summary>
            Wheel
        }
 
        public enum HotkeyModifiers
        {
            Alt = 0x0001,
            Control = 0x0002,
            Shift = 0x0004,
            Win = 0x0008,
            Alt_Control = 0x0001 | 0x0002,
            Alt_Shift = 0x0001 | 0x0004,
            Alt_Win = 0x0001 | 0x0008,
            Control_Shift = 0x0002 | 0x0004,
            Control_Win = 0x0002 | 0x0008,
            Shift_Win = 0x0004 | 0x0008,
            Alt_Control_Shift = 0x0001 | 0x0002 | 0x0004,
            Alt_Control_Win = 0x0001 | 0x0002 | 0x0008,
            Alt_Shift_Win = 0x0001 | 0x0004 | 0x0008,
            Control_Shift_Win = 0x0002 | 0x0004 | 0x0008,
            Alt_Control_Shift_Win = 0x0001 | 0x0002 | 0x0004 | 0x0008
 
        }
 
        /// <summary>
        /// The RECT structure defines the coordinates of the upper-left and lower-right corners of a rectangle.
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            /// <summary>
            /// The x-coordinate of the upper-left corner of the rectangle.
            /// </summary>
            public int Left;
            /// <summary>
            /// The y-coordinate of the upper-left corner of the rectangle.
            /// </summary>
            public int Top;
            /// <summary>
            /// The x-coordinate of the lower-right corner of the rectangle.
            /// </summary>
            public int Right;
            /// <summary>
            /// The y-coordinate of the lower-right corner of the rectangle.
            /// </summary>
            public int Bottom;
        }
 
        #endregion
 
        #region Mouse
 
        /// <summary>
        /// The mouse_event function synthesizes mouse motion and button clicks.
        /// </summary>
        /// <param name="me">Controls various aspects of mouse motion and button clicking.</param>
        /// <param name="x">The mouse's absolute position along the x-axis or its amount of motion since the last mouse event was generated, depending on the setting of MOUSEEVENTF_ABSOLUTE. Absolute data is specified as the mouse's actual x-coordinate; relative data is specified as the number of mickeys moved. A mickey is the amount that a mouse has to move for it to report that it has moved.</param>
        /// <param name="y">The mouse's absolute position along the y-axis or its amount of motion since the last mouse event was generated, depending on the setting of MOUSEEVENTF_ABSOLUTE. Absolute data is specified as the mouse's actual y-coordinate; relative data is specified as the number of mickeys moved.</param>
        /// <param name="dwData">If dwFlags contains MOUSEEVENTF_WHEEL, then dwData specifies the amount of wheel movement. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120.</param>
        /// <param name="dwExtraInfo">An additional value associated with the mouse event. An application calls GetMessageExtraInfo to obtain this extra information.</param>
        public static void Mouse(MouseEvent me, int x, int y, int dwData, int dwExtraInfo)
        {
            int MouseFlag = 0;
            switch (me)
            {
                case MouseEvent.Absolute:
                    {
                        MouseFlag = (int)intercom.MouseEventFlags.ABSOLUTE;
                        break;
                    }
                case MouseEvent.LeftDown:
                    {
                        MouseFlag = (int)intercom.MouseEventFlags.LEFTDOWN;
                        break;
                    }
                case MouseEvent.LeftUp:
                    {
                        MouseFlag = (int)intercom.MouseEventFlags.LEFTUP;
                        break;
                    }
                case MouseEvent.MiddleDown:
                    {
                        MouseFlag = (int)intercom.MouseEventFlags.MIDDLEDOWN;
                        break;
                    }
                case MouseEvent.MiddleUp:
                    {
                        MouseFlag = (int)intercom.MouseEventFlags.MIDDLEUP;
                        break;
                    }
                case MouseEvent.Move:
                    {
                        MouseFlag = (int)intercom.MouseEventFlags.MOVE;
                        break;
                    }
                case MouseEvent.RightDown:
                    {
                        MouseFlag = (int)intercom.MouseEventFlags.RIGHTDOWN;
                        break;
                    }
                case MouseEvent.RightUp:
                    {
                        MouseFlag = (int)intercom.MouseEventFlags.RIGHTUP;
                        break;
                    }
                case MouseEvent.Wheel:
                    {
                        MouseFlag = (int)intercom.MouseEventFlags.WHEEL;
                        break;
                    }
            }
            intercom.mouse_event(MouseFlag, x, y, dwData, dwExtraInfo);
 
        }
 
        /// <summary>
        /// Упрощенная версия Mouse(MouseEvent me, int x, int y, int dwData, int dwExtraInfo), без дополнительных пареметров
        /// </summary>
        /// <param name="me">Controls various aspects of mouse motion and button clicking.</param>
        /// <param name="x">The mouse's absolute position along the x-axis or its amount of motion since the last mouse event was generated, depending on the setting of MOUSEEVENTF_ABSOLUTE. Absolute data is specified as the mouse's actual x-coordinate; relative data is specified as the number of mickeys moved. A mickey is the amount that a mouse has to move for it to report that it has moved.</param>
        /// <param name="y">The mouse's absolute position along the y-axis or its amount of motion since the last mouse event was generated, depending on the setting of MOUSEEVENTF_ABSOLUTE. Absolute data is specified as the mouse's actual y-coordinate; relative data is specified as the number of mickeys moved.</param>
        public static void Mouse(MouseEvent me, int x, int y)
        {
            Mouse(me, x, y, 0, 0);
        }
 
        #endregion
 
        #region Keyboard
 
        /// <summary>
        /// Defines a system-wide hot key.
        /// </summary>
        /// <param name="hWnd">A handle to the window that will receive WM_HOTKEY messages generated by the hot key. If this parameter is NULL, WM_HOTKEY messages are posted to the message queue of the calling thread and must be processed in the message loop.</param>
        /// <param name="id">The identifier of the hot key. If the hWnd parameter is NULL, then the hot key is associated with the current thread rather than with a particular window. If a hot key already exists with the same hWnd and id parameters, see Remarks for the action taken.</param>
        /// <param name="htm">The keys that must be pressed in combination with the key specified by the uVirtKey parameter in order to generate the WM_HOTKEY message.</param>
        /// <param name="vlc">The virtual-key code of the hot key. See Virtual Key Codes.</param>
        /// <returns></returns>
        public static bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers htm , int vlc)
        {
            return intercom.RegisterHotKey(hWnd, id, (int)htm, vlc);
        }
 
        /// <summary>
        /// Frees a hot key previously registered by the calling thread.
        /// </summary>
        /// <param name="hWnd">A handle to the window associated with the hot key to be freed. This parameter should be NULL if the hot key is not associated with a window.</param>
        /// <param name="id">The identifier of the hot key to be freed.</param>
        /// <returns></returns>
        public static bool UnregisterHotKey(IntPtr hWnd, int id)
        {
            return intercom.UnregisterHotKey(hWnd, id);
        }
 
        #endregion
 
        #region Windows
 
        /// <summary>
        /// Brings the thread that created the specified window into the foreground and activates the window. Keyboard input is directed to the window, and various visual cues are changed for the user. The system assigns a slightly higher priority to the thread that created the foreground window than it does to other threads.
        /// </summary>
        /// <param name="hWnd">A handle to the window that should be activated and brought to the foreground.</param>
        /// <returns></returns>
        public static bool SetForegroundWindows(IntPtr hWnd)
        {
            return intercom.SetForegroundWindow(hWnd);
        }
 
        /// <summary>
        /// Retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen.
        /// </summary>
        /// <param name="hWnd">A handle to the window.</param>
        /// <param name="lpRect">A pointer to a RECT structure that receives the screen coordinates of the upper-left and lower-right corners of the window.</param>
        /// <returns></returns>
        public static bool GetWindowRect(IntPtr hWnd, out RECT lpRect)
        {
            return intercom.GetWindowRect(hWnd, out lpRect);
        }
 
        #endregion
    }
}

Решение задачи: «Надстройка для user32.dll»

textual
Листинг программы
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
 
namespace User_Interaction
{
    public static class Keyboard_and_Mouse_Input
    {
        /// <summary>
        /// This section describes how the system generates keyboard input and how an application receives and processes that input.
        /// </summary>
        public static class Keyboard_Input
        {
            /// <summary>
            /// Contains the API reference.
            /// </summary>
            public static class Keyboard_Input_Reference
            {
                public static class Keyboard_Input_Functions
                {
                    /// <summary>
                    /// Клавиши, которые должны быть нажаты вместе с назначенной клавишей (vlc), чтобы чтобы генерировать сообщение WM_HOTKEY.
                    /// </summary>
                    public enum HotkeyModifiers
                    {
                        Alt = 0x0001,
                        Control = 0x0002,
                        Shift = 0x0004,
                        Win = 0x0008,
                        Alt_Control = 0x0001 | 0x0002,
                        Alt_Shift = 0x0001 | 0x0004,
                        Alt_Win = 0x0001 | 0x0008,
                        Control_Shift = 0x0002 | 0x0004,
                        Control_Win = 0x0002 | 0x0008,
                        Shift_Win = 0x0004 | 0x0008,
                        Alt_Control_Shift = 0x0001 | 0x0002 | 0x0004,
                        Alt_Control_Win = 0x0001 | 0x0002 | 0x0008,
                        Alt_Shift_Win = 0x0001 | 0x0004 | 0x0008,
                        Control_Shift_Win = 0x0002 | 0x0004 | 0x0008,
                        Alt_Control_Shift_Win = 0x0001 | 0x0002 | 0x0004 | 0x0008
                    }
                    /// <summary>
                    /// Определяет общесистемные горячие клавиши.
                    /// </summary>
                    /// <param name="hWnd">Дескриптор окна, которое будет получать WM_HOTKEY сообщения, сгенерированные горячими клавишами. Если этот параметр NULL, WM_HOTKEY сообщения размещаются в очереди сообщений вызывающего потока и должны быть обработаны в цикле сообщений.</param>
                    /// <param name="id">Идентификатор горячей клавиши. Если HWnd параметр NULL, то горячая клавиша привязывается к текущему потоку, а не конкретному окну.</param>
                    /// <param name="fsModifiers">Клавиши, которые должны быть нажаты вместе с назначенной клавишей (vlc), чтобы чтобы генерировать сообщение WM_HOTKEY.</param>
                    /// <param name="vlc">Код виртуальной клавиши для горячей клавиши. Смотри Virtual Key Codes.</param>
                    /// <returns></returns>
                    [DllImport("user32.dll")]
                    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
                    /// <summary>
                    /// Определяет общесистемные горячие клавиши.
                    /// </summary>
                    /// <param name="hWnd">Дескриптор окна, которое будет получать WM_HOTKEY сообщения, сгенерированные горячими клавишами. Если этот параметр NULL, WM_HOTKEY сообщения размещаются в очереди сообщений вызывающего потока и должны быть обработаны в цикле сообщений.</param>
                    /// <param name="id">Идентификатор горячей клавиши. Если HWnd параметр NULL, то горячая клавиша привязывается к текущему потоку, а не конкретному окну.</param>
                    /// <param name="htm">Клавиши, которые должны быть нажаты вместе с назначенной клавишей (vlc), чтобы чтобы генерировать сообщение WM_HOTKEY.</param>
                    /// <param name="vlc">Код виртуальной клавиши для горячей клавиши. Смотри Virtual Key Codes.</param>
                    /// <returns></returns>
                    public static bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers htm, int vlc)
                    {
                        return RegisterHotKey(hWnd, id, (int)htm, vlc);
                    }
 
                    /// <summary>
                    /// Освобождает виртуальную клавишу, ранее зарегистрированную вызывающим потоком.
                    /// </summary>
                    /// <param name="hWnd">Дескриптор окна, связанный с освобождаемой горячей клавишей. Этот параметр должен быть NULL, если горячие клавиши не связаны с окном.</param>
                    /// <param name="id">Идентификатор освобождаемой горячей клавиши.</param>
                    /// <returns></returns>
                    [DllImport("user32.dll")]
                    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
 
                    public enum KeyboardEvents
                    {
                        KeyDown = 0,
                        KeyUp = 0x0002
                    }
                    /// <summary>
                    /// (переведено гуглом) Синтезирует нажатием клавиши. Система может использовать такие синтезированные клавиши для создания WM_KEYUP или WM_KEYDOWN сообщения. Обработчик прерывания клавиатуры водителя звонки keybd_event функции.
                    /// </summary>
                    /// <param name="bVk">Код виртуальной клавиши. Код должен быть в пределах от 1 до 254. For a complete list, see Virtual Key Codes.</param>
                    /// <param name="bScan">A hardware scan code for the key.</param>
                    /// <param name="dwFlags">Управление различными аспектами работы функции.</param>
                    /// <param name="dwExtraInfo">Дополнительное значение, связанное с нажатием клавиши.</param>
                    [DllImport("user32.dll")]    
                    public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, IntPtr dwExtraInfo);
 
                    /// <summary>
                    /// (переведено гуглом) Синтезирует нажатием клавиши. Система может использовать такие синтезированные клавиши для создания WM_KEYUP или WM_KEYDOWN сообщения. Обработчик прерывания клавиатуры водителя звонки keybd_event функции.
                    /// </summary>
                    /// <param name="bVk">Код виртуальной клавиши.</param>
                    /// <param name="bScan">A hardware scan code for the key.</param>
                    /// <param name="ke">Keyboard Event</param>
                    /// <param name="dwExtraInfo">Дополнительное значение, связанное с нажатием клавиши.</param>
                    public static void keybd_event(Keys bVk, byte bScan, KeyboardEvents ke, IntPtr dwExtraInfo)
                    {
                        keybd_event((byte)bVk, bScan, (uint)ke, dwExtraInfo);
                    }
 
                    /// <summary>
                    /// (переведено гуглом) Синтезирует нажатием клавиши. Система может использовать такие синтезированные клавиши для создания WM_KEYUP или WM_KEYDOWN сообщения. Обработчик прерывания клавиатуры водителя звонки keybd_event функции.
                    /// </summary>
                    /// <param name="bVk">Код виртуальной клавиши.</param>
                    /// <param name="ke">Keyboard Event</param>
                    public static void keybd_event(Keys bVk, KeyboardEvents ke)
                    {
                        keybd_event(bVk, 0, ke, (IntPtr)0);
                    }
                }
            }
        }
 
        public static class Mouse_Input
        {
            public static class Mouse_Input_Reference
            {
                public static class Mouse_Input_Functions
                {
                    /// <summary>
                    /// Управление различными аспектами движения мыши и нажатия кнопок.
                    /// </summary>
                    [Flags]
                    public enum MouseEventFlags
                    {
                        /// <summary>
                        /// The left button is down.
                        /// </summary>
                        LEFTDOWN = 0x00000002,
                        /// <summary>
                        /// The left button is up.
                        /// </summary>
                        LEFTUP = 0x00000004,
                        /// <summary>
                        /// The middle button is down.
                        /// </summary>
                        MIDDLEDOWN = 0x00000020,
                        /// <summary>
                        /// The middle button is up.
                        /// </summary>
                        MIDDLEUP = 0x00000040,
                        /// <summary>
                        /// Movement occurred.
                        /// </summary>
                        MOVE = 0x00000001,
                        /// <summary>
                        /// The dx and dy parameters contain normalized absolute coordinates. If not set, those parameters contain relative data: the change in position since the last reported position. This flag can be set, or not set, regardless of what kind of mouse or mouse-like device, if any, is connected to the system. For further information about relative mouse motion, see the following Remarks section.
                        /// </summary>
                        ABSOLUTE = 0x00008000,
                        /// <summary>
                        /// The right button is down.
                        /// </summary>
                        RIGHTDOWN = 0x00000008,
                        /// <summary>
                        /// The right button is up.
                        /// </summary>
                        RIGHTUP = 0x00000010,
                        /// <summary>
                        /// The wheel has been moved, if the mouse has a wheel. The amount of movement is specified in dwData
                        /// </summary>
                        WHEEL = 0x0800
                    }
 
                    /// <summary>
                    /// Функция mouse_event синтезирует движение мыши и нажатие кнопок.
                    /// </summary>
                    /// <param name="dwFlags">Управление различными аспектами движения мыши и нажатия кнопки.</param>
                    /// <param name="dx">Определяет абсолютные координаты по оси Х, если установлено MOUSEEVENTF_ABSOLUTE, в противном случае определяет смещение по оси Х относительно текущих координат.</param>
                    /// <param name="dy">Определяет абсолютные координаты по оси У, если установлено MOUSEEVENTF_ABSOLUTE, в противном случае определяет смещение по оси У относительно текущих координат.</param>
                    /// <param name="dwData">Если установлено MOUSEEVENTF_WHEEL, то dwData определяет значение движения колесика. Положительное значение показывает, что колесико повернулось вперед, от пользователя; отрицательное значение показывает, что колесико повернулось назад, к пользователю. One wheel click is defined as WHEEL_DELTA, which is 120.</param>
                    /// <param name="dwExtraInfo">Дополнительное значение, связанное с событие мыши. приложение вызывает GetMessageExtraInfo, чтобы получить эту дополнительную информацию.</param>
                    [DllImport("user32.dll")]
                    public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
 
                    /// <summary>
                    /// Функция mouse_event синтезирует движение мыши и нажатие кнопок.
                    /// </summary>
                    /// <param name="mef">Управление различными аспектами движения мыши и нажатия кнопки.</param>
                    /// <param name="dx">Определяет абсолютные координаты по оси Х, если установлено MOUSEEVENTF_ABSOLUTE, в противном случае определяет смещение по оси Х относительно текущих координат.</param>
                    /// <param name="dy">Определяет абсолютные координаты по оси У, если установлено MOUSEEVENTF_ABSOLUTE, в противном случае определяет смещение по оси У относительно текущих координат.</param>
                    /// <param name="dwData">Если установлено MOUSEEVENTF_WHEEL, то dwData определяет значение движения колесика. Положительное значение показывает, что колесико повернулось вперед, от пользователя; отрицательное значение показывает, что колесико повернулось назад, к пользователю. One wheel click is defined as WHEEL_DELTA, which is 120.</param>
                    /// <param name="dwExtraInfo">Дополнительное значение, связанное с событие мыши. приложение вызывает GetMessageExtraInfo, чтобы получить эту дополнительную информацию.</param>
                    public static void mouse_event(MouseEventFlags mef, int dx, int dy, int dwData, int dwExtraInfo)
                    {
                        mouse_event((int)mef, dx, dy, dwData, dwExtraInfo);
                    }
 
                    /// <summary>
                    /// Функция mouse_event синтезирует движение мыши и нажатие кнопок.
                    /// </summary>
                    /// <param name="mef">Управление различными аспектами движения мыши и нажатия кнопки.</param>
                    /// <param name="dx">Определяет абсолютные координаты по оси Х, если установлено MOUSEEVENTF_ABSOLUTE, в противном случае определяет смещение по оси Х относительно текущих координат.</param>
                    /// <param name="dy">Определяет абсолютные координаты по оси У, если установлено MOUSEEVENTF_ABSOLUTE, в противном случае определяет смещение по оси У относительно текущих координат.</param>
                    public static void mouse_event(MouseEventFlags mef, int dx, int dy)
                    {
                        mouse_event(mef, dx, dy, 0, 0);
                    }
                }
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5