2009-01-19 15 views
5

Come si ottiene il tipo di cursore del mouse GLOBAL corrente (clessidra/freccia/..)? In Windows.ottiene il tipo di cursore del mouse corrente

Globale - Mi serve anche se il mouse è esterno alla mia applicazione o anche se il mio programma è senza vento.

In C#, Delphi o pura WinAPI, fa niente ...

Grazie mille in anticipo !!

+0

sembrare la sua non è possibile :( – Alex

+1

tnx per rispondere alla tua domanda 3 anni più tardi - davvero mi ha aiutato :) – barakcaf

risposta

5

Dopo anni è tempo di rispondere alla mia domanda. Ecco come si controlla se la corrente del cursore globale è clessidra in C# (estendere il codice per voi propri bisogni se è necessario):

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

* "Dopo che anni è il momento di rispondere alla mia stessa domanda." * - Perché? Com'è diverso da ciò che ha dichiarato e dimostrato? Cosa rende questa [più] risposta corretta? –

+0

Questo non risponde alla tua domanda originale, hai dichiarato di voler trovare lo stato del cursore globale e il tuo codice controlla solo uno stato possibile. Oltre al fatto che hai rubato la risposta da un'altra domanda quasi esattamente. –

+1

La risposta che hai citato ti dà solo una maniglia. Senza spiegare cosa farai dopo. – Alex

4

Uso (in Delphi)

Screen.MouseCursor. 

Per il cursore del mouse.

generale Win32 (user32) dà:

function GetCursor: HCURSOR; stdcall; 

questo dovrebbe essere disponibile per altre lingue Win32.

+2

Non è giusto. Come ho appreso in un'altra domanda, GetCursor non funzionerà più per i cursori di altri programmi: http: // StackOverflow.it/questions/358527/how-to-tell-if-mouse-pointer-icon-changed –

0

EDIT: In Delphi

Nella maggior parte degli oggetti visivi è possibile usare il cursore proprietà , altrimenti utilizzare il Screen.Cursor propery. Impostarlo di nuovo su crDefault annulla la modifica a qualsiasi impostazione precedente.

+0

Questo non ti dà il cursore fuori dal tuo programma. –

5

Per ottenere le informazioni sul cursore globale, utilizzare GetCursorInfo.

+2

Non è possibile digitare un tipo di cursore. Solo una maniglia – Alex

3

I cursori OEM sono risorse condivise, quindi tutti i processi che richiedono un cursore specifico recupereranno lo stesso handle. Un'applicazione può memorizzare nella cache gli handle del cursore di sistema standard all'avvio, quindi può utilizzare per ottenere l'handle globale del cursore e cercare questo handle nella cache per recuperare il suo tipo - se è di un cursore di sistema.

Il seguente codice di esempio Delphi dimostra. Le maniglie del cursore vengono popolate su un array utilizzando LoadImage alla creazione del modulo. Un timer sondaggi il cursore globale utilizzando GetCursorInfo a intervalli regolari, il codice è-la maniglia nella matrice per recuperare il nome del cursore da una matrice costante di nomi:

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; 

Si noti che quando si utilizza Delphi uno non lo fa devono memorizzare gli handle del cursore nella cache, poiché Delphi lo fa attraverso la sua lista Screen.Cursors. Il codice di esempio non lo usa per avere una portabilità migliore.

Inoltre, non c'è "OCR_HELP" in "winuser.h", ma la costante fornita corrispondente a "IDC_HELP" sembra funzionare correttamente (sebbene non sia stato possibile trovare una finestra di dialogo in W7 che faccia uso della "Guida Seleziona "cursore".