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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0327
bumpマウスの貫通(?) なんてできないでしょうか?4未解決


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

おお!やりたかったことはこれです!
こんな下手な説明でも意図を察していただいて嬉しいです…。
そしてわざわざサンプルまでありがとうございました!



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