2009-01-19 55 views
5

Làm cách nào để nhận loại con trỏ chuột GLOBAL hiện tại (đồng hồ cát/mũi tên/..)? Trong Windows.lấy loại con trỏ chuột hiện tại

Toàn cầu - Tôi cần nó ngay cả khi con chuột nằm trong ứng dụng của tôi hoặc thậm chí nếu chương trình của tôi không có gió.

Trong C#, Delphi hoặc pure winapi, không bao giờ ...

Cảm ơn bạn rất nhiều trước !!

+0

Có vẻ như không có thể của nó :( – Alex

+1

tnx để trả lời câu hỏi của bạn 3 năm sau - thực sự đã giúp tôi :) – barakcaf

Trả lời

5

Sau nhiều năm, hãy trả lời câu hỏi của riêng tôi. Đây là cách bạn kiểm tra xem con trỏ toàn cầu hiện nay là đồng hồ cát trong C# (mở rộng mã cho bạn sở hữu nhu cầu nếu bạn cần):

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

* "Sau nhiều năm, thời gian để trả lời câu hỏi của riêng tôi." * - Tại sao? Điều này khác với những gì gabr đã nói và tôi đã chứng minh? Điều gì làm cho câu trả lời chính xác hơn này? –

+0

Điều này không trả lời câu hỏi ban đầu của bạn, bạn đã tuyên bố rằng bạn muốn tìm trạng thái con trỏ toàn cục và mã của bạn chỉ kiểm tra một trạng thái có thể. Bên cạnh thực tế là bạn đã đánh cắp câu trả lời từ một câu hỏi khác gần như chính xác. –

+1

Câu trả lời bạn đề cập chỉ cung cấp cho bạn một xử lý. Không giải thích về những gì bạn làm tiếp theo. – Alex

4

sử dụng (trong Delphi)

Screen.MouseCursor. 

Đối với con trỏ chuột hiện tại.

chung Win32 (user32) cho:

function GetCursor: HCURSOR; stdcall; 

này nên có sẵn cho các ngôn ngữ win32 khác.

+2

Điều đó không đúng. Như tôi đã học trong một câu hỏi khác, GetCursor sẽ không hoạt động cho các con trỏ của chương trình khác nữa: http: // stackoverflow.com/questions/358527/how-to-tell-if-chuột-con trỏ-biểu tượng-thay đổi –

0

EDIT: Trong Delphi

Trong hầu hết các đối tượng hình ảnh mà bạn có thể sử dụng Cursor tài sản, nếu không sử dụng Screen.Cursor propery. Đặt lại thành crDefault hủy thay đổi của bạn thành bất kỳ thay đổi nào được đặt trước đó.

+0

Điều đó không cung cấp cho bạn con trỏ bên ngoài chương trình của bạn. –

5

Để nhận thông tin về con trỏ toàn cục, hãy sử dụng GetCursorInfo.

+2

Bạn không thể loại con trỏ từ nó. Chỉ cần một tay cầm – Alex

3

Con trỏ OEM là tài nguyên được chia sẻ, vì vậy tất cả quy trình yêu cầu một con trỏ cụ thể sẽ truy xuất cùng một điều khiển. Một ứng dụng có thể lưu cache xử lý con trỏ hệ thống chuẩn khi khởi động, sau đó nó có thể sử dụng GetCursorInfo để xử lý con trỏ toàn cục và tra cứu bộ xử lý này trong bộ nhớ cache để truy xuất loại - nếu nó là con trỏ hệ thống.

Mã mẫu dưới Delphi minh họa. Con trỏ con trỏ được điền vào một mảng bằng cách sử dụng LoadImage khi tạo biểu mẫu. Một giờ các cuộc thăm dò con trỏ toàn cầu bằng cách sử dụng GetCursorInfo đều đặn, các mã trông lên tay cầm trong mảng để lấy tên của con trỏ từ một mảng liên tục của tên:

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; 

Lưu ý rằng khi sử dụng Delphi một không có bộ nhớ cache xử lý con trỏ, kể từ Delphi hiện nó thông qua danh sách Screen.Cursors của nó. Mã mẫu không sử dụng nó để có tính di động tốt hơn. Cũng cần lưu ý rằng không có 'OCR_HELP' trong 'winuser.h', nhưng hằng số được cung cấp tương ứng với 'IDC_HELP' có vẻ hoạt động tốt (mặc dù tôi không thể tìm thấy hộp thoại trong W7 sử dụng "Trợ giúp Chọn "con trỏ".

Các vấn đề liên quan