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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0410
のすのす最前面のHSPウィンドウを常に非アクティブ状態にするには?8解決


のすのす

リンク

2012/4/10(Tue) 21:39:54|NO.46014

HSP3.3/WindowsXP環境です。

最前面表示させたHSPウィンドウを常に非アクティブ状態
(HSPウィンドウでonclickイベント等を一切受け付けない感じ)
にしたくていろいろ検索したのですが方法がわかりません。

ニュアンスとしては、『別ウィンドウ上にHSPウィンドウを表示させて
HSPウィンドウエリア内をクリックしてもフォーカスは移らず別ウィンドウが常にアクティブ』
…といった動作を望んでいます。

試行錯誤その1(HSPウィンドウでonclickが発生したら強制的に別ウィンドウをアクティブ化)

#include "user32.as" screen 0,,,2 ;HSPウィンドウを一旦非表示にして wait 500 ;このウェイト間に「常にアクティブにしたい別ウィンドウ」をクリックして GetForegroundWindow : handle=stat ;そのウィンドウハンドルを取得 gsel 0,2 SetForegroundWindow handle onclick gosub *disactive stop *disactive SetForegroundWindow handle return


試行錯誤その2(HSPウィンドウでonclickが発生したら強制的に非アクティブ化)

#include "user32.as" screen 0 gsel 0,2 onclick gosub *disactive stop *disactive EnableWindow hWnd,0 return

試行錯誤その1だと、HSPウィンドウをクリックするとどうしても一瞬アクティブになってしまい、
試行錯誤その2だと、HSPウィンドウをクリックした時点で常にアクティブにしたい別ウィンドウが
非アクティブになってしまいます。

「最前面HSPウィンドウをクリックしようがなにしようが完全に非アクティブ」な方法があったら
是非お知恵をお貸しください。



この記事に返信する


てれてれ

リンク

2012/4/10(Tue) 22:19:55|NO.46016

非アクティブとは少し違いますけど

//クリックを受け付けない #include "user32.as" #define WS_EX_TRANSPARENT $00000020 #define WS_EX_LAYERED $00080000 gsel 0,2 mes "ESCキーで終了" GetWindowLong hwnd,-20 SetWindowLong hwnd,-20,stat|WS_EX_TRANSPARENT|WS_EX_LAYERED //ESCキーで終了 repeat getkey exit,27 if exit : end loop



のすのす

リンク

2012/4/10(Tue) 22:57:05|NO.46018

ありがとうございます!
なるほど、HSPウィンドウの存在自体を透過させる(?)ことで
「クリックを受け付けない」という方法があったとは!

ただ、例えばこんな感じで

//クリックを受け付けない #include "user32.as" #define WS_EX_TRANSPARENT $00000020 #define WS_EX_LAYERED $00080000 gsel 0,2 mes "ESCキーで終了" GetWindowLong hwnd,-20 SetWindowLong hwnd,-20,stat|WS_EX_TRANSPARENT|WS_EX_LAYERED //ESCキーで終了 repeat : wait 10 mes cnt getkey exit,27 if exit : end loop
透過設定後にHSPウィンドウに何かを書き込んでも反映されないのですが
これは改善できないでしょうか?



てれてれ

リンク

2012/4/11(Wed) 06:53:15|NO.46022

こちらの環境では普通に表示されます。



のすのす

リンク

2012/4/11(Wed) 13:36:35|NO.46032

あれ、普通に表示されてますか?


SetWindowLong hwnd,-20,stat|WS_EX_TRANSPARENT|WS_EX_LAYERED
の一行をコメントアウトすれば、普通にカウントアップの様子が表示されるのですが
もしかして環境依存の問題でしょうか…



てれてれ

リンク

2012/4/11(Wed) 18:29:04|NO.46039

ループ内にredraw 1を置いてみても表示されませんか?



のすのす

リンク

2012/4/11(Wed) 19:31:09|NO.46040

はい、redraw 1を挟んでもダメでした。
カウント表示の色をいろいろ変えても表示されませんでした。

その代わり、SetLayeredWindowAttributes関数の第三引数で255(通常表示)を指定すると
カウント表示も正常に描写されました。

//クリックを受け付けない #include "user32.as" #define WS_EX_TRANSPARENT $00000020 #define WS_EX_LAYERED $00080000 gsel 0,2 mes "ESCキーで終了" GetWindowLong hwnd,-20 SetWindowLong hwnd,-20,stat|WS_EX_TRANSPARENT|WS_EX_LAYERED SetLayeredWindowAttributes hwnd,0,255,0 ;←これを追記すると透過設定後も描写される //ESCキーで終了 repeat : wait 10 mes cnt getkey exit,27 if exit : end loop
とりあえず当初やりたかったことはこれで一応解決したのですが、
環境依存なのかSetLayeredWindowAttributes関数に拠る「透明率指定」が
必要だったのが個人的にちょっと謎です…

「user32.as」にはGetLayeredWindowAttributes関数が含まれてないので、

GetWindowLong hwnd,-20 SetWindowLong hwnd,-20,stat|WS_EX_TRANSPARENT|WS_EX_LAYERED
この2行直後の「HSPウィンドウID:0」の透明率にどんな値が入っていたのか
調べられないのが残念です。



ヂオン

リンク

2012/4/11(Wed) 19:34:03|NO.46041

WS_EX_NOACTIVATE スタイルを指定すると クリックしてもアクティブにならなくなり
なおかつ、タスクバーに表示されなくなります。

最前面ウィンドウ指定がされていない場合は、常に最背面(desktopの次)表示されるので注意が必要です。


#include "user32.as" // setwindowlong #const WS_EX_NOACTIVATE $08000000 // クリックしてもアクティブにならない タスクバーに表示されなくなる。 #const GWL_EXSTYLE $FFFFFFEC // EXSTYLEに設定する // setwindowpos #const HWND_TOPMOST $FFFFFFFF // 最前面に設定する #const SWP_NOMOVE $00000002 // サイズ変更無効 #const SWP_NOSIZE $00000001 #const SWP_FRAMECHANGED $00000020 #define SWP_SHOWWINDOW $00000040 // 非表示でウィンドウを作成 screen 0,200,200,2 // Styleを追加。 GetWindowLong hwnd,GWL_EXSTYLE SetWindowLong hwnd,GWL_EXSTYLE,stat|WS_EX_NOACTIVATE // 最前面化 ウィンドウ表示 Styleの更新を行う。 SetWindowPos hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED|SWP_SHOWWINDOW



のすのす

リンク

2012/4/12(Thu) 01:15:27|NO.46044

「WS_EX_NOACTIVATE スタイルを指定する」という方法もあるのですね!
勉強になりました。



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