少し前のマウスホイール取得で作った自分のソースを改造しました。
http://hsp.tv/play/pforum.php?mode=all&num=84110
今回はWH_MOUSEでやろうと思ったのですが、なぜかWH_MOUSEだとフックできなかったので
前回と同じWH_MOUSE_LLに
WindowFromPointを使用してマウス直下のウィンドウハンドル取得
という組み合わせで、左クリック時の操作対象ウィンドウ取得という形にしました。
#include "modclbk3.hsp"
#define NULL 0
#define WH_MOUSE_LL 14
#define WM_LBUTTONDOWN 0x0201
#uselib "user32.dll"
#cfunc SetWindowsHookEx "SetWindowsHookExA" int, int, int, int
#func UnhookWindowsHookEx "UnhookWindowsHookEx" int
#cfunc CallNextHookEx "CallNextHookEx" int, int, int, int
#cfunc WindowFromPoint "WindowFromPoint" int, int
sdim s, 65535;
mesbox s, ginfo_winx, ginfo_winy, 5;
mbh = objinfo(stat, 2); // mesboxのウィンドウハンドル取得
cbl = *MouseProc;
newclbk3 clbkptr, 3, cbl;
hhook = SetWindowsHookEx( WH_MOUSE_LL, clbkptr, NULL, 0 ); // マウス操作を感知した場合ウェイト中に割り込みが入る
if( hhook == NULL ):end;
onexit goto *hookend;
stop;
// フックのコールバック
*MouseProc
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_LBUTTONDOWN ) {
hw = WindowFromPoint(ginfo_mx, ginfo_my); // マウス直下のウィンドウのハンドル取得
if( hw == mbh ):dialog "左クリック"; // 取得したハンドルとmesboxのハンドルが一致したときダイアログ
}
return CallNextHookEx( hhook, Mstate(0), Mstate(1), Mstate(2) ); // フックしたデータをそのまま返す
*hookend
UnhookWindowsHookEx hhook; // フックの終了
end;
以前のスレでinoviaさんが仰っていた
RAWINPUTでも可能かもしれませんが、
慣れた方でやらせていただきました。