代码之家  ›  专栏  ›  技术社区  ›  Alex from Jitbit

获取当前鼠标光标类型

  •  5
  • Alex from Jitbit  · 技术社区  · 15 年前

    如何获取当前全局鼠标光标类型(沙漏/箭头/)?在窗户里。

    即使鼠标在我的应用程序之外 即使我的程序没有风。

    在C#、Delphi或纯winapi中,无需考虑。。。

    5 回复  |  直到 14 年前
        1
  •  6
  •   Alex from Jitbit    10 年前

    多年以后,是时候回答我自己的问题了。下面是如何检查当前全局光标是否是C#中的沙漏(如果需要,请根据自己的需要扩展代码):

    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);
    
        2
  •  5
  •   gabr    15 年前

    要获取有关全局游标的信息,请使用 GetCursorInfo .

        3
  •  4
  •   Toon Krijthe Paul    15 年前

    使用(在Delphi中)

    Screen.MouseCursor.
    

    对于当前鼠标光标。

    常规Win32(user32)提供:

    function GetCursor: HCURSOR; stdcall;
    

    这应该适用于其他win32语言。

        4
  •  4
  •   Sertac Akyuz    14 年前

    OEM游标是共享资源,因此所有请求特定游标的进程都将检索相同的句柄。应用程序可以在启动时缓存标准系统游标句柄,然后使用 GetCursorInfo 获取全局游标句柄,并在缓存中查找该句柄以检索其 -如果它是一个系统游标。

    下面的Delphi示例代码演示了这一点。光标句柄通过使用填充到数组中 LoadImage 在表单创建时。计时器通过使用轮询全局游标 GetCursorInfo 每隔一定时间,代码会在数组中查找句柄,以从名称的常量数组中检索光标的名称:

    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;
    

    Screen.Cursors 列表示例代码没有使用它来提高可移植性。

    还要注意的是,'winuser.h'中没有'OCR_HELP',但提供的与'IDC_HELP'相对应的常量似乎工作正常(尽管我在W7中找不到使用“HELP Select”光标的对话框)。

        5
  •  0
  •   Drejc    15 年前

    在大多数可视对象中,可以使用 光标 属性,否则使用 财产。 crDefault 取消对之前设置的内容的更改。