[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/06/08(Wed) 15:17
投稿者名:ダンボ
URL :
タイトル:
中央ボタンクリックのシミュレーション
マウスホイール取得の続編なのですが、ピクチャーボックスへのマウスホイール・イベントを
伝えるために、「Shif+Cntl+Altキーを押しながら中央ボタンをクリックした」イベントを
シミュレーションしようと思っています。下記の試験用コードでPostMessageを出すと、
wMsgすなわちButton、とlParamすなわちXとY、は正しくPicture1_MouseDownに伝わりますが、
wParamに何をセットしても、Picture1_MouseDownではShift=0になってしまいます。
何がいけないんでしょうかね?

Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" _
(ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Private Const WM_MBUTTONDOWN = &H207             '中央のマウスボタンが押された
Private Const MK_MBUTTON = &H10                  'マウス中ボタン
Private Const MK_SHIFT = &H4                     'SHIFTキー
Private Const MK_CONTROL = &H8                   'CTRLキー
Private Const MK_ALT = &H20                      'ALTキー

Private Sub Command1_Click()
Dim rc As Long, wMsg As Long, wParam As Long, lParam As Long
        wMsg = WM_MBUTTONDOWN       'simulate
'        wParam = MK_SHIFT + MK_CONTROL + MK_ALT
        wParam = &HFFFFFFFF
        lParam = &H10002
        rc = PostMessage(Picture1.hWnd, wMsg, wParam, lParam)
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As
Single)
  Debug.Print Button, Shift, X, Y  '--->実行結果は 4 0 30 15
End Sub

投稿時間:2005/06/09(Thu) 10:01
投稿者名:ダンボ
URL :
タイトル:
Re: 中央ボタンクリックのシミュレーション
> 何がいけないんでしょうかね?

hhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/
windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputmessages/
wm_mbuttondown.asp

などをよく読んでみると、どうもPostMessage一発で行くのではなく、そのときのキーボードステータスを
VBがあわせて判断してから、MouseDownイベントを起こすのではないかと想像してきました。

とするとPostMessageの直前にSetKeyboardState等でShif+Cntl+Altキーを押された状態をセットしな
きゃならんということでしょうかね?(じゃ、wParamには何をセットするのか?...)

適当なウィンドウにShif+Cntl+Altキーを押しながら中央ボタンをクリックしたのをSPY++で見ると
wParamには0x00000207(=WM_MBUTTONDOWN?)が送られていました。とするとwParamは何をセットしても
無視されるということかな?...

Web上のいろいろな説明を見るとwParamにはキーボードステータスが格納されていると理解していたのですが
誤解だったのかな?...

投稿時間:2005/06/09(Thu) 11:28
投稿者名:ダンボ
URL :
タイトル:
Re^2: 中央ボタンクリックのシミュレーション
> などをよく読んでみると、どうもPostMessage一発で行くのではなく、そのときのキーボードステータスを
> VBがあわせて判断してから、MouseDownイベントを起こすのではないかと想像してきました。
> とするとPostMessageの直前にSetKeyboardState等でShif+Cntl+Altキーを押された状態をセットしな
> きゃならんということでしょうかね?(じゃ、wParamには何をセットするのか?...)

ということですね。証拠は、Shif,Cntl,Alt各ボタンを押しながらテスト用コードのCommand1ボタンを
押すと、Mouse_Event内のShift変数が正しくセットされました。

で、キーボードステータスを変更するにはどういうAPIを使うべきかと検索していくと、
SetKeyboardStateよりも、keybd_eventよりも、SendInputを使うべきかなと思われます。

で、そのサンプルはと探していくと何と花ちゃんさんのサンプル集に行き着きました。
  hhttp://www.bcap.co.jp/hanafusa/VBHLP/SendInput.htm
あらためて花ちゃんさんの偉大さに脱帽してお礼申し上げます。

投稿時間:2005/06/09(Thu) 18:56
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 中央ボタンクリックのシミュレーション
一応下記で試してはいるのですが、中央ボタンは動作せず、挫折したままです。
(マウスドライバーがらみかなと思って、Give Up!)

hhttp://www.bcap.co.jp/hanafusa/VBHLP/SendMous.htm

私も教えて頂きたいくちです。

投稿時間:2005/06/10(Fri) 10:50
投稿者名:ダンボ
URL :
タイトル:
【ひとまず完了】どんでん返し
・Shiftキー押し下げのコマンド行作成
・Cntlキー押し下げのコマンド行作成
・Altキー押し下げのコマンド行作成
・マウスボタン押し下げのコマンド行作成
・Alttキー開放のコマンド行作成
・Cntlキー開放のコマンド行作成
・Shiftキー開放のコマンド行作成
・マウスボタン開放のコマンド行作成
・最後にSendInput発行(PostMessageは不要)
という内部設計まで決めてコーディングに向かおうかなというところで考え直しました。

今回の改修基本方針は、
・なるべく汎用的に作る。
・多種多様複数個のコントロールをハンドリングする。
でしたが、どうも「自動スクロール」と「ホィール回転対応」を混同している嫌いがある。

例えば、テキストボックスのホィール回転に対しては、
(1)MultiLineの複数行のテキストに対してホィール・スクロールを可能とする=「自動スクロール」
(2)現在のテキストボックス内の数値を+1、-1する=「ホィール回転対応」
ピクチャボックスに対しては、
(1)現在表示している画像の、前の/次の画像を表示する=「ホィール回転対応」
という改修依頼(自分から自分へ)がありました。

これを同時に対応しようとしたのですっきりしかった。で、「自動スクロール」処理と
「ホィール回転対応」処理のサブクラス化を別々な標準モジュールで対応することにします。

■基本設計:「自動スクロール」はCallerには見えないところでスクロールだけに専念する。
「ホィール回転対応」はホィールイベントが起きたことだけをCallerに教えて後はCallerが処理する。
(「自動スクロール」と「ホィール回転対応」を同時に求めるコントロールがあったらどうする?)
■ホィール回転対応外部設計:ホィール回転したらMouseDownイベントを起こす。X=-1ならば、
シミュレーションされたホィールイベントであり、そのときのYはホィール回転方向(+1/-1)
(ScaleModeによる値の違いをどうする?)
■ホィール回転対応内部設計:lParamにX,YをセットしてPostMessageを発行。キーボードステータスは変えな
い。

> 一応下記で試してはいるのですが、中央ボタンは動作せず、挫折したままです。
> 私も教えて頂きたいくちです。

ということで、SendInputはひとまず使用しないことにしました。相すみません。また次の機会に。