マウスカーソル形状の検知について

解決


Manbon  2009-01-14 19:02:05  No: 33114

マウスカーソルの側に追従して何らかの情報を表示するソフトを
検討しています。

マウスカーソルには矢印やIなど色々な形状がありますが、
矢印のときだけマウスカーソルの側に小さなフォームを表示させ、
それ以外では非表示にしようと思っています。

そこで、現在どのような形状になっているかを知らないと
いけないのですが、これを知る方法はないでしょうか?


それを知る歳には  2009-01-14 21:18:37  No: 33115

真琴:「質問の人は、現在のカーソルの形が"矢印"かどうかを知りたいのよね?」
春子:「特定のカーソルであるかどうか、それを知るのは簡単だよ、マコト」

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;

真琴:「ナルホドぉ、これで判定出来ちゃうンだ…」
春子:「ね? 簡単でしょ?」
真琴:「ハルコさん、アタシも砂時計を持ってるンだけど、砂が落ちきる時間ってあんまり正確じゃないよね」
春子:「それは、マコトの砂時計が安物だから、高級なものならかなり正確だよ」
真琴:「でも、そういうのは値段が高いンでしょ? それに、いくら正確でも安いストップウォッチにも負けるンじゃない?」
春子:「それはそうだけどね、砂時計にはストップウォッチにない"良さ"があるのよ」
真琴:「どんな良さ?」
春子:「"風情"というものよ、マコトはマダマダそれを知る歳じゃないけどネ」
真琴:「でも、"それを知る歳"にはなりたくないよなぁ〜…」
春子:「言ってくれるじゃない? でも、なっても、また戻ればいいのよ、そうでしょ?」
真琴:「あっ、たしかそんな冗談よ、去年ハルコさんが言ったのは」
春子:「アタシが去年もそんな冗談言った? 憶えてないよ」
真琴:「ホントに?」


Manbon  2009-01-14 22:01:15  No: 33116

「それを知る歳には」さん、ありがとうございます。
上記コードで自分のフォーム上ではうまく動作しました。
しかし、他の別のソフト上でのカーソルには反応しませんでした。

もしかして、LoadCursor(0, IDC_ARROW)の、0の部分を
今マウスカーソルの下にあるソフトのハンドルにしないと
いけないのでしょうか?ということは、マウスフックを使用?


ttt  2009-01-14 23:22:15  No: 33117

LoadCursorの0はシステムカーソルをロードするためのものだから問題ないでしょう。
疑うならGetCursorでちゃんと値が取れているかでしょう。
たしかカレントスレッドのカーソルしか返せないんじゃなかったでしたっけ?
MSDN見てもいまいちはっきりしませんが、ただ、グローバルなマウスの情報が欲しければGetCursorInfoを使えと書いてありますね。


Manbon  2009-01-14 23:49:21  No: 33118

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;


Manbon  2009-01-15 00:28:29  No: 33119

なんか色々とタイプミスが・・・
  自身  →  自信
  hc: HCURSOR;  →  不要


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加