Определение глобального типа курсора мыши в операционной системе Windows
Вопрос пользователя заключается в поиске способа определения глобального типа курсора мыши в операционной системе Windows, который был бы доступен даже вне контекста приложения или в случае, если приложение не имеет окон. Решение должно быть применимо для языков программирования C#, Delphi и чистого WinAPI.
Решение проблемы
Для получения информации о глобальном курсоре мыши в Windows, можно использовать функцию GetCursorInfo, которая предоставляет информацию о текущем курсоре. В Delphi эта функция может быть вызвана следующим образом:
uses
Winapi.Windows;
var
CursorInfo: TCursorInfo;
begin
CursorInfo.cbSize := SizeOf(TCursorInfo);
if GetCursorInfo(CursorInfo) then
// Здесь можно обработать информацию о курсоре
end;
Обратите внимание, что GetCursorInfo возвращает только дескриптор курсора, и для определения типа курсора необходимо иметь кэш дескрипторов системных курсов, созданный при старте приложения. Пример такого кэша и функции для определения типа курсора приведен ниже:
const
HighCursor = 13;
// ... список констант OEMCursors и CursorNames ...
type
TForm1 = class(TForm)
// ... компоненты формы ...
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
// ... другие методы ...
private
FCursorHandles: array [0..HighCursor] of HCURSOR;
// ... другие приватные поля ...
public
end;
implementation
// ... инициализация кэша дескрипторов при старте формы ...
procedure TForm1.Timer1Timer(Sender: TObject);
var
CursorInfo: TCursorInfo;
begin
CursorInfo.cbSize := SizeOf(CursorInfo);
if GetCursorInfo(CursorInfo) then
Label1.Caption := GetCursorName(CursorInfo.hCursor)
else
Label1.Caption := 'Fail: ' + SysErrorMessage(GetLastError);
end;
function TForm1.GetCursorName(Cursor: HCURSOR): string;
begin
// ... функция для определения названия курсора по его дескриптору ...
end;
Функция GetCursorName ищет в кэше дескриптор, соответствующий текущему глобальному курсору, и возвращает его название из предварительно заданного массива.
Альтернативный ответ на C
Для получения информации о том, является ли глобальный курсор часовым (hourglass), можно использовать следующий код на C#:
private static bool IsWaitCursor()
{
var h = Cursors.WaitCursor.Handle;
CURSORINFO pci;
pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
if(!GetCursorInfo(out pci))
throw new Win32Exception(Marshal.GetLastWin32Error());
return pci.hCursor == h;
}
Используя эту информацию, можно расширить функционал для проверки других типов курсора по аналогии с проверкой на часовой курсор.
Заключение
Получение глобального типа курсора мыши в Windows является задачей, требующей использования функций WinAPI, таких как GetCursorInfo. Для использования этой информации в приложениях на Delphi и C# необходимо создать кэш дескрипторов системных курсора и реализовать функцию для сопоставления дескриптора с типом курсора.
Пользователь интересуется способами определения глобального типа курсора мыши в операционной системе Windows для использования в приложениях на C#, Delphi и чистом WinAPI.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.