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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0102
きのよーbgscrに拡張オプションを付けて最大化を自然にしたい6解決


きのよー

リンク

2014/1/2(Thu) 00:42:16|NO.59075

あけましておめでとうございます。
bgscrで作ったウィンドウに

GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | $10000 | $20000 | $80000
これにてシステムメニューと最大化、最小化を復活させます。
そしてこの状態で最大化をしてしまうと、タスクバーが隠れてしまいます。
通常のタイトルバー付きウィンドウのように、タスクバーを表示したまま最大化するにはどうしたら良いのでしょうか。
誰かご教授をお願いします。

備考

#include "user32.as" bgscr 0,ginfo(20),ginfo(21) GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | $10000 | $20000 | $80000 GetSystemMenu hwnd, 0 hSystemMenu = stat width 640,480
タスクバーから最大化すると、再現できます。



この記事に返信する


掘木

リンク

2014/1/2(Thu) 03:05:31|NO.59076

あけましておめでとうです。

ウィンドウスタイルにWS_CAPTION(0x00C00000)を持たないウィンドウに
最大化操作をすると、画面全体になる・・・と推測。
WS_POPUPのせいかと思ったらそんなに簡単じゃなかった(ぁ。

こちらの環境(XP)でそれっぽい挙動をしたのが備考のコードに以下のコードの付加。
・・・もっといい方法ありそうだけど。
(HSP本体が処理してるメッセージを無視する形なので取り扱い注意すべし。)

#define global WM_GETMINMAXINFO 0x0024 #define global SPI_GETWORKAREA 0x0030 oncmd gosub *getminmaxinfo,WM_GETMINMAXINFO stop *getminmaxinfo pos 250,24 dim gmmi_rc,4 SystemParametersInfo SPI_GETWORKAREA,0,varptr(gmmi_rc),0 pos 24,24 dim gmmi_lp dupptr gmmi_lp,lparam,4*10,vartype("int") gmmi_lp(2) = gmmi_rc(2)-gmmi_rc(0),gmmi_rc(3)-gmmi_rc(1),gmmi_rc(0),gmmi_rc(1) return 0
なお、HSP側がWM_GETMINMAXINFOでやっているのは、
クライアント領域が初期化サイズ(バックバッファ)より大きくならないようにしている模様。



fortunehill

リンク

2014/1/2(Thu) 16:18:53|NO.59084

/*ご参考(トリッキーなので微妙:修正)*/

#include "user32.as" bgscr 0,ginfo(20),ginfo(21),,,,640,480 GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | $10000 | $20000 | $80000 GetSystemMenu hwnd, 0 hSystemMenu = stat oncmd gosub *label,$112 ;WM_SYSCOMMAND sendmsg hwnd,$112,$F030 :wait 100 ;SC_MAXIMIZE sendmsg hwnd,$112,$F020 :wait 100 ;SC_ICON sendmsg hwnd,$112,$F120 ;SC_RESTORE stop *label dim nn,11 :GetWindowPlacement hwnd,varptr(nn) ;WINDOWPLACEMENT if (wparam == $F020) {nn(2) = 4 } if (wparam == $F030) {nn(5) = -2,-2} SetWindowPlacement hwnd,varptr(nn) ;元のサイズに戻すの挙動に注意(手抜き) return



きのよー

リンク

2014/1/3(Fri) 00:45:29|NO.59105

ご教授ありがとうございます。
…しかし、APIなど初心者なもので、わからないところがいくつもある…。

>掘木 様
スクリプトを実行してみた結果、当方はWindows7 Home(ry でしたが、考えていた動作でした。
>>(HSP本体が処理してるメッセージを無視する形なので取り扱い注意すべし。)
これは、最大化のメッセージを受け取った時、HSPが処理した後に無理やり処理をする、ということなのでしょうか。
そうであれば、一度に2回ウィンドウを変えるということになってしまうのでしょうか?
これについて、あまりリスクがピンと来ないので、そこのところを是非教えていただきたいです。
もしよければですが、お願いします。

>fortunehill 様
スクリプトを実行してみた結果、最小化から戻った際に元のサイズに戻っていました。
再度最大化すれば良さそうです。
ただ、やはりトリッキーであることが腑に落ちません。
実際、MSDNで解説があることから、特に問題ないプログラムだと思ってしまいます。
これを使うことによるリスクを、ぜひ教えていただきたいです。
もしよければですが、お願いします。



掘木

リンク

2014/1/3(Fri) 05:10:27|NO.59112

HSPSDKの中身を全て確認したわけではないので憶測も混じるのですが・・・。

質問に関しては、
リスクに関しては、初期化サイズよりクライアント領域が大きい状態になりえるんで注意すべし。
メッセージに対してHSP側はoncmdを処理してるだけなので2度変更等の事態は起こらない。
といったところですかね。

HSPウィンドウ共通のコールバック関数の中身を見ると、
まず、win側から送られてくるウィンドウハンドルをHSPウィンドウIDと関連付けを行い、
1:メッセージがoncmdで登録されていれば中身の実行、返り値が存在すればここで打ち切り
2:HSP独自で処理しているメッセージの処理(処理した場合ここで打ち切り)
3:windowsが用意しているウィンドウのデフォルト動作に任せる
の優先順で処理しているように見える。
(oncmdの飛び先でwait等を呼んだ際どうなる?等、追いきれてない動作もありますが。)

先日こちらが示したコードは、WM_GETMINMAXINFOでの飛び先が0を返しているので、このメッセージにおいては2,3の処理をしません。
そのため、HSP側が独自で処理していた、
<クライアント領域が初期化サイズ(バックバッファ)より大きくならないようにする>
が無効になります。
なので、そのままだと初期化サイズよりクライアント領域が大きい状態になりえます。起動後にデスクトップの解像度変更できますから。

何かしらの方法で、そんな状態に(初期化サイズよりもクライアント領域を大きく)すると、
描画される部分がウィンドウの右下に寄って、ウィンドウの一部がフリーズ中のウィンドウのような見た目に・・・。
見栄えが大問題ですが、システムエラー等で強制落ちになることはないように思えます(多分)。


GETMINMAXINFOメッセージは、ウィンドウのサイズ上限下限をwin側が質問してるだけで、
これをsendmsg等で発生させても何の変化もないです。
通常何かしらのウィンドウサイズ変更要因とセットで呼ばれるので、処理すれば結果的に変化がある感じです。
(最大化時に限ったことでなく大きさ変更全般で呼ばれる。)



fortunehill

リンク

2014/1/3(Fri) 16:33:23|NO.59123

/*
 余計な事をしてたのねボク(修正2)
 個人的にトリッキーな部分をを取り除いたらスッキリしました。
 タスクバーの位置4ヶ所+挙動3種やサイズの決め打ちとか問題はありますが
 (2ドットずらすだけで全てに対応できるのかも)
*/

#include "user32.as" bgscr 0,ginfo(20),ginfo(21),,,,640,480 GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | $10000 | $20000 | $80000 GetSystemMenu hwnd, 0 hSystemMenu = stat repeat 100 :mes cnt :loop oncmd gosub *label,$112 ;WM_SYSCOMMAND sendmsg hwnd,$112,$F030 :wait 30 ;SC_MAXIMIZE sendmsg hwnd,$112,$F020 :wait 30 ;SC_ICON sendmsg hwnd,$112,$F120 ;SC_RESTORE stop *label dim nn,11 :GetWindowPlacement hwnd,varptr(nn) ;WINDOWPLACEMENT nn(5) = -2,-2 :SetWindowPlacement hwnd,varptr(nn) return



きのよー

リンク

2014/1/3(Fri) 18:14:38|NO.59128

再びありがとうございます。

>堀木 様
なるほど、起動後に解像度変更…。これは思いもよりませんでした。
結果的に、クライアント領域が初期化サイズを上回ることに制限をかけることができればいいのですね。
こんな私でも簡単に理解できるように説明してくださって、本当にありがとうございます。

>fortunehill 様
これは…
よく見たら-2,-2に移動しているんですね!
なぜ移動するだけでタスクバーが表示されるのか…。
わかりやすいサンプルをありがとうございます。

自分自身、やりたいことはできたので解決にします。
またわからないことがあった時は、よろしくお願いします。



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