C# 获取当前鼠标光标类型

C# 获取当前鼠标光标类型,c#,delphi,winapi,vb6,C#,Delphi,Winapi,Vb6,如何获取当前全局鼠标光标类型沙漏/箭头/。。?在窗户里 全局-即使鼠标在我的应用程序之外,或者即使我的程序没有风,我也需要它 在C、Delphi或纯winapi中,无需担心 提前非常感谢 在Delphi中的使用 Screen.MouseCursor. 对于当前鼠标光标 常规Win32 user32提供: function GetCursor: HCURSOR; stdcall; 这应该适用于其他win32语言。编辑:在Delphi中 在大多数可视对象中,可以使用Cursor属性,否则可以使用

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

全局-即使鼠标在我的应用程序之外,或者即使我的程序没有风,我也需要它

在C、Delphi或纯winapi中,无需担心

提前非常感谢

在Delphi中的使用

Screen.MouseCursor.
对于当前鼠标光标

常规Win32 user32提供:

function GetCursor: HCURSOR; stdcall;
这应该适用于其他win32语言。

编辑:在Delphi中

在大多数可视对象中,可以使用Cursor属性,否则可以使用Screen.Cursor属性。
将其设置回crDefault将取消对之前设置的任何更改。

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

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

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

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;
请注意,当使用Delphi时,不必缓存光标句柄,因为Delphi是通过其列表进行缓存的。示例代码没有使用它来提高可移植性


还要注意的是,'winuser.h'中没有'OCR_HELP',但提供的与'IDC_HELP'相对应的常数似乎工作正常,尽管我在W7中找不到使用帮助选择光标的对话框。

多年后,是时候回答我自己的问题了。以下是如何检查当前全局光标是否为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);

那是不对的。正如我在另一个问题中了解到的,GetCursor将不再适用于其他程序的游标:这不会给你程序外的游标。似乎这是不可能的:tnx在3年后回答你的问题-真的帮助了我:你不能从中键入游标。只是一个手电筒,是时候回答我自己的问题了为什么?这与gabr陈述的和我演示的有什么不同?是什么使这成为[更]正确的答案?这并没有回答您最初的问题,您声明要查找全局游标状态,而您的代码只检查一种可能的状态。除此之外,你几乎完全是从另一个问题中窃取了答案。你提到的答案只是给了你一个把柄。没有解释你下一步做什么。