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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0828
スクリーンセーバーでEnableWindowが効かない7未解決


リンク

2019/8/28(Wed) 11:23:35|NO.88230

HSPでスクリーンセーバーを作っているのですが、EnableWindow関数が全く効果がないのですがどうすればいいですか?
スクリーンセーバーの設定ウィンドウで設定ボタンを押した場合です。

;HSP スクリーンセーバー テンプレート用 #module #defcfunc intex str p1;数字以外の文字を含む数字を数値に変換 text=p1 sdim text_,strlen(text) repeat strlen(text) a=peek(text,cnt) if a>=48 & a<=57:poke text_,ct,a:ct+1 loop return int(text_) #global #uselib "user32.dll" #cfunc IsWindow "IsWindow" int #cfunc GetWindowLong "GetWindowLongA" int , int #func SetWindowLong "SetWindowLongA" int , int , int #func EnableWindow "EnableWindow" int,int #func MessageBox "MessageBoxA" int,str,str,int #packopt type 2 #packopt hide 1 #define GWL_EXSTYLE -20 #define WS_EX_TOOLWINDOW 0x0080 #define GWL_HWNDPARENT -8 para=dir_cmdline ;if instr(para,,"/a")=0|instr(para,,"/A")=0|instr(para,,"-a")=0|instr(para,,"-A")=0:;パスワード設定(古いOSしか対応していない?) if instr(para,,"/p")=0|instr(para,,"/P")=0|instr(para,,"-p")=0|instr(para,,"-P")=0:goto *preview;プレビュー if instr(para,,"/s")=0|instr(para,,"/S")=0|instr(para,,"-s")=0|instr(para,,"-S")=0:goto *saverrun;実行 if instr(para,,"/c")=0|instr(para,,"/C")=0|instr(para,,"-c")=0|instr(para,,"-C")=0:goto *config;設定 if para="":cfgwindow=0:goto *no_modal_config;通常は設定画面を表示 ;dialogではなくMessageBox関数で表示、ウィンドウ非表示状態だと正常に表示されないことがあるため MessageBox 0,"コマンドラインの引数が無効です。\n"+para,"エラー",16 end stop *config ;コマンドライン文字列のスクリーンセーバーの設定のウィンドウハンドルの取得 ;このウィンドウハンドルを使って、設定画面がスクリーンセーバーの設定のウィンドウの後ろに回り込まないようにするための処理(HSPではあまり使われないかもしれない) cfgwindow=intex(para) if IsWindow(cfgwindow)=0:cfgwindow=0 *no_modal_config screen 0,400,240,2 SetWindowLong hwnd,-16,GetWindowLong(hwnd,-16)-$20000 if cfgwindow!0{ SetWindowLong hwnd,GWL_HWNDPARENT,cfgwindow EnableWindow cfgwindow,0 onexit *modal_close } gsel 0,1 stop *modal_close SetWindowLong hwnd,GWL_HWNDPARENT,0 EnableWindow cfgwindow,1 end stop *preview ;プレビュー画面の表示 ;screenやbgscrを使うとプレビュー画面に表示されないため、作成しないほうが良い。 ;=intex(para) mes "プレビュー\nテスト" ;goto *main stop *saverrun ;実行 bgscr 0,ginfo(20),ginfo(21),2,0,0 SetWindowLong hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)|WS_EX_TOOLWINDOW;タスクバーにないウィンドウの作成 gsel 0,2;手前に表示する onclick *exit;場合によってはマウス動かしても終了しないことがあるため、クリックしたら終了するようにする *main ;スクリーンセーバーはHSPで何も処理しなくても、マウス動かすと終了するが、ループさせないと終了しないことがあるので注意 mes "スクリーンセーバーテスト" repeat wait 1 loop stop *exit end



この記事に返信する


ham

リンク

2019/8/28(Wed) 12:38:15|NO.88231

その前にこれは解決しなかったのだろうか
http://hsp.tv/play/pforum.php?mode=all&num=88050

もし何かが分からなかったなら、ちゃんと伝えないと損しちゃうで。
前にも↑のと同じ質問してわざと無視してたけど。なんでなの?w



リンク

2019/8/28(Wed) 17:12:25|NO.88235

>NO.88231
他人に聞かず、自分で調べてみたのですが・・・全然見つからず・・・
そのまま 放置してしまいました。



ham

リンク

2019/8/28(Wed) 20:30:26|NO.88237

>他人に聞かず、自分で調べてみたのですが・・・全然見つからず・・・
それは私の回答の中のどこかが分からなくてそれを調べたって事です?
もしそういう事なら普通に返事くれればいいのだけど...w
そうじゃなくて他の意味??


そして本題のEnableWindowについて。
このスクリプト全体を理解したわけではないですが、
cfgwindowにウィンドウハンドルじゃなくて別の物が入っているような気が。

具体的に言うと「cfgwindow=intex(para)」の部分が違うような。
そこは消して、"コンフィクウィンドウを作るscreen"の下に
「cfgwindow=hwnd」を入れれば解決しそうな気がしました。
勘違いだったらすみません。意味が分からなかったら気軽に言ってもらえれば。



リンク

2019/8/28(Wed) 20:54:07|NO.88241

