電子書籍の厳選無料作品が豊富!

winXP VS2005

タイトルの件、
マウスの状態とは、マウスカーソルがどうなっているのか取得したいということです。

つまり具体的には
矢印なのか、砂時計なのか、指なのかといったことです。

カーソルの画像まで取れると最高ですが、
とりあえず状態まで・・・

よろしくお願いします。

A 回答 (1件)

★またお会いしましたね。


・『GetCursorInfo』API関数でグローバル・カーソルに関する情報を取得できます。
 typedef struct {
  DWORD cbSize; ←構造体サイズ
  DWORD flags; ←表示状態
  HCURSOR hCursor; ←カーソルのハンドル
  POINT ptScreenPos; ←カーソルの位置
 } CURSORINFO, *PCURSORINFO, *LPCURSORINFO;
 上記の構造体と関数を使って『hCursor』を取得します。
 その後に『LoadCursor』関数か、『LoadImage』関数であらかじめ定義されている
 マウスカーソルのハンドルを取得します。このハンドルを使ってチェックすれば
 どのカーソル状態か分かると思います。
 下にサンプルを載せますが、試していませんので参考にして下さい。

サンプル:
static int table[] = {
 IDC_APPSTARTING,
 IDC_ARROW,
 IDC_CROSS,
 IDC_HAND,
 IDC_HELP,
 IDC_IBEAM,
 IDC_ICON,
 IDC_NO,
 IDC_SIZE,
 IDC_SIZEALL,
 IDC_SIZENESW,
 IDC_SIZENS,
 IDC_SIZENWSE,
 IDC_SIZEWE,
 IDC_UPARROW,
 IDC_WAIT,
 0,
};
CURSORINFO ci = { sizeof(CURSORINFO) };

GetCursorInfo( &ci );

if ( ci.flags ){ ←カーソル表示あり
 for ( int *nID = table ; *nID != 0 ; nID++ ){
  if ( ci.hCursor == LoadCursor(NULL,*nID) ){
   return( *nID ); ←カーソル定数(IDC_XXXX)を返す
  }
 }
 return( -1 ); ←不明なカーソル(自作カーソル,リソースなど)
}
return( 0 ); ←カーソル非表示

解説:
・上記の戻り値で判定できます。
 『-1』...カーソル定数以外
 『0』....カーソルは非表示
 上記以外は『IDC_XXXX』定数を返す。
・『LoadCursor』のハンドルも最初の1回だけ取得して static な変数に保存しておけば
 毎回 LoadCursor しなくても良いかもしれません。
 いろいろと改良してみて下さい。
・それから『ci.hCursor』ハンドルで HBITMAP ハンドル同様に画像が取れると思います。多分。
・念のため、この方法で出来るか試していません。あくまでも参考に!

余談:
・前回の質問の『ウインドウ位置の自動移動の解除』で問題は解決したようですが、
 『WM_NEXTSIZE』というメッセージは『WM_EXITSIZEMOVE』のことですか?
・ウインドウ・メッセージを探しましたが『WM_NEXTSIZE』は見つかりませんでした。
・もしよければ教えて下さい。お願いします。
    • good
    • 0
この回答へのお礼

いつも丁寧にありがとうございます。

なるほど!
HCURSORからどうやったら取れるのか調べても
ダメなはずです。

普通にハンドルからとろうとしてました。
頭固いですね(*´д`)


追伸:
WM_EXITSIZEとは、WM_EXITSIZEMOVEの間違いです。
指摘ありがとうございます。

お礼日時:2007/03/17 13:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!