c# - tipos - obtener el tipo de cursor del mouse actual
puntero en forma de mano (5)
EDITAR: En Delphi
En la mayoría de los objetos visuales, puede usar la propiedad Cursor ; de lo contrario, use la propiedad Screen.Cursor . Al volver a establecerlo, crDefault cancela su cambio a lo que estaba configurado anteriormente.
¿Cómo obtengo el tipo de cursor de mouse GLOBAL actual (reloj de arena / flecha / ...)? En Windows.
Global: lo necesito incluso si el mouse está fuera de mi aplicación o incluso si mi programa no tiene viento.
En C #, Delphi o winapi puro, no importa ...
¡¡Muchas gracias por adelantado!!
Para obtener la información en el cursor global, use GetCursorInfo .
Uso (en Delphi)
Screen.MouseCursor.
Para el cursor del mouse actual.
General Win32 (user32) da:
function GetCursor: HCURSOR; stdcall;
Esto debería estar disponible para otros idiomas win32.
Los cursores OEM son recursos compartidos, por lo que todos los procesos que soliciten un cursor específico recuperarán el mismo identificador. Una aplicación puede almacenar en caché los controles de cursor del sistema estándar al inicio, luego puede usar GetCursorInfo para obtener el control del cursor global y buscar este manejador en el caché para recuperar su clase , si es de un cursor del sistema.
El siguiente código de muestra Delphi lo demuestra. Los identificadores del cursor se completan en una matriz mediante el uso de LoadImage en la creación del formulario. Un temporizador sondea el cursor global utilizando GetCursorInfo a intervalos regulares, el código busca el controlador en la matriz para recuperar el nombre del cursor de una matriz constante de nombres:
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;
Tenga en cuenta que al utilizar Delphi, no es necesario almacenar en caché los manejadores del cursor, ya que Delphi lo hace a través de su lista Screen.Cursors . El código de muestra no lo usa para tener una mejor portabilidad.
También tenga en cuenta que no hay ''OCR_HELP'' en ''winuser.h'', pero la constante proporcionada correspondiente a ''IDC_HELP'' parece funcionar bien (aunque no pude encontrar un diálogo en W7 que utiliza el cursor de "Ayuda Seleccionar") .
Después de años, es hora de responder a mi propia pregunta. Así es como se comprueba si el cursor global actual es reloj de arena en C # (amplíe el código para sus propias necesidades si lo necesita):
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);