マウスカーソルの側に追従して何らかの情報を表示するソフトを
検討しています。
マウスカーソルには矢印やIなど色々な形状がありますが、
矢印のときだけマウスカーソルの側に小さなフォームを表示させ、
それ以外では非表示にしようと思っています。
そこで、現在どのような形状になっているかを知らないと
いけないのですが、これを知る方法はないでしょうか?
真琴:「質問の人は、現在のカーソルの形が"矢印"かどうかを知りたいのよね?」
春子:「特定のカーソルであるかどうか、それを知るのは簡単だよ、マコト」
procedure TForm1.Button1Click(Sender: TObject);
var
hc: HCURSOR;
begin
var
hc: HCURSOR;
begin
if GetCursor = LoadCursor(0, IDC_ARROW) then Caption := '矢印カーソルだよ';
hc := LoadCursor(0, IDC_WAIT);
SetCursor(hc);
Sleep(1000);
if GetCursor <> LoadCursor(0, IDC_ARROW) then Caption := '今は矢印カーソルじゃない';
Sleep(1000);
if GetCursor = LoadCursor(0, IDC_WAIT) then Caption := '今は砂時計カーソルだよ';
Sleep(1000);
hc := LoadCursor(0, IDC_ARROW);
SetCursor(hc);
if GetCursor = LoadCursor(0, IDC_ARROW) then Caption := '矢印カーソルに戻ったよ';
end;
真琴:「ナルホドぉ、これで判定出来ちゃうンだ…」
春子:「ね? 簡単でしょ?」
真琴:「ハルコさん、アタシも砂時計を持ってるンだけど、砂が落ちきる時間ってあんまり正確じゃないよね」
春子:「それは、マコトの砂時計が安物だから、高級なものならかなり正確だよ」
真琴:「でも、そういうのは値段が高いンでしょ? それに、いくら正確でも安いストップウォッチにも負けるンじゃない?」
春子:「それはそうだけどね、砂時計にはストップウォッチにない"良さ"があるのよ」
真琴:「どんな良さ?」
春子:「"風情"というものよ、マコトはマダマダそれを知る歳じゃないけどネ」
真琴:「でも、"それを知る歳"にはなりたくないよなぁ〜…」
春子:「言ってくれるじゃない? でも、なっても、また戻ればいいのよ、そうでしょ?」
真琴:「あっ、たしかそんな冗談よ、去年ハルコさんが言ったのは」
春子:「アタシが去年もそんな冗談言った? 憶えてないよ」
真琴:「ホントに?」
「それを知る歳には」さん、ありがとうございます。
上記コードで自分のフォーム上ではうまく動作しました。
しかし、他の別のソフト上でのカーソルには反応しませんでした。
もしかして、LoadCursor(0, IDC_ARROW)の、0の部分を
今マウスカーソルの下にあるソフトのハンドルにしないと
いけないのでしょうか?ということは、マウスフックを使用?
LoadCursorの0はシステムカーソルをロードするためのものだから問題ないでしょう。
疑うならGetCursorでちゃんと値が取れているかでしょう。
たしかカレントスレッドのカーソルしか返せないんじゃなかったでしたっけ?
MSDN見てもいまいちはっきりしませんが、ただ、グローバルなマウスの情報が欲しければGetCursorInfoを使えと書いてありますね。
tttさん、ありがとうございます。
GetCursorInfoで色々調べていくうちに、以下のコードで
実現できました。
(問題ないのか自身はありませんが・・・)
procedure TForm1.Timer1Timer(Sender: TObject);
var
hc: HCURSOR;
pci: TCursorInfo;
begin
pci.cbSize := SizeOf(pci);
GetCursorInfo(pci);
if pci.hCursor = LoadCursor(0, IDC_ARROW) then Caption := '矢印カーソル'
else Caption := 'その他カーソル';
end;
なんか色々とタイプミスが・・・
自身 → 自信
hc: HCURSOR; → 不要
ツイート | ![]() |