マウスの貫通(?) なんてできないでしょうか?
bump 2013/3/27(Wed) 17:41:35|NO.53280
こんにちは、
説明が難しいのですが、やりたいことがあります。
たとえばHSPで作ったアプリケーション A.exeがあるとします。
A.exeのフォームをクリックすると
A.exeのフォームの後ろにある画面を同じ座標のままでクリックしたいです。
説明が上手くできないのですが…
マウスクリックを貫通?透過?
フォームを通り越して後ろのものをクリックさせることは無理でしょうか?
クリックを貫通させるソフトが作りたいだけなので、
自分が作ったソフト以外は貫通しなくていいのですが…
FunnyMaker 2013/3/27(Wed) 19:31:45|NO.53283
かなり無理やりですが、下の方法でやってみました。
マウスクリックを感知した瞬間に、真下のGUIコントロールに対してマウスの左ボタンの
押し下げ&放し メッセージを送信しています。
HSP側のウィンドウを半透明にしたりすると面白いと思います。
#include "llmod3.hsp"
#include "input.hsp"
#uselib "user32.dll"
#cfunc WindowFromPoint "WindowFromPoint" int,int
#cfunc GetWindow "GetWindow" int,int
#define GW_HWNDNEXT 2
#define GW_HWNDPREV 3
#define GW_CHILD 5
#define GW_HWNDFIRST 0
#define GW_HWNDLAST 1
#define GW_OWNER 4
#cfunc GetParent "GetParent" int
#cfunc GetAncestor "GetAncestor" int,int
#define GA_PARENT 1 ;親ウィンドウを返す
#define GA_ROOT 2 ;親子関係を遡って、直近上位のトップレベルウィンドウを返す
#define GA_ROOTOWNER 3 ;親子関係と所有関係を遡って、所有されていないトップレベルウィンドウを返す
;↓ウィンドウメッセージ定義
#define WM_LBUTTONDBLCLK 0x0201 ;マウス左ボタンを押し下げ
#define WM_LBUTTONUP 0x0202 ;マウス左ボタンを離した
#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int,int,int;ウィンドウの透明化・半透明化・不透明化_用↓
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int
#const LWA_COLORKEY 1 ;透明色を指定
#const LWA_ALPHA 2 ;アルファー値を指定
#const GWL_EXSTYLE -20 ;拡張ウィンドウスタイル
#const WS_EX_LAYERED $00080000 ;透明なウィンドウ属性
screen 0,400,200,0
SetWindowLong hwnd,-20,WS_EX_LAYERED
SetLayeredWindowAttributes hwnd,0,128,LWA_ALPHA
mes "適当に押してください"
onclick gosub *job1
stop
*job1
gsel 0,-1;メインウィンドウを隠す
wait 0;微小時間待つ(∵ウィンドウシステムに処理時間を与えるため...※確信はない。)
hwnd_under_mouse = WindowFromPoint(ginfo(0),ginfo(1));マウスカーソル直下のGUIオブジェクトのハンドルを得る
hwnd_top = GetAncestor(hwnd_under_mouse,GA_ROOT);それ↑の属するトップレベルウィンドウのハンドルを得る
;mes hwnd_under_mouse
;mes hwnd_top
sendmsg hwnd_under_mouse,WM_LBUTTONDBLCLK;左ボタン押し
sendmsg hwnd_under_mouse,WM_LBUTTONUP;左ボタン放し
gsel 0,1;ウィンドウを再出現させる
return
FunnyMaker 2013/3/27(Wed) 19:36:55|NO.53284
すみません、上の方法ですが、ボタンに対してしかクリックの効果がありませんでした。
それ以外のコントロール等に対して同様のことをするためには追加で何かが必要だと思われます。
FunnyMaker 2013/3/27(Wed) 19:54:39|NO.53285
連投すみません。
もっと簡単で確実な方法が分かりました。
#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int,int,int;ウィンドウの透明化・半透明化・不透明化_用↓
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int
#const LWA_COLORKEY 1 ;透明色を指定
#const LWA_ALPHA 2 ;アルファー値を指定
#const GWL_EXSTYLE -20 ;拡張ウィンドウスタイル
#const WS_EX_LAYERED $00080000 ;透明なウィンドウ属性
#const WS_EX_TRANSPARENT $00000020
screen 0,400,200
gsel 0,2
SetWindowLong hwnd,-20,WS_EX_LAYERED|WS_EX_TRANSPARENT
SetLayeredWindowAttributes hwnd,0,128,LWA_ALPHA
mes "適当に押してください"
bump 2013/3/28(Thu) 10:09:57|NO.53296
おお!やりたかったことはこれです!
こんな下手な説明でも意図を察していただいて嬉しいです…。
そしてわざわざサンプルまでありがとうございました!