|
|
|
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
| |
|
2019/8/28(Wed) 17:12:25|NO.88235
>NO.88231
他人に聞かず、自分で調べてみたのですが・・・全然見つからず・・・
そのまま 放置してしまいました。
|
|
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
|
|
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
| |
|
2019/8/28(Wed) 22:58:42|NO.88249
>MessageBoxだとちゃんと動作します。
それならハンドル自体は正確みたいですね。うーん力不足。
本題とは関係ないですが、返事の仕方が分からないと黙り込んでしまう性格なのですね恐らく。
返事に自信がなくても返事はしたほうが無視するよりは全然良いと思いますよ。
もちろん全てに返事が必要なわけじゃないのでそこは状況に応じてですが。
(その判断とかも難しいね・・・まあ気にし過ぎない程度に気にして欲しい)
|
|