マウスカーソルの画像を取得して描画するには?

解決


Toshihiko  2005-01-09 22:49:10  No: 87717  IP: [192.*.*.*]

題名の通りですが、現在表示されている
マウスカーソル(普段のやじるしや砂時計など)を取得し、
それをPictureBoxに描画する方法を探しています。
  なんとか、マウスのハンドルを取得する方法はわかりましたが、
これをどう使えばいいのかがよくわかりません。

  この時点で間違っていたら最初からだめですが、ご教授願います。
  開発環境は、WinXP,Visual Basic6.0です。
  よろしくお願いします。

'標準モジュール
Public Declare Function GetCursor Lib "USER32" () As Long  

'Form
Private Sub Command1_Click()

Dim Ret As Long

Ret = GetCursor
MsgBox Ret
         
End Sub

編集 削除
じわり  2005-01-10 01:55:22  No: 87718  IP: [192.*.*.*]

以下追加してみてください

[宣言]
Declare Function DrawIcon Lib "user32.dll" 
(ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal exhicon As Long) As Long
[本文]
Picture1.AutoRedraw = True
lngret = DrawIcon(Picture1.hDC, 0, 0, Ret)

編集 削除
じわり  2005-01-10 02:01:16  No: 87719  IP: [192.*.*.*]

宣言違ってました
[宣言]
Public Declare Function DrawIcon Lib "user32.dll" _
(ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal exhicon As Long) As Long
[本文]
Picture1.AutoRedraw = True
lngret = DrawIcon(Picture1.hDC, 0, 0, Ret)

編集 削除
Toshihiko  2005-01-10 09:40:05  No: 87720  IP: [192.*.*.*]

ありがとうございます。
無事成功することができました。

編集 削除
Toshihiko  2005-01-10 19:48:54  No: 87721  IP: [192.*.*.*]

解決した後で、申し訳ないのですが、
これの場合、Form上でないとハンドルを取得できないのですが、
これを、他のウインドウやデスクトップでもハンドルの変化を取得できる方法はあるのでしょうか?
たびたびで申し訳ありませんが、よろしくお願い致します。

編集 削除
花ちゃん  URL  2005-01-11 08:19:10  No: 87722  IP: [192.*.*.*]

下記を試して見て下さい。

Option Explicit
Private Declare Function GetCursor Lib "user32" () As Long
Private Declare Function DrawIcon Lib "user32" _
    (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _
     ByVal hIcon As Long) As Long
Private Sub Command1_Click()
    On Error Resume Next
    Dim MoPoint As Integer
    Dim i As Integer
    '現在のマウスポインターを取得
    MoPoint = Screen.MousePointer
    Picture1.AutoRedraw = True
    For i = 0 To 15
    Screen.MousePointer = i
        DoEvents
        If i < 8 Then
            DrawIcon Picture1.hdc, i * 40, 0, GetCursor()
        Else
            DrawIcon Picture1.hdc, (i - 8) * 40, 50, GetCursor()
        End If
    Next i
    Picture1.Refresh
    'マウスポインターを元に戻す
    Screen.MousePointer = MoPoint
End Sub

編集 削除
Toshihiko  2005-01-11 10:51:45  No: 87723  IP: [192.*.*.*]

ご回答ありがとうございます。

試してみたのですが、やはりうまくいかないようです。
これは、自分の環境だけなのでしょうか?

編集 削除
マルポ侍  2005-01-11 13:20:39  No: 87724  IP: [192.*.*.*]

http://www.takeittechies.com/vbtomo/boards/vbqanda.php?do=spread&num=7229
この人、マルチポストですからーぁ。残念!

編集 削除
Toshihiko  2005-01-11 13:33:39  No: 87725  IP: [192.*.*.*]

いろいろなところで、多くの人の意見をいただいても問題はないのでは?

編集 削除
L/D  2005-01-11 14:48:03  No: 87726  IP: [192.*.*.*]

あなたはそうは思っても、読んでる人はそう思うとは限りません。
以下googleで『マルチポスト』で検索した物を抜粋
http://e-words.jp/w/E3839EE383ABE38381E3839DE382B9E38388.html
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88
http://www11.ocn.ne.jp/~dkouta/l003.htm
http://www.geocities.co.jp/SiliconValley/5634/t82DC_0005.html

編集 削除
Toshihiko  2005-01-11 15:19:51  No: 87727  IP: [192.*.*.*]

L/Dさん、マルポ侍さんありがとうございます。
マルポ侍さんに言われるまで、「マルチポスト」という言葉自体耳にしたことがありませんでした。

今後気をつけるように致します。また、こちらを本命とさせていただきたいので、別掲示板の方の書き込みは削除させていただきます。
お騒がせ致しました。

編集 削除
マルポ侍  2005-01-11 18:35:19  No: 87728  IP: [192.*.*.*]

> 今後気をつけるように致します。
と、いうことなので、ヒント:GetCursorInfo API

