Получение координат курсора на C# без .NET


Большинство программ, использующих положение курсора мыши, должны получать координаты только тогда, когда указатель мыши находится в одном из своих окон. Однако некоторые программы требуют координат экрана, даже если указатель находится за пределами окна.

GetCursorPos

Если вы разрабатываете программное обеспечение для Microsoft Windows, вам может потребоваться получить положение указателя мыши относительно экрана. Если вам нужны координаты указателя, когда он находится над одним из окон вашего приложения, это довольно просто сделать. Однако если ваше приложение должно отслеживать указатель мыши за пределами своих окон или если ваше программное обеспечение вообще не имеет окна, то .NET framework не предоставляет простого способа получения координат. Вместо этого вы должны использовать функцию Windows API с именем "GetCursorPos".

В этой статье мы создадим простую программу на C#, которая отслеживает положение указателя мыши. Мы будем использовать консольное приложение, чтобы показать, что никакие Windows Forms или WPF window не требуются.



Для начала создайте новое консольное приложение и убедитесь, что автоматически созданный класс, содержащий метод Main, открыт.

Ссылка на функцию API

GetCursorPos не может быть вызван непосредственно из C#. Нам нужно ссылаться на него с помощью служб вызова платформы (P/Invoke). Для того, чтобы использовать P/Invoke, но мы должны использовать атрибут из System.Runtime.InteropServices пространства имен. Чтобы упростить доступ к этому пространству имен, добавьте в файл класса следующую директиву using:

using System.Runtime.InteropServices;
Теперь вы можете добавить код, определяющий функцию. GetCursorPos возвращает логическое значение true, если координаты были получены правильно, и false в противном случае. Координаты возвращаются в виде точечной (POINT) структуры с использованием выходного параметра.

Добавьте определение функции в класс:

[DllImport("user32.dll")]
static extern bool GetCursorPos(out POINT lpPoint);
Точечная структура не существует как тип .NET, поэтому нам нужно ее определить. Создайте новый файл с именем "POINT.cs" и добавьте код для структуры:

public struct POINT
{
    public int X;
    public int Y;
}
Вызов GetCursorPos

С определенной функцией GetCursorPos вы можете вызвать ее непосредственно из вашего кода C#. Давайте добавим код к методу Main и содержащему его классу, чтобы многократно вызывать функцию и отображать координаты экрана указателя мыши.

Чтобы уменьшить мерцание при обновлении координат, мы будем показывать новое местоположение только в том случае, если оно отличается от предыдущего значения. Чтобы сохранить старую позицию, создайте два целочисленных поля для координат X и Y, добавив следующий код внутри класса, но вне каких-либо методов:

static int _x, _y;
Теперь мы можем создать метод, который вызывает GetCursorPos и отображает координаты. Нам нужно объявить переменную, которая будет хранить позицию перед передачей ее в функцию API. Нам также нужно проверить, что функция возвращает истинный результат и что указатель мыши переместился, прежде чем мы обновим вывод.

Добавьте в класс следующий метод для выполнения вышеуказанных действий:

static void ShowMousePosition()
{
    POINT point;
    if (GetCursorPos(out point) && point.X != _x && point.Y != _y)
    {
        Console.Clear();
        Console.WriteLine("({0},{1})", point.X, point.Y);
        _x = point.X;
        _y = point.Y;
    }
}
Давайте вызовем вышеупомянутый метод повторно из основного метода до тех пор, пока не будет нажата клавиша. Мы можем управлять этим с помощью простого цикла while, который ожидает свойство Console.KeyAvailable должно быть установлено в значение true. Мы также спрячем курсор консоли до тех пор, пока цикл не закончится, чтобы он не мигал рядом с отображаемыми координатами.

Добавьте следующий код в метод Main:

Console.CursorVisible = false;
while (!Console.KeyAvailable)
{
    ShowMousePosition();
}
Console.CursorVisible = true;
Запустите программу и переместите мышь, чтобы увидеть координаты в окне консоли. Обратите внимание, что текст обновляется правильно, даже если указатель мыши не находится в области консоли и когда активированы другие приложения.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, си шарп, курсор




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Рисуем SVG самостоятельно
Java: найти последнее число больше нуля
Программа "Ловим фокус"