>cfgwindowにウィンドウハンドルじゃなくて別の物が入っているような気が。
cfgwindowはHSPのウィンドウハンドルではなく、スクリーンセーバーの設定のウィンドウハンドルのことです。
↓ここ見れば多分わかると思います。
https://w.atwiki.jp/kirinkai/pages/24.html?_gl=1*1ks8uez*_ga*MGYyc0tGRmdNQkNCcFpzTk45d2tVMGVoMzlyRGVlVmZaM1BxOFluaUpNSWJCUm8wT1R6WXRBaEhZNE03LUFNMA..



ham

リンク

2019/8/28(Wed) 21:44:36|NO.88244

スクリーンセーバーだとコマンドラインに設定画面のハンドルが元々入ってるんですね。
だから「cfgwindow=intex(para)」これなのか。
EnableWindowだけ使えなくてSetWindowPosは使えてるんですか?
そうなら私には分からないかも。



で、NO.88235は結局どういう意味なのか..回答の内容が理解できなかったから
放置してしまったって事?
何か悪かったのかも分からないのでハッキリしたいな。



リンク

2019/8/28(Wed) 22:29:03|NO.88247

>EnableWindowだけ使えなくてSetWindowPosは使えてるんですか?
MessageBoxだとちゃんと動作します。

;HSP スクリーンセーバー テンプレート用 #module #defcfunc intex str p1;数字以外の文字を含む数字を数値に変換 text=p1 sdim text_,strlen(text) repeat strlen(text) a=peek(text,cnt) if a>=48&a<=57:poke text_,ct,a:ct+1 loop return int(text_) #global #uselib "user32.dll" #cfunc IsWindow "IsWindow" int #cfunc FindWindow "FindWindowA" sptr,sptr #cfunc GetWindowLong "GetWindowLongA" int , int #func SetWindowLong "SetWindowLongA" int , int , int #func EnableWindow "EnableWindow" int,int #func MessageBox "MessageBoxA" int,str,str,int #packopt type 2 #packopt hide 1 #define GWL_EXSTYLE -20 #define WS_EX_TOOLWINDOW 0x0080 #define GWL_HWNDPARENT -8 para=dir_cmdline ;if instr(para,,"/a")=0|instr(para,,"/A")=0|instr(para,,"-a")=0|instr(para,,"-A")=0:;パスワード設定(古いOSしか対応していない?) if instr(para,,"/p")=0|instr(para,,"/P")=0|instr(para,,"-p")=0|instr(para,,"-P")=0:goto *preview;プレビュー if instr(para,,"/s")=0|instr(para,,"/S")=0|instr(para,,"-s")=0|instr(para,,"-S")=0:goto *saverrun;実行 if instr(para,,"/c")=0|instr(para,,"/C")=0|instr(para,,"-c")=0|instr(para,,"-C")=0:goto *config;設定 if cfgwindow=0:goto *no_modal_config;通常は設定画面を表示 ;dialogではなくMessageBox関数で表示、ウィンドウ非表示状態だと正常に表示されないことがあるため MessageBox 0,"コマンドラインの引数が無効です。\n"+para,"エラー",16 end stop *config ;設定 ;コマンドライン文字列のスクリーンセーバーの設定のウィンドウハンドルの取得 ;このウィンドウハンドルを使って、設定画面がスクリーンセーバーの設定のウィンドウの後ろに回り込まないようにするための処理(HSPではあまり使われないかもしれない) cfgwindow=intex(para);スクリーンセーバーの設定のウィンドウハンドルの取得 if IsWindow(cfgwindow)=0:cfgwindow=0;スクリーンセーバーの設定のウィンドウが存在しない場合は0にする。 *no_modal_config MessageBox cfgwindow,"このスクリーンセーバーには設定できるオプションはありません。","スクリーンセーバー オプションなし",64 end stop *modal_close SetWindowLong hwnd,GWL_HWNDPARENT,0 EnableWindow cfgwindow,1 end stop *preview ;プレビュー画面の表示 ;screenやbgscrを使うとプレビュー画面に表示されないため、作成しないほうが良い。 ;previewwindow=intex(para) mes "プレビュー\nテスト" ;goto *main stop *saverrun ;実行 bgscr 0,ginfo(20),ginfo(21),2,0,0 SetWindowLong hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)|WS_EX_TOOLWINDOW;タスクバーにないウィンドウの作成 gsel 0,2;手前に表示する onclick *exit;場合によってはマウス動かしても終了しないことがあるため、クリックしたら終了するようにする *main ;スクリーンセーバーはHSPで何も処理しなくても、マウス動かすと終了するが、ループさせないと終了しないことがあるので注意 mes "スクリーンセーバーテスト" repeat wait 1 loop stop *exit end



ham

リンク

2019/8/28(Wed) 22:58:42|NO.88249

>MessageBoxだとちゃんと動作します。
それならハンドル自体は正確みたいですね。うーん力不足。



本題とは関係ないですが、返事の仕方が分からないと黙り込んでしまう性格なのですね恐らく。
返事に自信がなくても返事はしたほうが無視するよりは全然良いと思いますよ。

もちろん全てに返事が必要なわけじゃないのでそこは状況に応じてですが。
(その判断とかも難しいね・・・まあ気にし過ぎない程度に気にして欲しい)



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