* U K I Y A H O N P O *
Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura,
che la diritta via era smarrita.
リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
浮子屋商店もよろしく。

自作SAORI/お座りマニュアル のバックアップ(No.3)


1.これは何をするものか

これはSAORI規格のDLLです。ゴーストの位置を様々なロジックに従い、特定のウィンドウの矩形と同期させる機能を持ちます。ゴーストをウィンドウに「座らせる」「貼り付ける」「ぶら下げる」といった事を目的として作成されました。

Osuwari.dllはversion1が過去に公開されており、これは機能強化したversion2となります。

尚、本DLLはmateriaでは動作しません。SSPもしくはCROWで利用してください。

2.利用法概要

ゴーストの位置の制御を開始する、あるいは制御パラメータを変更するには、START構文を用います。START構文はゴーストの存在する間、何度呼んでも構いません。

一般的には、HWNDイベントの際に呼ぶことを推奨します。一度呼べばその際の制御パラメータに従い、DLLがアンロードされるかSTOP構文が呼ばれるまで位置の制御を行うため、呼び出し続ける必要はありません。

お座りを停止させる場合にはSTOP構文を用いてください。一般的にはゴーストの終了と共にDLLがアンロードされるため、STOP構文を利用しなくても問題ないでしょう。

このDLLはオプションが多彩なため構文が少々複雑です。単純に利用する場合は「5.記載例」を先に見てください。

陥りやすい罠

  • shell の descript.txt に seriko.alignmenttodesktop,free と記載するのを忘れないようにしてください。

3.START構文

(1)構文

START構文は以下のパラメータを記載してください。
START等、この書体で記載されているものは、その通りの文字列を記載する事を示します)

Argument記載内容説明
Argument0START大文字文字列で記載
Argument1制御対象のHWND一般的にはHWNDイベントで渡されます。(5.記載例も見てください)
Argument2追尾対象下記の何れかを記載してください。
ACTIVE:アクティブウィンドウを対象にします
FIX:画面全体もしくはワークエリア(画面からタスクバー等の領域を除いた部分、つまり壁紙が見えている部分)を対象にします。
@文字列:ウィンドウタイトルに「文字列」を持つウィンドウを対象にします
#数値:ウィンドウハンドルが「数値」のウィンドウを対象にします
Argument3位置原点Argument2で指定したウィンドウの、どこを原点とするかを、下記の何れかで指定してください。
TL:左上隅を原点とします。
TR:右上隅を原点とします。
BL:左下隅を原点とします。
BR:右下隅を原点とします。
Argument4x座標差分原点からのx座標のずれを記載してください。
Argument5y座標差分原点からのy座標のずれを記載してください。
Argument6更新間隔位置のチェック間隔をミリセコンドで記載してください*1
Argument7
(optional)
オプション下記のオプションをスペース区切りで指定してください。複数指定しても、まったく指定しなくてもかまいません。
XMOVE:横方向にゴーストを移動可能にします
YMOVE:縦方向にゴーストを移動可能にします
NOCLIP:見切れ判定を行いません
Argument8
(optional)
位置取得失敗時指定Argument2がFIXの場合、対象の矩形取得に失敗した場合、あるいは見切れが発生した場合の位置を指定します。①と②をそれぞれスペース区切りで指定して下さい。指定しなかった場合はDESKTOP CENTERと指定されたものとして扱います。

①位置取得失敗時の対象
DESKTOP:デスクトップを対象とします。
WORKAREA:ワークエリアを対象とします。

②位置取得失敗時の仮想矩形
CENTER:デスクトップ又はワークエリアのウィンドウをそのまま用います。
TOP:対象の矩形の上側に仮想ウィンドウを想定します。
LEFT:対象の矩形の左側に仮想ウィンドウを想定します。
RIGHT:対象の矩形の右側に仮想ウィンドウを想定します。
BOTTOM:対象の矩形の下側に仮想ウィンドウを想定します。

(2)位置指定について

位置の指定、原点、差分について、下図を参考にしてください。
黄色はx,y差分が両方0の場合の位置になります。(例:位置原点=TR、x差分=-100、y差分=-20とした場合)

image001.png

(3)位置取得失敗時・位置固定時の動作について

以下の場合にはデスクトップかワークエリアを追尾対象とし、Argument8の記載が有効になります。

  • 追尾対象がFIXの場合
  • 追尾対象が @文字列 あるいは #数値 で、対象のウィンドウが存在しなかった場合
  • 追尾対象がACTIVEで、アクティブウィンドウを追尾対象と出来ない場合(原因は色々あります)
  • オプションにNOCLIPが指定されておらず、「見切れ」(そのまま追尾すると位置が画面からはみ出すこと)が発生する場合

その際に「代用として」計算される位置と、位置取得失敗時指定の関係については下図を参考にしてください。
以下の点線の矩形を「仮想的な追尾対象ウィンドウ」として、(2)で示した位置計算を行います*2

image002.png

なお、デスクトップとは画面全体のこと、ワークエリアとは画面からタスクバー領域を除いたものだと思って大体間違いありません。

4.STOP構文

STOP構文を用いると、DLLの動作を停止できます。以下のパラメータを記載してください。

Argument記載内容説明
Argument0STOP大文字文字列で記載

Argument1以降は記載しても無視されます。

5.記載例

(1)HWND取得の記載例

本DLLを利用するためには、位置制御対象のHWNDを知る必要があります。一般的には\0もしくは\1のHWNDを指定することになると思います。\0、\1のHWNDは本体からHWNDイベントで通知されます。 以下に里々でのHWND取得コード例を記載します。このコードによりsakurahwnd変数に\0のHWNDが入ります。