編集 削除
Toshihiko  2005-01-11 20:23:35  No: 87729  IP: [192.*.*.*]

マルポ侍さん、ありがとうございます。

参考にさせていただきます。

編集 削除
たくみ  2005-01-11 23:30:52  No: 87730  IP: [192.*.*.*]

板汚しですみません。
「マルチポスト」については賛否両論おありかと思いますが
いつもマルチポストって目にするたび思うのです。で、
・・質問される方に声を大にして言いたいのです。

「絶対にこの板だけで大丈夫ですからーーーーー!」って。

もっと信じてもらっていいんじゃないですかね。
私は質的にも情報量的にみてもこの板だけで充分すぎるほど
満足ですし。

あんまり過剰にレスを期待されるのもどうかと思いますが、
あちこちマルチポストせず、そんな暇あったら
あともう1回でもググってみるとか(結構検索してませんよね?)
あともう少しきっちりと環境や不具合状況を書くとか
されるとこの板だけでレスがつくんじゃないでしょうか、と。

なんてね。

編集 削除
じわり  2005-01-12 02:57:52  No: 87731  IP: [192.*.*.*]

GetCursorInfo って初めて知った。
おいらのMSDNにはないのね・・
検索してもあまり出てこないし
というわけで勉強がてら作ってみました。

Private Declare Function GetCursorInfo Lib "user32" _
(pci As CURSORINFO) As Boolean

Private Type POINTAPI
    x As Long
    y As Long
End Type
Private Type CURSORINFO
  cbSize As Long
  flags As Long
  hCursor As Long
  ptScreenPos As POINTAPI
End Type

Private Sub Command1_Click()
    Dim a As POINTAPI
    Dim b As CURSORINFO
    b.cbSize = Len(b)
    GetCursorInfo b
    Text1.Text = "hCursor:" & b.hCursor & vbCrLf & "ScreenPos: " & b.ptScreenPos.x & "," & b.ptScreenPos.y
End Sub

編集 削除
Dental  2005-01-12 13:37:03  No: 87732  IP: [192.*.*.*]

> Private Declare Function GetCursorInfo Lib "user32" _
> (pci As CURSORINFO) As Boolean

GetCursorInfo APIの戻り値は、BOOL型 (32bit整数)です。
VB6のBoolean型は16bitなので、ここは As Long にしないとマズイかと。

編集 削除
Toshihiko  2005-01-12 17:05:24  No: 87733  IP: [192.*.*.*]

じわりさん、Dentalさん
とても、参考になるご回答をありがとうございます。
実験してみた結果、無事に成功することができました。本当にありがとうございます。

たくみさん
>「絶対にこの板だけで大丈夫ですからーーーーー!」って。
これは、ごもっともです。自分でもそう思います。
それなのに、マルチポスト行為をしてしまったのが自分でも悔やまれます。
おそらく、かなり焦っていたのでつい少しでも早い返答がほしくてやってしまったのだと思います。

質問をする前に、MSDNやいろいろな検索サイトで片っ端から検索ででたページを見ていったのですが、英語のページが多かったりなどして見逃していた部分があったのだと思います。
実際、最初の質問の「PictureBoxに描画」する方法はDrawIconを教えて頂いた事もあってすぐに目にはいったのか、自分でも見つけることができました。

あと、環境などについては最初の発言も含め自分でも十分だと思っていたのですが、この質問に関して他に必要だったと思われる情報にはどのような物がありますでしょうか?

編集 削除
じわり  2005-01-13 08:58:27  No: 87734  IP: [192.*.*.*]

>GetCursorInfo APIの戻り値は、BOOL型 (32bit整数)です

間違えてました。ご指摘ありがとうございます。

2重投稿については私も一言指摘しとけばよかったなと少し反省・・

編集 削除
たくみ  2005-01-13 11:03:23  No: 87735  IP: [192.*.*.*]

>あと、環境などについては最初の発言も含め自分でも十分だと思っていたの
>ですが、この質問に関して他に必要だったと思われる情報にはどのような物
>がありますでしょうか?
あ、すみません。確かにToshihikoさんのご質問自体は問題ないです。
言葉が不適切でした。
これは、あまりにも「環境も書いてない」「何を指すのか主語述語が
ちんぷんかんぷん」「ほんの2、3行だけのしかも抽象的な質問だけで
どこが悪いん(動かないん)でしょう」みたいなご質問が多いような
気がしてましたので。
といってそれだけでわざわざスレ立てるようなことでもないと思い
ついつい、ここで発言して(愚痴って)しまった次第です。
お気を悪くされたならごめんなさい。

編集 削除
Toshihiko  2005-01-13 19:56:09  No: 87736  IP: [192.*.*.*]

>GetCursorInfo APIの戻り値は、BOOL型 (32bit整数)です
一応Booleanでも動くようですね。一部Longの時と数値が変わるカーソルもありましたが。

>たくみさん
いえ、このスレは今後のためにも、とても役に立つ物になったと思いますよ。

編集 削除