2009-01-19 23 views
5

Wie bekomme ich den aktuellen GLOBAL Mauszeiger Typ (Sanduhr/Pfeil/..)? In Windows.erhalten aktuellen Mauszeiger Typ

Global - Ich brauche es auch wenn die Maus außerhalb meiner Anwendung ist oder auch wenn mein Programm windlowless ist.

In C#, Delphi oder reine winapi, macht nichts ...

Vielen Dank im Voraus !!

+0

Scheinen, wie es ist nicht möglich :( – Alex

+1

tnx für Ihre Frage 3 Jahre später zu beantworten - wirklich hat mir geholfen :) – barakcaf

Antwort

5

Nach den Jahren ist es Zeit, meine eigene Frage zu beantworten. Hier ist, wie Sie überprüfen, ob die aktuellen globalen Cursor Sanduhr in C# (erweitern Sie den Code für Sie Bedürfnisse besitzen, wenn Sie benötigen):

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

* "Nach den Jahren ist es Zeit, meine eigene Frage zu beantworten." * - Warum? Wie ist das anders als das, was gabr und ich demonstriert? Was macht das zur richtigen Antwort? –

+0

Dies beantwortet nicht Ihre ursprüngliche Frage, Sie haben angegeben, dass Sie den globalen Cursor-Status finden möchten, und Ihr Code überprüft nur einen möglichen Status. Neben der Tatsache, dass Sie die Antwort von einer anderen Frage fast genau gestohlen haben. –

+1

Die Antwort, die Sie erwähnen, gibt Ihnen nur einen Griff. Ohne zu erklären, was du als nächstes tust. – Alex

4

Use (in Delphi)

Screen.MouseCursor. 

Für den aktuellen Mauszeigers.

Allgemeine Win32 (user32) ergibt:

function GetCursor: HCURSOR; stdcall; 

Dies sollte für andere win32 Sprachen verfügbar sein.

+2

Das ist nicht richtig. Wie ich in einer anderen Frage erfahren habe, wird GetCursor nicht mehr für die Cursors anderer Programme funktionieren: http: // stackoverflow.com/questions/358527/how-to-tell-wenn-Mauszeiger-Symbol-geändert –

0

EDIT: In Delphi

In den meisten visuellen Objekten können Sie den Cursor Eigenschaft verwenden, da sonst die Screen.Cursor propery verwenden. Zurücksetzen auf crDefault storniert Ihre Änderung auf das, was zuvor festgelegt wurde.

+0

Das gibt Ihnen nicht den Cursor außerhalb Ihres Programms. –

5

Um Informationen über den globalen Cursor zu erhalten, verwenden Sie GetCursorInfo.

+2

Sie können keinen Cursortyp von ihm eingeben. Nur ein Griff – Alex

3

OEM-Cursor sind freigegebene Ressourcen. Daher rufen alle Prozesse, die einen bestimmten Cursor anfordern, denselben Handle ab. Eine Anwendung kann Standardsystemcursor-Handles beim Start zwischenspeichern, dann kann sie GetCursorInfo verwenden, um das globale Cursorhandle abzurufen, und dieses Handle im Cache suchen, um abzurufen - wenn es sich um einen Systemcursor handelt.

Der folgende Delphi-Beispielcode demonstriert. Cursor-Handles werden in einem Array unter Verwendung von LoadImage bei der Formularerstellung ausgefüllt. Ein Timer fragt den globalen Cursor durch GetCursorInfo in regelmäßigen Abständen mit, sucht-up der Code den Griff in dem Feld, um den Cursor Namen von einer konstanten Array von Namen abzurufen:

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; 

Beachten Sie, dass bei der Verwendung einer Delphi nicht müssen Cursor-Handles zwischenspeichern, da Delphi es durch seine Screen.Cursors Liste macht. Der Beispielcode verwendet es nicht, um eine bessere Portabilität zu haben.

Beachten Sie auch, dass es in 'winuser.h' kein 'OCR_HELP' gibt, aber die angegebene Konstante 'IDC_HELP' scheint gut zu funktionieren (obwohl ich in W7 keinen Dialog gefunden habe, der die "Hilfe" nutzt Wählen Sie "Cursor".

Verwandte Themen