Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

VB6でマウススクロールをマウスクリックとして扱う方法 解決済み

タグの編集...

投稿者 ひでぽん   (社会人)   投稿日時 2021/4/22 16:35:57
お世話になります。
下記に記述する内容が可能かどうかご教示ください。

既往のVB6で作成されたプログラムがOCXを使用して画像の拡大縮小を行っています。
拡大モードにして右クリックで拡大、縮小モードにして右クリックで縮小というように一度拡大モードボタン、縮小モードボタンを押してモード指定後に実施する動きです。

やりたいことはマウススクロールをしたらそのイベントを受信し右クリックとしてイベントを変換してするみたいな動きが可能かどうかご教示頂きたいのです。マウスのスクロールで拡縮を行いたいと要望があるのですが以前の担当者が会社を辞めて連絡が取れずにOCXのソースが無い為に困っております。

※VB6のソースはあるのですがOCXのソースはありません。


投稿者 魔界の仮面弁士   (社会人)   投稿日時 2021/4/22 22:28:09
> マウススクロールをしたら
ここでいう『マウススクロール』という用語についてですが、
マウスによるスクロールバー操作のことを意味しているのでしょうか。
あるいは、マウスのホイール操作を意味しているのでしょうか。

また、現状の拡大縮小操作は、どの位置を基準座標として拡大されるのでしょうか。
右クリックした地点を中心として拡縮されるのか、それとも、右クリック座標を問わず、
現在の左上座標を基準としているのかといった点も気がかりです。


> イベントを変換してするみたいな動き
該当の ocx が、ウィンドウレスコントロールなのか、
それとも HWND を持つものなのかで変わってきます。

ウィンドウレスなどで、Windows Message をうまく拾えない状況であれば、
DirectInput を用いて、マウス操作をイベントとして受け取という手法があります。
VB6 から使えるライブラリは、DirectX 8 世代のものなので、
現在では入手が困難かもしれませんけれどね。
http://hanatyan.sakura.ne.jp/patio/read.cgi?no=228


一方、HWND が取得できる場合には、該当ウィンドウをサブクラス化してみてください。
先の『マウススクロール』とやらがスクロールバー操作を指しているのであれば、
WM_VSCROLL / WM_HSCROLL メッセージが飛んできている可能性がありますし、
ホイール操作であれば WM_MOUSEWHEEL メッセージが飛んでいるかもしれません。

DirectInput の通知にせよ、ウィンドウのサブクラス化によるメッセージ通知にせよ、
『マウススクロール』の操作を拾えるようであれば、該当の Windows Message が飛んできた時に、
右クリック処理を代わりに呼び出すようにします。

なお、右クリック相当の呼び出しにするには、通知メッセージを送って騙す方法や、
SendInput API でエミュレーションする方法などが思い当たりますが、
それらでうまくいくかどうかは、実際の環境で試さないと分かりませんし、
具体的なソースを提示することもできないです。

投稿者 ひでぽん   (社会人)   投稿日時 2021/4/24 17:02:41
魔界の仮面弁士 様

いつもご教示ありがとうございます。

マウススクロールはマウスのホイール操作の事です。
OCXはHWNDを持つものなのでサブクラス化して WM_MOUSEWHEEL メッセージを調べてみます。
GW中に試してみます。

ありがとうございました。

投稿者 ひでぽん   (社会人)   投稿日時 2021/4/27 12:02:51
魔界の仮面弁士 様

OCXはウィンドウレスではないのでHWNDがあると思ったのですがHWNDがOCXのメンバとしてありませんでした。そこでDirectInputを試してみようと思ったのですがDirectInputのVB6のサンプルをご存じであればご教示頂けないでしょうか?

度々で申し訳ございませんが宜しくお願いします。

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2021/4/27 16:20:03
ウィンドウハンドル(HWND) を返却するメンバーが存在している必要はありません。
重要なのはウィンドウの有無だけです。

Visual Studio 6.0 や Visual Studio 2019 に付属の「Microsoft Spy++」を使って、
メッセージの流れを追跡してください。

他のツールでも良いですが、メッセージの流れを調査・追跡したりすることができないのなら、
自力実装は難易度が高いので、あきらめた方が良いでしょう。
独自の OCX となれば第三者がテストすることもできないので、手助けすることは難しいです。

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2021/4/27 16:54:16
> 重要なのはウィンドウの有無だけです。

ウィンドウが存在していることを確認出来たら、それをプログラムから操作できるよう、
FindWindowEx API あるいは EnumChildWindows API などを使って、
対象のウィンドウを取得します。

もし、ウィンドウが存在していれば、それをサブクラス化して、
ホイール処理を受け取れるか調べてみましょう。
http://rucio.a.la9.jp/main/tyukyu/tyukyu9.htm


> DirectInputのVB6のサンプルをご存じであればご教示頂けないでしょうか?
VB6 からだと、ここの「VBでマウスジェスチャ」とかですかね。
(1) と (2) が VB6 向け、(3) が VB.NET 向けです。
http://konbiki.starfree.jp/Old/index.html

投稿者 (削除されました)   ()   投稿日時 2021/4/30 13:58:26
(削除されました)

投稿者 ひでぽん   (社会人)   投稿日時 2021/4/30 14:37:14
魔界の仮面弁士 様

いつもご教示ありがとうございます。

>ウィンドウハンドル(HWND) を返却するメンバーが存在している必要はありません。
>重要なのはウィンドウの有無だけです。
FindWindowにてクラス名とウィンドウタイトル名からウィンドウハンドルを取得する事ができました。

>もし、ウィンドウが存在していれば、それをサブクラス化して、
>ホイール処理を受け取れるか調べてみましょう。
サブクラス化してホイール処理が受け取れホイールで拡大/縮小が制御できるようになりました。


それとは別に、マウスホイールをクリックした時のメッセージ番号が左クリックと同じメッセージ番号となるのですが左クリックとホイールクリックの違いを判断する方法がありましたらご教示いただけないでしょうか


下記の番号で取得できたのはマウスホイールを回転させて時のWM_MOUSEWHEEL(&H20A)だけでした。
Public Const WM_MOUSEWHEEL = &H20A          'マウスホイール

Public Const WM_MOUSEFIRST = &H200
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_MBUTTONDOWN = &H207
Public Const WM_MBUTTONUP = &H208
Public Const WM_MBUTTONDBLCLK = &H209
Public Const WM_MOUSELAST = &H209


度々で申し訳ありませんがよろしくお願いします。

※DirectInputにつきましては勉強の為試してみたいと思います。



投稿者 魔界の仮面弁士   (社会人)   投稿日時 2021/5/1 19:29:30
マウスドライバー(あるいはハードウェア)側で、
ホイール操作を伴わない中クリックが無視されているということはないでしょうか。
https://superuser.com/questions/1496936/windows-10-middle-mouse-button-reassign

水平方向のスクロールに対応したマウスなどだと、あえて中クリックを
使えなくしているケースもあるようです。

たとえば、手元の ロジクール MX Anywhere 2 の場合、
ホイールのクリックには何も割り当てが無く、
そのホイールの手前に、専用の Middle Button が用意されています。

投稿者 ひでぽん   (社会人)   投稿日時 2021/5/7 08:13:53
魔界の仮面弁士 様

>ホイール操作を伴わない中クリックが無視されているということはないでしょうか。
はい、ホイール操作の処理時に試しに中クリックのイベントも調べた際にイベントが取得できなかったので何故なのかな?と疑問に思っていました。ご教示ありがとうございました。

今回の件につきましては全て解決しました。
どうもありがとうございました。