*hwnd
$temp	(split,(R0),(sprintf,%c,1))
$sakurahwnd	(S0)

(2)「お座り」

ゴーストをウインドウの右上に「お座り」させるための構文例を記載します。

Argument2:ACTIVE(アクティブウィンドウに「お座り」させる)
Argument3:TR(ウィンドウの右上を原点とする)
Argument4:-20(ウィンドウの右上から20ピクセル左に寄った場所を初期位置とする)
Argument5:-90(ゴーストの「座高」が90ピクセルの場合)
Argument6:100(100[ms]毎に更新)
Argument7:XMOVE(横方向に移動可能、見切れあり)
Argument8:BOTTOM WORKAREA(「お座り」失敗時にはワークエリアの下端に座る)

※Argument2をFIXとすると、つねにワークエリア下端に「お座り」します。

(3)「ぶら下がり」

ゴーストをウインドウの左下に「ぶら下がり」させるための構文例を記載します。

Argument2:ACTIVE(アクティブウィンドウに「ぶら下がり」させる)
Argument3:BL(ウィンドウの左下を原点とする)
Argument4:30(ウィンドウの左下から30ピクセル右に寄った場所を初期位置とする)
Argument5:160(ゴーストの「手から下の高さ」が160ピクセルの場合)
Argument6:100(100[ms]毎に更新)
Argument7:(移動できない、見切れあり)
Argument8:TOP WORKAREA(「ぶら下がり」失敗時にはワークエリアの上端にぶら下がる)

※Argument2をFIXとすると、つねにワークエリア上端に「ぶら下がり」ます。

(4)総合例

以下に、里々でゴーストを「お座り」させる例を記載します。
メニューで「デスクトップに座る」「アクティブウィンドウに座る」「座らない」を選択可能とします。

【コア部分】

@お座り
(osuwari,(A0),(A1),(A2),TR,-50,-97,100,XMOVE,BOTTOM WORKAREA)

*hwnd
$temp	(split,(R0),(sprintf,%c,1))
$sakurahwnd	(S0)
>お座り実行

*お座り実行
(call,お座り,STOP,0,0)
>タスクバーモード	(お座りモード)==1
>座らないモード	(お座りモード)==2
(call,お座り,START,(sakurahwnd),ACTIVE)

*タスクバーモード
(call,お座り,START,(sakurahwnd),FIX)

*座らないモード
#なにもしない

【メニュー部分:メニューから各*が呼ばれるものとします】

*ウインドウにも座って良いよ
:\u\s[10]\h\s[6]はい…\w5…\w5分かりました…\w5…\w5
$お座りモード	0
>お座り実行

*タスクバーにだけ座ってて
:\u\s[10]\h\s[6]はい…\w5…\w5分かりました…\w5…\w5
$お座りモード	1
>お座り実行

*どこに座ってもいいよ
:\u\s[10]\h\s[6]はい…\w5…\w5分かりました…\w5…\w5
$お座りモード	2
>お座り実行

【rキー等で里々のリロードを行う場合はその対応が必要になります】

*OnSatoriLoad
>辞書リロード後お座り	(辞書リロードずみ)==1

*辞書リロード後お座り
$辞書リロードずみ	0
>お座り実行

*OnKeyPress
>(R0)が押された

*rが押された
$辞書リロードずみ	1
$辞書リロード	実行
:(5)リロード…\w5…\w5します…\w5…\w5

6.注意事項・制限事項

  • 本DLLを利用した事による一切の損害の責任を負いません。at your own riskでお願いします。
  • osuwari.dllを利用したゴーストを複数同時起動した場合の動作は未定です。
  • 現時点では制御対象とできるウィンドウは1つだけです。\0と\1を同時に制御できません*3
  • その他異常な動作をする事があるかもしれません。その際はどんな事でも報告頂けると有難いです*4

7.謝辞

開発にあたってはえびさわ様のgethwnd.dllソースを大いに参考にさせて頂き、また勝手ながらだいぶ流用させて頂いております。お礼申し上げます。
http://www33.tok2.com/home/ebi/index.shtml 「何かぬるめの...」byえびさわ様

osuwari.dllの動作確認その他について、黒羽龍矢様及びTJ様にご協力頂いております。お礼申し上げます。
http://kurobanetatuya.hp.infoseek.co.jp/genkan.htm 「龍屋」by黒羽龍矢様
http://seriko.nanika.jp/sstpviewer/ 「SSTP-viewer’s street」by TJ様

里々のコード例の元については殊海夕音様にご協力頂いております。お礼申し上げます。
http://yune-kotomi.tarenari.jp/ 「雨上がりの青空を探して。」by殊海夕音様

Chameleon Ponapalt様には作成に当たって様々な助言を頂きました。お礼申し上げます。
http://ssp.shillest.net/ 「SSP (en)BUGTRAQ」by Chameleon Ponapalt様


*1 一般的には50~100ms程度が良いと思います。数値が小さい程「なめらかに」移動しますが、システムへの負荷も大きくなります
*2 つまり、位置原点がTLもしくはTRの時にTOPを指定するのは ―― 画面からはみ出して見えなくなってしまうため ―― ナンセンスです。
*3 「りむ・えくすとり~む」では、osuwari.dllをosuwari0.dll、osuwari1.dllとリネームし、\0と\1でそれぞれを利用することによってこの制限を回避されています。思いつきませんでした。
*4 それは仕様かもしれませんしバグかもしれません、直せるとも限りませんが