Как мне узнать текущий ГЛОБАЛЬНЫЙ тип курсора мыши (песочные часы / стрелка / ..)? В Windows.
Глобальный - мне нужен даже если мышь находится вне моего приложения или даже если моя программа безветренная.
В C#, Delphi или чистый winapi, неважно ...
Заранее большое спасибо!!
tnx за ответ на ваш вопрос через 3 года - мне очень помогло :)





Использование (в Delphi)
Screen.MouseCursor.
Для текущего курсора мыши.
Общий Win32 (user32) дает:
function GetCursor: HCURSOR; stdcall;
Это должно быть доступно для других языков Win32.
Это не правильно. Как я узнал из другого вопроса, GetCursor больше не будет работать для курсоров других программ: stackoverflow.com/questions/358527/…
Обновлено: в Delphi
В большинстве визуальных объектов вы можете использовать свойство Курсор, в противном случае используйте свойство Экран.Курсор. Установка его обратно на crDefault отменяет ваше изменение того, что было установлено ранее.
Это не дает вам курсора за пределами вашей программы.
Чтобы получить информацию о глобальном курсоре, используйте GetCursorInfo.
Вы не можете набрать из него курсор. Просто ручка
Курсоры 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);
Это не отвечает на ваш исходный вопрос, вы заявили, что хотите найти глобальное состояние курсора, и ваш код проверяет только одно возможное состояние. Не считая того, что вы почти точно украли ответ на другой вопрос.
Ответ, который вы упомянули, просто дает вам понять. Не объясняя, что делать дальше.
Кажется, это невозможно :(