題名の通りですが、現在表示されている
マウスカーソル(普段のやじるしや砂時計など)を取得し、
それを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
以下追加してみてください
[宣言]
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)
宣言違ってました
[宣言]
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)
ありがとうございます。
無事成功することができました。
解決した後で、申し訳ないのですが、
これの場合、Form上でないとハンドルを取得できないのですが、
これを、他のウインドウやデスクトップでもハンドルの変化を取得できる方法はあるのでしょうか?
たびたびで申し訳ありませんが、よろしくお願い致します。
下記を試して見て下さい。
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
ご回答ありがとうございます。
試してみたのですが、やはりうまくいかないようです。
これは、自分の環境だけなのでしょうか?
http://www.takeittechies.com/vbtomo/boards/vbqanda.php?do=spread&num=7229
この人、マルチポストですからーぁ。残念!
いろいろなところで、多くの人の意見をいただいても問題はないのでは?
あなたはそうは思っても、読んでる人はそう思うとは限りません。
以下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
L/Dさん、マルポ侍さんありがとうございます。
マルポ侍さんに言われるまで、「マルチポスト」という言葉自体耳にしたことがありませんでした。
今後気をつけるように致します。また、こちらを本命とさせていただきたいので、別掲示板の方の書き込みは削除させていただきます。
お騒がせ致しました。
> 今後気をつけるように致します。
と、いうことなので、ヒント:GetCursorInfo API
マルポ侍さん、ありがとうございます。
参考にさせていただきます。
板汚しですみません。
「マルチポスト」については賛否両論おありかと思いますが
いつもマルチポストって目にするたび思うのです。で、
・・質問される方に声を大にして言いたいのです。
「絶対にこの板だけで大丈夫ですからーーーーー!」って。
もっと信じてもらっていいんじゃないですかね。
私は質的にも情報量的にみてもこの板だけで充分すぎるほど
満足ですし。
あんまり過剰にレスを期待されるのもどうかと思いますが、
あちこちマルチポストせず、そんな暇あったら
あともう1回でもググってみるとか(結構検索してませんよね?)
あともう少しきっちりと環境や不具合状況を書くとか
されるとこの板だけでレスがつくんじゃないでしょうか、と。
なんてね。
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
> Private Declare Function GetCursorInfo Lib "user32" _
> (pci As CURSORINFO) As Boolean
GetCursorInfo APIの戻り値は、BOOL型 (32bit整数)です。
VB6のBoolean型は16bitなので、ここは As Long にしないとマズイかと。
じわりさん、Dentalさん
とても、参考になるご回答をありがとうございます。
実験してみた結果、無事に成功することができました。本当にありがとうございます。
たくみさん
>「絶対にこの板だけで大丈夫ですからーーーーー!」って。
これは、ごもっともです。自分でもそう思います。
それなのに、マルチポスト行為をしてしまったのが自分でも悔やまれます。
おそらく、かなり焦っていたのでつい少しでも早い返答がほしくてやってしまったのだと思います。
質問をする前に、MSDNやいろいろな検索サイトで片っ端から検索ででたページを見ていったのですが、英語のページが多かったりなどして見逃していた部分があったのだと思います。
実際、最初の質問の「PictureBoxに描画」する方法はDrawIconを教えて頂いた事もあってすぐに目にはいったのか、自分でも見つけることができました。
あと、環境などについては最初の発言も含め自分でも十分だと思っていたのですが、この質問に関して他に必要だったと思われる情報にはどのような物がありますでしょうか?
>GetCursorInfo APIの戻り値は、BOOL型 (32bit整数)です
間違えてました。ご指摘ありがとうございます。
2重投稿については私も一言指摘しとけばよかったなと少し反省・・
>あと、環境などについては最初の発言も含め自分でも十分だと思っていたの
>ですが、この質問に関して他に必要だったと思われる情報にはどのような物
>がありますでしょうか?
あ、すみません。確かにToshihikoさんのご質問自体は問題ないです。
言葉が不適切でした。
これは、あまりにも「環境も書いてない」「何を指すのか主語述語が
ちんぷんかんぷん」「ほんの2、3行だけのしかも抽象的な質問だけで
どこが悪いん(動かないん)でしょう」みたいなご質問が多いような
気がしてましたので。
といってそれだけでわざわざスレ立てるようなことでもないと思い
ついつい、ここで発言して(愚痴って)しまった次第です。
お気を悪くされたならごめんなさい。
>GetCursorInfo APIの戻り値は、BOOL型 (32bit整数)です
一応Booleanでも動くようですね。一部Longの時と数値が変わるカーソルもありましたが。
>たくみさん
いえ、このスレは今後のためにも、とても役に立つ物になったと思いますよ。
ツイート | ![]() |