2016-08-27 5 views
1

ここではマウスの現在のアイコンを文字列として取得するコードを見ましたが、このコードではTTimerを使用していました。マウスアイコンの変更を検出するための「リスナー」

私はマウスカーソルアイコン上でこれらの変更を検出するためのイベント(リスナー)が存在するかどうかを知りたいです。アプリケーションは、イベントをリッスン

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; 
+0

あなたが聞いたことをすることに意味はありません。マウスカーソルは、プログラムが何をしているのか、ユーザーが何ができる/できないのかについての視覚的な手がかりを与えるために、オプションで**変更可能です。カーソルは実際には状態情報の複製であり、非常に一般的なバグは、カーソルがプログラムの内部状態を常に正確に反映するとは限らないということです。カーソルの状態が何であるかを判断したとしても、その情報は意味がありません。あなたの本当の**問題は何ですか?(実際の問​​題を新しい質問として投稿してください) –

+0

PS:デスクトップ/ウィンドウ上のカーソルの位置さえも、どのアイコンが影響を受けることに注意してください中古。 –

+0

[ソース](http://stackoverflow.com/a/4184046/243614)。 –

答えて

2

方法は、Windowsのメッセージを介してである:以下

TTimer使用するコードです。カーソルイメージが変更されたときにメッセージは送信されないので、何も聞くことはありません。タイマーを使用するコードが唯一の可能性です。

Windowsがカーソル用に提供する機能と通知については、MSDNのCursorsを参照してください。

+0

実際、カーソルを変更したときにアプリケーションを気にする論理的な理由は想像もできません。 –

関連する問題