HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0423
魚犬HSP以外のウィンドウでマウスのホイールの上下を判定4解決


魚犬

リンク

2018/4/23(Mon) 20:51:51|NO.84110

HSP標準命令のmousewを使えばマウスのホイールの上下を判定が出来ますが、
HSPウィンドウがアクティブになっていないと判定が取得できません。
HSP以外のウィンドウでマウスのホイールの上下を判定する方法はありませんでしょうか?



この記事に返信する


あらや

リンク

2018/4/24(Tue) 00:25:29|NO.84116

他ウィンドウがフォーカスになっている場合の
マウスホイール情報の取得ははっきり言うと面倒です。

1つの方法としては、

APIのSetWindowsHookExでWH_MOUSEをフック
フックプロシージャにマウスフック用コールバック関数を指定
WPARAMがWM_MOUSEWHEELになった場合マウスがホイールしている。

という感じの流れで(たぶん)取得できます。
コールバック関数は modclbk3.hsp をインクルードするか
マシン語などを用意する必要があります。



あらや

リンク

2018/4/24(Tue) 19:12:57|NO.84127

申し訳ありません。
「WH_MOUSE」ではなく「WH_MOUSE_LL」でした。

modclbk3.hspを使わせていただき、実際にやってみました。

#include "modclbk3.hsp" #define NULL 0 #define WH_MOUSE_LL 14 #define WM_MOUSEWHEEL 0x020A #uselib "user32.dll" #cfunc SetWindowsHookEx "SetWindowsHookExA" int, sptr, int, int #func UnhookWindowsHookEx "UnhookWindowsHookEx" int #cfunc CallNextHookEx "CallNextHookEx" int, int, int, int gmousew = 0; 全ウィンドウ対応mousew cbl = *LowLevelMouseProc; newclbk3 clbkptr, 3, cbl; hhook = SetWindowsHookEx( WH_MOUSE_LL, clbkptr, NULL, 0 ); // マウス操作を感知した場合ウェイト中に割り込みが入る onexit goto *hookend; *main redraw 0; color 255, 255, 255:boxf; color 0, 0, 0:pos 0, 0; mes "フックして取得したホイール値\t"+gmousew; // ホイール情報の表示 mes "HSP標準命令で取得したホイール値\t"+mousew; redraw 1; gmousew = 0; // ウェイト(割り込み)の直前でホイール値の初期化 await 500; // 表示がわかりやすいように長めのウェイトにする goto *main; // フックのコールバック *LowLevelMouseProc dupptr Mstate, lparam, wparam*4, 4; // Mstate(0)=フックコード(nCode) Mstate(1)=メッセージ識別子(wParam) Mstate(2)=メッセージデータ(lParam) if( Mstate(0) < 0 ) { // フックコードが0未満の場合はフックを中止して制御を元に戻さなければいけない。 return CallNextHookEx( hhook, Mstate(0), Mstate(1), Mstate(2) ); } if( Mstate(1) == WM_MOUSEWHEEL ) { dupptr lp, Mstate(2), 24, 4; // lParamはMSLLHOOK構造体へのポインタが入っている gmousew = lp(2)>>16; // MSLLHOOK構造体のメンバmouseDataの上位ビットがホイール情報 } else { gmousew = 0; } return CallNextHookEx( hhook, Mstate(0), Mstate(1), Mstate(2) ); // フックしたデータをそのまま返す *hookend UnhookWindowsHookEx hhook; // フックの終了 end;

細かい流れはコメントの説明でだいたいわかると思います。
フックが不要になったらUnhookWindowsHookExを使うという所だけは
忘れないようにしてください。



inovia

リンク

2018/4/24(Tue) 22:55:55|NO.84133

一応解決してますが補足で、
RAWINPUT系APIで RIDEV_INPUTSINK フラグをセットしておくと、
フックを使わなくても他ウィンドウがフォーカスが当たっていても入力を受け取ることができます。

マウスでは試してませんが、お仕事でバーコードリーダーがどこにあたっていても、
入力が受け取れるように…みたいな案件でフックを使わずに実装したので使えるかと思います。



魚犬

リンク

2018/4/25(Wed) 19:44:06|NO.84143

>>あらやさん >>inoviaさん
丁寧な開設及びサンプルソースまでありがとうございます!
分かりやすいメモ書きまで本当に有難うございます。
うまく組み込めました。



ONION software Copyright 1997-2023(c) All rights reserved.