2009-01-19 11 views
5

¿Cómo obtengo el tipo de cursor del mouse GLOBAL actual (reloj de arena/flecha/..)? En Windows.obtener el cursor del mouse actual tipo

Global - Lo necesito incluso si el mouse está fuera de mi aplicación o incluso si mi programa es sin viento.

En C#, Delphi o winapi puro, no importa ...

Muchas gracias de antemano !!

+0

parecer no es posible :( – Alex

+1

TNX para responder a su pregunta 3 años más tarde - en realidad me ayudó :) – barakcaf

Respuesta

5

Después de años es hora de responder a mi propia pregunta. Así es como se comprueba si el cursor global actual es el reloj de arena en C# (extender el código para que el propietario necesidades si es necesario):

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); 
+1

* "Después de años, es hora de responder mi propia pregunta". * - ¿Por qué? ¿Cómo es esto diferente de lo que declaró Gabr y yo demostré? ¿Qué hace que esta sea la respuesta [más] correcta? –

+0

Esto no responde a su pregunta original, indicó que quería encontrar el estado del cursor global y su código solo verifica un estado posible. Además del hecho de que robaste la respuesta de otra pregunta casi exactamente. –

+1

La respuesta que mencionas solo te da un control. Sin explicarme qué harás a continuación. – Alex

4

Uso (en Delphi)

Screen.MouseCursor. 

Para el actual del cursor del ratón.

general Win32 (user32) da:

function GetCursor: HCURSOR; stdcall; 

Esto debería estar disponible para otros idiomas Win32.

+2

Eso no está bien. Como aprendí en otra pregunta, GetCursor ya no funcionará para los cursores de otros programas: http: // stackoverflow.com/questions/358527/how-to-tell-if-mouse-pointer-icon-changed –

0

EDIT: En Delphi

En la mayoría de los objetos visuales se puede utilizar el cursor propiedad , de lo contrario el uso Screen.Cursor hotel fenomenal. Volviéndolo a crDefault cancela su cambio a lo que estaba configurado anteriormente.

+0

Eso no le da el cursor fuera de su programa. –

5

Para obtener la información sobre el cursor global, use GetCursorInfo.

+2

No puede un tipo de cursor desde él. Solo un identificador – Alex

3

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 identificadores de cursor del sistema estándar al inicio, luego puede usar GetCursorInfo para obtener el control del cursor global y buscar este manejador en la memoria caché para recuperar tipo - si se trata de un cursor del sistema.

El siguiente código de muestra Delphi se muestra. Los identificadores de cursor se completan en una matriz utilizando LoadImage en la creación del formulario. Un temporizador urnas el cursor global utilizando GetCursorInfo a intervalos regulares, el código se ve arriba del mango de 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 cuando se utiliza Delphi no lo hace tiene que guardar en la memoria caché los controles 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 hace uso de la "Ayuda Seleccione "cursor".

Cuestiones relacionadas