получить текущий тип курсора мыши - PullRequest
5 голосов
/ 19 января 2009

Как получить текущий тип курсора мыши GLOBAL (песочные часы / стрелка / ..)? В Windows.

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

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

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

Ответы [ 5 ]

5 голосов
/ 29 июня 2014

Спустя годы пришло время ответить на мой собственный вопрос. Вот как вы проверяете, является ли текущий глобальный курсор «песочными часами» в 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);
5 голосов
/ 19 января 2009

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

4 голосов
/ 19 января 2009

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

Screen.MouseCursor.

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

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

function GetCursor: HCURSOR; stdcall;

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

3 голосов
/ 15 ноября 2010

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 делает это через свой список Screen.Cursors . Пример кода не использует его для лучшей переносимости.

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

0 голосов
/ 19 января 2009

РЕДАКТИРОВАТЬ: In Delphi

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

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