Получить текущий тип курсора мыши

Как мне узнать текущий ГЛОБАЛЬНЫЙ тип курсора мыши (песочные часы / стрелка / ..)? В Windows.

Глобальный - мне нужен даже если мышь находится вне моего приложения или даже если моя программа безветренная.

В C#, Delphi или чистый winapi, неважно ...

Заранее большое спасибо!!

Кажется, это невозможно :(

Alex from Jitbit 19.08.2010 22:14

tnx за ответ на ваш вопрос через 3 года - мне очень помогло :)

barakcaf 05.04.2015 17:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
2
9 407
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Использование (в Delphi)

Screen.MouseCursor.

Для текущего курсора мыши.

Общий Win32 (user32) дает:

function GetCursor: HCURSOR; stdcall;

Это должно быть доступно для других языков Win32.

Это не правильно. Как я узнал из другого вопроса, GetCursor больше не будет работать для курсоров других программ: stackoverflow.com/questions/358527/…

Rob Kennedy 20.01.2009 02:58

Обновлено: в Delphi

В большинстве визуальных объектов вы можете использовать свойство Курсор, в противном случае используйте свойство Экран.Курсор. Установка его обратно на crDefault отменяет ваше изменение того, что было установлено ранее.

Это не дает вам курсора за пределами вашей программы.

Rob Kennedy 20.01.2009 03:00

Чтобы получить информацию о глобальном курсоре, используйте GetCursorInfo.

Вы не можете набрать из него курсор. Просто ручка

Alex from Jitbit 11.11.2010 15:44

Курсоры OEM являются общими ресурсами, поэтому все процессы, запрашивающие конкретный курсор, будут получать один и тот же дескриптор. Приложение может кэшировать стандартные дескрипторы системного курсора при запуске, затем оно может использовать GetCursorInfo для получения дескриптора глобального курсора и искать этот дескриптор в кэше, чтобы получить его своего рода - если это системный курсор.

Приведенный ниже пример кода Delphi демонстрирует. Дескрипторы курсора заносятся в массив с помощью LoadImage при создании формы. Таймер опрашивает глобальный курсор, используя GetCursorInfo через равные промежутки времени, код ищет дескриптор в массиве, чтобы получить имя курсора из постоянного массива имен:

const
  HighCursor = 13;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    FCursorHandles: array [0..HighCursor] of HCURSOR;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  OEMCursors: array [0..HighCursor] of Integer = (OCR_NORMAL, OCR_IBEAM,
      OCR_WAIT, OCR_CROSS, OCR_UP, OCR_SIZENWSE, OCR_SIZENESW, OCR_SIZEWE,
      OCR_SIZENS, OCR_SIZEALL, OCR_NO, OCR_HAND, OCR_APPSTARTING,
      32651 {OCR_HELP?});

  CursorNames: array [0..HighCursor] of string = ('OCR_NORMAL', 'OCR_IBEAM',
      'OCR_WAIT', 'OCR_CROSS', 'OCR_UP', 'OCR_SIZENWSE', 'OCR_SIZENESW',
      'OCR_SIZEWE', 'OCR_SIZENS', 'OCR_SIZEALL', 'OCR_NO', 'OCR_HAND',
      'OCR_APPSTARTING', 'OCR_HELP');

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to HighCursor do
    FCursorHandles[i] := LoadImage(0, MakeIntResource(OEMCursors[i]),
        IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR or LR_DEFAULTSIZE or LR_SHARED);
end;

procedure TForm1.Timer1Timer(Sender: TObject);

  function GetCursorName(Cursor: HCURSOR): string;
  var
    i: Integer;
  begin
    for i := 0 to HighCursor do
      if Cursor = FCursorHandles[i] then begin
        Result := CursorNames[i];
        Exit;
      end;
    Result := 'Unknown Cursor';  // A custom cursor.
  end;

var
  CursorInfo: TCursorInfo;
begin
  CursorInfo.cbSize := SizeOf(CursorInfo);
  if GetCursorInfo(CursorInfo) then
    Label1.Caption := GetCursorName(CursorInfo.hCursor)
  else
    Label1.Caption := 'Fail: ' + SysErrorMessage(GetLastError);
end;

Обратите внимание, что при использовании Delphi не нужно кэшировать дескрипторы курсора, поскольку Delphi делает это через свой список Экран. Курсоры. В примере кода он не используется для лучшей переносимости.

Также обратите внимание, что в winuser.h нет «OCR_HELP», но предоставленная константа, соответствующая «IDC_HELP», кажется, работает нормально (хотя я не смог найти диалоговое окно в W7, в котором используется курсор «Help Select») .

Ответ принят как подходящий

По прошествии трех лет пришло время ответить на мой вопрос. Вот как вы проверяете, является ли текущий глобальный курсор песочными часами в C# (при необходимости расширьте код для своих нужд):

private static bool IsWaitCursor()
{
    var h = Cursors.WaitCursor.Handle;

    CURSORINFO pci;
    pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
    GetCursorInfo(out pci);

    return pci.hCursor == h;
}

[StructLayout(LayoutKind.Sequential)]
struct POINT
{
    public Int32 x;
    public Int32 y;
}

[StructLayout(LayoutKind.Sequential)]
struct CURSORINFO
{
    public Int32 cbSize;        // Specifies the size, in bytes, of the structure. 
    // The caller must set this to Marshal.SizeOf(typeof(CURSORINFO)).
    public Int32 flags;         // Specifies the cursor state. This parameter can be one of the following values:
    //    0             The cursor is hidden.
    //    CURSOR_SHOWING    The cursor is showing.
    public IntPtr hCursor;          // Handle to the cursor. 
    public POINT ptScreenPos;       // A POINT structure that receives the screen coordinates of the cursor. 
}

[DllImport("user32.dll")]
static extern bool GetCursorInfo(out CURSORINFO pci);
«По прошествии трех лет пришло время ответить на мой собственный вопрос». - Почему? Чем это отличается от того, о чем говорил Габр и что я продемонстрировал? Что делает этот [более] правильный ответ?
Sertac Akyuz 02.09.2016 01:03

Это не отвечает на ваш исходный вопрос, вы заявили, что хотите найти глобальное состояние курсора, и ваш код проверяет только одно возможное состояние. Не считая того, что вы почти точно украли ответ на другой вопрос.

Lemuel Botha 26.01.2017 18:43

Ответ, который вы упомянули, просто дает вам понять. Не объясняя, что делать дальше.

Alex from Jitbit 21.06.2017 13:24

Другие вопросы по теме