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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0221
こいる常に特定ウィンドウより前面にあるウィンドウを作りたい6解決


こいる

リンク

2020/2/21(Fri) 12:49:15|NO.89524

ポップアップウィンドウみたいに、
常に特定のウィンドウより前面にあるウィンドウを作りたいです。

特定のウィンドウというのは、HSPのウィンドウではなく、外部アプリのウィンドウです。

最前面にすると、アクティブウィンドウだとか関係なしに前面に出てしまうのでNGです。



この記事に返信する


あらや

リンク

2020/2/21(Fri) 19:09:06|NO.89531

少々無理矢理になるのであまりおススメは出来ませんが、
APIの「SetWindowLong」関数を使用し、
外部アプリのウィンドウを親(オーナー)とする
オーナー付きウィンドウにする事で
常にオーナーウィンドウよりも前面に出すことが可能です。

SetWindowLong 前面にしたい自分のウィンドウハンドル, GWLP_HWNDPARENT, オーナーにしたいウィンドウハンドル



こいる

リンク

2020/2/21(Fri) 20:33:14|NO.89532

返信ありがとうございます。

まさに求めていた挙動です!

// メモ帳をオーナーウィンドウにして常に前面に出す #include "user32.as" #define GWLP_HWNDPARENT $FFFFFFF8 exec "notepad" FindWindow "notepad",0 SetWindowLong hwnd, GWLP_HWNDPARENT, stat

>少々無理矢理になるのであまりおススメは出来ませんが、
なにか不具合があるのでしょうか?



あらや

リンク

2020/2/21(Fri) 21:18:44|NO.89534

おそらくそのままでも大丈夫だとは思いますが、

・外部アプリだけを終了した場合
 この場合は自動的にオーナー無しの状態に戻るはずですが、
 念のためにGetWindow関数などでオーナーがあるか定期的に確認し
 無くなっていた場合は下記と同様の処理でオーナー化を解除。

・逆にHSPウィンドウだけを終了した場合
 まず無いでしょうが、
 外部アプリが子ウィンドウを終了した場合に
 何かしら処理を行なっていたら、その何らかの処理が行われる可能性があります。
 こちらは終了前にonexitなどで

SetWindowLong hwnd, GWLP_HWNDPARENT, 0; オーナー解除 end
 このようにした方が安全かと思います。

どちらの場合も念のため程度に考えておいてください。



こいる

リンク

2020/2/23(Sun) 10:47:56|NO.89539

返信ありがとうございます。

重ねて質問で申し訳ないのですが、


・外部アプリだけを終了した場合
オーナーウィンドウがないのに、オーナーがある状態だと、なにか不都合が起きたりしますか?

・逆にHSPウィンドウだけを終了した場合
>何かしら処理を行なっていたら、その何らかの処理が行われる可能性があります。
その「何かしらの処理」というのは、どのウィンドウがするとしているのですか?

また、「何かしらの処理」で分かりやすい例などがありましたら、教えてほしいです。



あらや

リンク

2020/2/23(Sun) 19:50:11|NO.89542

申し訳ありませんが、どちらの質問も
「正確にはどうなるかわかりません」としか答えられないです。

自プロセスではなく、外部のウィンドウを『勝手に』オーナー化しているわけですから
外部アプリにとっては想定していない状況になりますし、
また私は、どのアプリを対象にしているのかも知りませんし
仮に分かったとしてもそのアプリの構造が分からないので
実際にどうなるのかはわからないのです。

>オーナーウィンドウがないのに、オーナーがある状態だと、なにか不都合が起きたりしますか?
自動的にオーナー解除になり、HSPのウィンドウだけ残る形になりますが
そのままの状態で別のウィンドウが出て来たときに
偶然にオーナー化したウィンドウと同じハンドルになってしまい
自動的にその新しいウィンドウがオーナーとして登録されてしまう、
というような可能性もあるかもしれません。
これも確認しようが無いのでわかりませんが……

>その「何かしらの処理」というのは、どのウィンドウがするとしているのですか?
ウィンドウで言えばオーナー化したウィンドウの一番親になるウィンドウでしょうね。
正確には外部アプリのメインプロセスの領域になるので
ウィンドウの問題では無いですが。

>また、「何かしらの処理」で分かりやすい例などがありましたら、教えてほしいです。
いわゆる終了時処理(HSPでのonexit)がよく見るパターンでしょうか。

エディタなどで「変更を保存していませんが終了してもよろしいですか?」
といったダイアログが出て来るようなパターンや
ゲームでも「終了しますか?」といった物が出て来る事がありますが
そのような処理の事です。

まあ、拡張ウィンドウスタイルにWS_EX_NOPARENTNOTIFYを追加すれば良さそうです。

繰り返しになりますが、どうなるか予想できないので
「無理矢理勝手にオーナー化」している以上
「おそらく大丈夫だとは思います」が
「念のためにこのような可能性も考慮しておくべき」という形での忠告です。



こいる

リンク

2020/2/23(Sun) 20:45:42|NO.89543

なるほど、起こる可能性は低そうなので、
状況に応じて検討したいと思います。

詳しく丁寧にありがとうございました。



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