Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016-11-22

昨日の課題を解決・・・?

| 02:03

 まず、昨日、最大化させたらうまくいくって思ったんだけど、それだけじゃダメで、位置の指定も必要もしない

 しかも、なでしこの通常の命令の場合は、親を設定したら、位置の指定は親の中での座標を指定するんだったと思う(親の画面いっぱいなら0,0みたいな?)

 でも、APIの窓ハンドル親設定で、なでしこで作ったヤツじゃ無いものを親とした場合は、「窓ハンドル画面座標計算」で取得した、デスクトップ上の座標を入れないとダメなのかもしない。(たぶん)


 して、昨日保留にした件は、あんまり知恵のある方法とも思えないけど、ほかに良い方法が思いつかないので、タイマーで、定期的に「スクリーン セーバーの設定」の窓ハンドルを監視して、見つからなかったら画面が閉じたってコトなんで、終了させるようにした。

 それで、ほんとうに一応完成したかなあと思っていたんだけど、やっぱりまだでした(涙)

 コンボボックスで、他のスクリーンセーバーを選択した場合に終了ないんだよね。

 別なスクリーンセーバーのプレビュー画面は母艦より上に描画されるし、もう一度自分を選んだ時には二重起動ないようにしてあるから一見問題なく動いてる風味なんだけど、別のスクリーンセーバーから、別のスクリーンセーバーに移る瞬、ちらっと見えたり、ウィンドウズ標準の「ブランク」なんかを選んだら、堂々と表に出てきちゃう(--;

 やっぱり、次に起動する時に二重起動させないんじゃなくて、ちゃんと一終わらせないとダメなんだよね。

 「窓ハンドル内列挙」で、ハンドルの中の子ハンドルを列挙させることが出来るので、試しに「PWHの窓ハンドル内列挙」を言わせてみると、やはり子に設定した母艦のハンドルがあるんだけど、別のスクリーンセーバーの場合もやっぱり同じように、選択されてミニ画面を表示する時には、PWHの子ハンドルとして出てくるんです。

 なので、PWHの子ハンドルをタイマーで監視して、二個以上になった時には終わらせるようにしてみました。

 これで、一応は気分良くコンボボックスのスクリーンセーバーを選ぶことが出来ます。

 してこれに伴い、当初作った二重起動の防止は不要になったかに思えます。二重起動した際も、PWHの子ハンドルに自分が二つということになるので、終了するからね。

 でも・・・最初にお試しで作った時のように、「/p」オプションはスルーで終了させて、ミニ画面には何も表示させないようなスクリーンセーバーがあった場合には終了ないよね。本来ブランクになる筈のところに、このスクリーンセーバーの画面が出てしまうってだけで、他のスクリーンセーバーに移ったり、再び自分を選択した時には終了するから、んなに実害はないけど・・・

 どーしたら良いのか、全くひらめかんorz

 ・・・これは後日の課題とゆうことにして、のうちまた何か天啓が閃いたら直すこととして、取りあえずはまあいいやってことにするかな~;;;



 あと、設定画面中のミニ画面なのに、タスクバーに出てくるってのは、変だよね~?

 いや、実験中は、終了させるのには出てきてくれていた方が、便利だったんだけども;

 そう思って調べていたら、タスクバー表示させずにフォーム表示する術を、ここで発見したので、タスクバー表示させないことにしてみました。

http://nadesi.com/cgi/bug/mbbs.php?m=thread&threadid=424



 でっ、現状はこんな感じ。

#-----------------------------------------------------------
!母艦設計=「母艦の可視はオフ母艦のタイトルは「スクリーンセーバー」

#-----テスト用----------------------------------------------
//コマンドライン¥1は「/S」。
//コマンドライン言う。
#-----宣言--------------------------------------------------
OPとは文字列。        #起動オプション。
PWHとは文字列。       #プレビューウィンドウのウィンドウハンドル。
PSとは配列。         #プレビューウィンドウのサイズ。
Pxyとは配列。        #プレビューウィンドウの位置。
SWHとは文字列        #「スクリーン セーバーの設定」のウィンドウハンドル。
SSとは配列。         #「スクリーン セーバーの設定」のサイズ。
Sxyとは配列。        #「スクリーン セーバーの設定」の位置。
Tとはタイマーの値は100。
初期マウスXとは整数=-1。初期マウスYとは整数=-1。
#-----------------------------------------------------------
#コマンドラインで取得した起動オプションで、動作を選択。
#-----------------------------------------------------------
OP=コマンドライン¥1の2文字左部分。  #起動オプション
もし、OP=「/p」または、OP=「/P」ならば、              #プレビュー(ミニ画面)
  PWH=コマンドライン¥2       #プレビューウィンドウのウィンドウハンドル
  プレビュー。
違えばもし、OP=「/c」または、OP=「/C」ならば、コンフィグ。    #コンフィグ(設定画面)
違えばもし、OP=「/s」または、OP=「/S」ならば、フルスクリーン。  #フルスクリーン(本体)
違えば終わる。
#-----------------------------------------------------------

#-----------------------------------------------------------
*プレビュー
  #「スクリーン セーバーの設定」画面内のプレビューウィンドウ(ミニ画面)の情報を取得。
  PS=PWHの窓ハンドル内サイズ取得。
  Pxy=PWHの0,0を窓ハンドル画面座標計算。

  #母艦にプレビューウィンドウの位置サイズを設定し、子ウィンドウに設定。
  母艦のスタイルは「枠なし」
  母艦のクライアント幅はPS¥0,2。
  母艦のクライアント高さはPS¥0,3。
  母艦のハンドルをPWHに窓ハンドル親設定。  #プレビューウィンドウを親部品にする。
  母艦の位置は「{Pxy¥0,0},{Pxy¥0,1}」
  母艦を最大化。

  #「スクリーン セーバーの設定」画面が閉じたら、終了させる。
  SWH=「スクリーン セーバーの設定」の窓ハンドル検索。
  Tの時満ちた時は~
    窓列挙。一時=それ。
    一時の0でSWHを0から表検索。
    もしそれ=-1ならば終わる。

    #PHW内のハンドルが2つになったら、別のスクリーンセーバーが選択されたか、
    #二重起動したといういうことなので、自身終了させる。
    PWHの窓ハンドル内列挙。
    もしそれ要素数>1ならば終わる。

  #タイマーを開始
  Tを開始。
#-----------------------------------------------------------
#プレビューウィンドウに実際に表示するもの
#-----------------------------------------------------------
  母艦デスクトップ色画面クリア。
  「プレビュー」を表示。
  母艦のハンドルを1でウィンドウ表示。  #プレビュー画面はタスクバー表示ない
#-----------------------------------------------------------
# なでしこで作ったヤツじゃ無いウィンドウを親部品にしたり、子部品にしたりできる。
# なでしこライブラリ~ http://www26.atwiki.jp/isoroku_be/pages/66.html
●窓ハンドル親設定(子ハンドルを親ハンドルに)=DLL("user32.dll","DWORD SetParent(DWORD, DWORD)")
#-----------------------------------------------------------
# タスクバーには表示ないで、フォーム表示出来る。
# 「No」= 0:オフ、1:通常、2:最小化、3:最大化、4:非アクティブ
#「なでしこ」バグ要望掲示板 http://nadesi.com/cgi/bug/mbbs.php?m=thread&threadid=424
●ウィンドウ表示(ハンドルをNoで)=DLL("user32.dll","BOOL ShowWindow(HWND hWnd,int nCmdShow)")
#-----------------------------------------------------------

#-----------------------------------------------------------
*コンフィグ
  #ダイアログを「スクリーン セーバーの設定」の中央に表示させるための設定。
  #設定用のフォームを作る場合は、別途調整が必要。
  SWH=「スクリーン セーバーの設定」の窓ハンドル検索。
  SS=SWHの窓ハンドル内サイズ取得。
  Sxy=SWHの0,0を窓ハンドル画面座標計算。
  母艦のクライアント幅はSS¥0,2。
  母艦のクライアント高さはSS¥0,3。
  母艦の位置は「{Sxy¥0,0},{Sxy¥0,1}」。

  ダイアログタイトルは「バージョン情報」
  「{二重カッコ}スクリーンセーバー{改行}   ~雛形~{二重カッコ閉じ}{改行}   Version 1.00{改行}{改行}   by 雪乃☆雫」と言う。
  終わる。
#-----------------------------------------------------------------------

#-----------------------------------------------------------
*フルスクリーン
  母艦について
    スタイルは「枠なし」
    クライアント幅はデスクトップW。
    クライアント高さはデスクトップH。
    位置は「{0},{0}」。
    キー押した時は~終わる。
    クリックした時は~終わる。
    マウス移動した時は~
      もし、(初期マウスX=-1)かつ(初期マウスY=-1)ならば、
        初期マウスX=母艦のマウスX。初期マウスY=母艦のマウスY。
      違えば、(初期マウスX=母艦のマウスX)または
      (初期マウスY=母艦のマウスY)でなければ、終わる

  オフにマウスカーソル表示設定。  #マウスカーソルオフ
#-----------------------------------------------------------
#スクリーンセーバーの本体プログラム。
#-----------------------------------------------------------
  メイン
#-----------------------------------------------------------
# マウスカーソルを消したり出したり出来る。
# 「A」= オンorオフ
# なでしこライブラリ~ http://www26.atwiki.jp/isoroku_be/pages/122.html
●マウスカーソル表示設定(Aに)=DLL("user32.dll","int ShowCursor(BOOL bShow)")
#-----------------------------------------------------------

#-----スクリーンセーバーの本体------------------------------
*メイン
  母艦デスクトップ色画面クリア。
  母艦の可視はオン
#-----------------------------------------------------------

 一応なんか、それっぽく動くようになってきたとは思うんだけど・・・

ゲスト



トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20161122