2009-01-19 7 views
5

Comment obtenir le type de curseur de souris GLOBAL actuel (sablier/flèche/..)? Dans Windowsobtenir le type de curseur de la souris en cours

Global - j'en ai besoin même si la souris est à l'extérieur de mon application ou même si mon programme est sans vent.

En C#, Delphi ou winapi pur, tant pis ...

Merci beaucoup à l'avance !!

+0

Semble comme son impossible :( – Alex

+1

TNX pour répondre à votre question 3 ans plus tard - vraiment m'a aidé :) – barakcaf

Répondre

5

Après des années il est temps de répondre à ma propre question. Voici comment vérifier si le curseur global actuel est Hourglass en C# (étendre le code pour vos propres besoins si vous avez besoin):

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

* "Après des années il est temps de répondre à ma propre question." * - Pourquoi? En quoi est-ce différent de ce que gabr a déclaré et que j'ai démontré? Qu'est-ce qui fait que c'est la réponse [plus] correcte? –

+0

Cela ne répond pas à votre question initiale, vous avez déclaré que vous vouliez trouver l'état du curseur global et votre code vérifie seulement un état possible. Outre le fait que vous avez volé la réponse d'une autre question presque exactement. –

+1

La réponse que vous mentionnez vous donne juste une poignée. Sans expliquer ce que vous faites ensuite. – Alex

4

Utilisation (Delphi)

Screen.MouseCursor. 

Pour le curseur de la souris.

Win32 générale (user32) donne:

function GetCursor: HCURSOR; stdcall; 

devrait être disponible pour les autres langues win32.

+2

Ce n'est pas correct. Comme je l'ai appris dans une autre question, GetCursor ne fonctionnera plus pour les curseurs d'autres programmes: http: // stackoverflow.com/questions/358527/comment-dire-si-mouse-pointer-icon-changed –

0

EDIT: Dans Delphi

Dans la plupart des objets visuels, vous pouvez utiliser la propriété curseur, sinon utilisez le Screen.Cursor propery. Remise à crDefault annule votre modification à tout ce qui a été défini auparavant.

+0

Cela ne vous donne pas le curseur en dehors de votre programme. –

5

Pour obtenir les informations sur le curseur global, utilisez GetCursorInfo.

+2

Vous ne pouvez pas saisir un type de curseur. Juste une poignée – Alex

3

Les curseurs OEM étant des ressources partagées, tous les processus demandant un curseur spécifique récupèrent le même handle. Une application peut mettre en cache les poignées de curseur système standard au démarrage, puis utiliser GetCursorInfo pour obtenir le handle de curseur global et rechercher ce handle dans le cache pour récupérer son kind - s'il s'agit d'un curseur système.

L'exemple de code Delphi ci-dessous illustre. Les poignées de curseur sont remplies dans un tableau en utilisant LoadImage lors de la création du formulaire. Un scrutin de minuterie, le curseur global en utilisant GetCursorInfo à intervalles réguliers, le code semble-la poignée dans le tableau pour récupérer le nom du curseur à partir d'une constante tableau de noms:

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; 

Notez que lorsque vous utilisez un Delphi ne avoir à mettre en cache les poignées de curseur, puisque Delphi le fait à travers sa liste Screen.Cursors. L'exemple de code ne l'utilise pas pour avoir une meilleure portabilité.

Notez également qu'il n'y a pas de 'OCR_HELP' dans 'winuser.h', mais la constante fournie correspondant à 'IDC_HELP' semble fonctionner correctement (bien que je n'ai pas trouvé de dialogue dans W7 qui utilise le Sélectionnez "curseur".

Questions connexes