11 Stimmen

liefert den aktuellen Mauszeigertyp

Wie erhalte ich den aktuellen GLOBALen Mauszeigertyp (Sanduhr/Pfeil/ )? Unter Windows.

Global - Ich brauche es auch wenn sich die Maus außerhalb der Anwendung befindet oder auch wenn mein Programm windstill ist.

In C#, Delphi oder reinem Winapi, ganz egal...

Vielen Dank im Voraus!!

8voto

Alex from Jitbit Punkte 44084

Nach drei Jahren ist es an der Zeit, meine eigene Frage zu beantworten. Hier ist, wie Sie überprüfen, ob der aktuelle globale Cursor ist Sanduhr in C # (erweitern Sie den Code für Ihre eigenen Bedürfnisse, 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);

5voto

gabr Punkte 26255

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

4voto

Toon Krijthe Punkte 51819

Verwendung (in Delphi)

Screen.MouseCursor.

Für den aktuellen Mauszeiger.

Allgemeine Win32 (user32) gibt:

function GetCursor: HCURSOR; stdcall;

Dies sollte auch für andere Win32-Sprachen verfügbar sein.

4voto

Sertac Akyuz Punkte 53381

OEM-Cursor sind gemeinsam genutzte Ressourcen, so dass alle Prozesse, die einen bestimmten Cursor anfordern, denselben Handle abrufen. Eine Anwendung kann Standard-System-Cursor-Handles beim Start zwischenspeichern, dann kann sie GetCursorInfo um den globalen Cursor-Handle zu erhalten und diesen Handle im Cache nachzuschlagen, um seine freundlich - wenn es sich um einen Systemcursor handelt.

Der folgende Delphi-Beispielcode demonstriert dies. Cursor-Handles werden in ein Array eingefügt, indem man LoadImage bei der Formularerstellung. Ein Timer fragt den globalen Cursor ab, indem er GetCursorInfo In regelmäßigen Abständen sucht der Code den Handle im Array, um den Namen des Cursors aus einem 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 man bei der Verwendung von Delphi keine Cursor-Handles zwischenspeichern muss, da Delphi dies durch seine Bildschirm.Cursor Liste. Der Beispielcode verwendet sie nicht, um eine bessere Portabilität zu erreichen.

Beachten Sie auch, dass es kein 'OCR_HELP' in 'winuser.h' gibt, aber die bereitgestellte Konstante, die 'IDC_HELP' entspricht, scheint gut zu funktionieren (obwohl ich keinen Dialog in W7 finden konnte, der den "Help Select"-Cursor verwendet).

0voto

Drejc Punkte 13878

EDIT: In Delphi

In den meisten visuellen Objekten können Sie die Cursor Eigenschaft, ansonsten verwenden Sie die Bildschirm.Cursor Eigentum. Zurücksetzen auf crDefault macht die Änderung an dem zuvor eingestellten Wert rückgängig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X