回答編集履歴
4
サンプルソースを追加
answer
CHANGED
@@ -4,7 +4,9 @@
|
|
4
4
|
|
5
5
|
#1.別のトップレベルウィンドウを透明に近い半透明にして重ね合わせる手法
|
6
6
|
|
7
|
-
LWA_COLORKEY で透過させたウィンドウの同じ位置・同じサイズに LWA_ALPHA を指定した別ウィンドウを配置する手法です。そのウィンドウでマウスを処理させることにより透過されつつマウス動作を実現します。アルファ値が 0 だとマウスが透過してしまうので、必ず1以上を指定する必要があります。アルファブレンドされるため、完全に元のイメージのままではありませんが、下の案よりは比較的ましな動きをします。
|
7
|
+
~~LWA_COLORKEY で透過させたウィンドウの同じ位置・同じサイズに LWA_ALPHA を指定した別ウィンドウを配置する手法です。そのウィンドウでマウスを処理させることにより透過されつつマウス動作を実現します。アルファ値が 0 だとマウスが透過してしまうので、必ず1以上を指定する必要があります。アルファブレンドされるため、完全に元のイメージのままではありませんが、下の案よりは比較的ましな動きをします。~~
|
8
|
+
実際には LWA_ALPHA を指定しなくても WS_EX_LAYERED スタイルを指定すれば、完全に透過してマウスメッセージを受け取れるウィンドウが作成可能でした。元のウィンドウの位置にピッタリ合わせて動かす部分も含めて検証したので、以下のコードを確認してみてください。
|
9
|
+
[https://github.com/atata0319/teratail176225](https://github.com/atata0319/teratail176225)
|
8
10
|
|
9
11
|
|
10
12
|
#2.SetCapture でマウスメッセージをキャプチャする手法
|
3
質問内容変更に合わせて修正
answer
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
> SetLayeredWindowAttributesの透過部分の
|
1
|
+
> SetLayeredWindowAttributesの透過部分のLBUTTONDOWN等のメッセージは受け取るようにはできませんか?
|
2
2
|
|
3
|
-
おそらく WM_KEYDOWN ではなく WM_MOUSExxx メッセージの話だと思って回答します。
|
4
3
|
非常に残念ですが、WS_EX_LAYERED なウィンドウを LWA_COLORKEY で透過させた場合、そのウィンドウで直接マウスメッセージを受け取る手段はおそらくありません。とりあえず、回避策として私が提案できるのは以下のものになります。
|
5
4
|
|
6
5
|
#1.別のトップレベルウィンドウを透明に近い半透明にして重ね合わせる手法
|
2
誤字の修正
answer
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
LWA_COLORKEY で透過させたウィンドウの同じ位置・同じサイズに LWA_ALPHA を指定した別ウィンドウを配置する手法です。そのウィンドウでマウスを処理させることにより透過されつつマウス動作を実現します。アルファ値が 0 だとマウスが透過してしまうので、必ず1以上を指定する必要があります。アルファブレンドされるため、完全に元のイメージのままではありませんが、下の案よりは比較的ましな動きをします。
|
9
9
|
|
10
10
|
|
11
|
-
#2.
|
11
|
+
#2.SetCapture でマウスメッセージをキャプチャする手法
|
12
12
|
|
13
13
|
透明部分のマウスメッセージをキャプチャして、自ウィンドウで処理する手法です。該当のウィンドウの外をクリックされた際に下のウィンドウにマウスを PostMessage するなど、標準動作ではない動きが必要になるため作ろうとしているアプリケーション以外の操作性に難が出る可能性があります。
|
14
14
|
|
1
誤字の修正
answer
CHANGED
@@ -20,4 +20,4 @@
|
|
20
20
|
|
21
21
|
#4.フックでマウスメッセージを受け取る手法
|
22
22
|
|
23
|
-
|
23
|
+
2とほぼ同じですが問題も多いので、あまりお勧めしません。グローバルフック側でマウスメッセージを処理しなかった場合、怪しい動作が多いもので・・・。
|