[2527] こんな感じです

投稿日 2019/11/20(Wed) 09:56:20
投稿者 アーク info.nds.laboratryあっとまーくgmail.com
参照先

こんにちは。アークです。

疑似ウィンドウメッセージ方式の実体は「sendkeys()」です。
起動したら自分と同じプロセスを確認します。
この時点では未だウィンドウは持っていないのでタイトルも無いです。
それを利用して既に起動中のプロセスを見分けています。

今回は処理の複雑化を避ける為に最初の引数だけを扱っていますが、
引数を並べて処理をする事もできなくは有りません。
多重起動チェックで同じプロセスが既に起動していたら、
引数を送り自らは終了します。

問題は「sendkeys()」された引数を受け取る処理ですが、
プロデルの命令には無いようです。
そこで工夫をしてテキストボックスで受けるように細工しています。
そのテキストボックスは裏処理で使うだけなので領域外に追い出して隠しています。

テキストボックスで引数を受け取るとそのイベントを利用してキューに入れています。
これは既に起動していたプロセスの動作状態により直ぐに使えない状況が考えられるからです。
テキストボックスのイベントを使わずにタイマーで監視した方が良い場合も有ると思います。
以下、ソースです。
------------------------------------------------------------------------------------
もしプログラムの起動時設定が「」でないなら
  引数は、プログラムの起動時設定
  第一引数は、引数(1)
そうでないなら
  第一引数は、「」
もし終わり
一覧は、「TestApp」のプロセス一覧
インスタンス数は、一覧の個数

もしインスタンス数=1なら
  メイン画面を表示する
  待機する
そうでないなら
  一覧を要素にそれぞれ繰り返す
    もし要素のタイトルが「」でないなら
      要素へ「[第一引数]|」を入力する
    もし終わり
  繰り返し終わり
  終了する
もし終わり

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
    キュー1というキューを作る
    記録器は、文字列書込器を作ったもの
    値=0
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この実質大きさを{408,125}に変える
  この内容を「メイン画面」に変える
  初期化開始する
  テキスト2というテキストを作る
    その位置と大きさを{12,25,379,19}に変える
    その移動順を11に変える
  ボタン2というボタンを作る
    その位置と大きさを{280,72,85,32}に変える
    その内容を「表示」に変える
    その移動順を10に変える
  テキスト1というテキストを作る
    その位置と大きさを{12,-100,380,19}に変える
    その文字配置を「左」に変える
    その移動順を1に変える
    その背景色を「」に変える
  ボタン1というボタンを作る
    その位置と大きさを{154,72,85,32}に変える
    その内容を「全て終了」に変える
    その移動順を9に変える
  初期化終了する
終わり
  
  開いた時の手順
    テキスト1の内容を「[第一引数]」に変える
    引数を更新する
  終わり
  
  アクティブ時の手順
    テキスト1へフォーカス
  終わり

  ボタン1がクリックされた時の手順
    記録器をクリアする
    一覧を要素にそれぞれ繰り返す
      終了する
    繰り返し終わり
  終わり

  テキスト1の内容が変化した時の手順
    もし(テキスト1の内容の末尾から1文字取り出したもの)が「|」なら
      引数を更新する
    もし終わり
  終わり
  
  引数を更新する時の手順
    もしテキスト1の内容が「」でないなら
      キュー1に「[テキスト1の内容]」を入れる
      テキスト1の内容を「」にする
    もし終わり
  終わり

  ボタン2がクリックされた時の手順
    もしキュー1の要素数>0なら
      テキスト2の内容を(キュー1から取り出したもの)に変える
    そうでないなら
      テキスト2の内容を「」に変える
    もし終わり
  終わり
終わり
------------------------------------------------------------------------------------

次はNTFS代替データストリーム(ADS:Alternate Data Stream)方式です。
ADS自体はフォルダやバイナリも対象になっているので網羅して実装すると大変なのですが、
テキストに限定して個数や名前も固定して使うのなら比較的容易です。
今回は最も簡単な方法で実装してみました。

この方式は先の「sendkeys()」方式とは異なり共有メモリのイメージに近いです。
多重起動のチェック等は先の方式と同じです。
引数はADSの裏ストリームへ一時保存します。

先に起動していたプロセス側はアクティブ時に裏ストリームから読み出してキューに蓄積します。
フォーカスイベント利用しているので完全にバックグラウンドで動かす場合には、
やはりタイマーなどで定期的にチェックした方が良いかも知れません。
どちらの方式も引数を渡す処理以外は手を抜いています。

この方式の条件は使用するストレージのファイルシステムがNTFSで有る事です。
今のウィンドウズは殆どがそうだと思います。
以下がソースです。
------------------------------------------------------------------------------------
もしプログラムの起動時設定が「」でないなら
  引数は、プログラムの起動時設定
  第一引数は、引数(1)
  「echo [第一引数]>"[プログラムの位置]TestApp.exe:argument"」をコマンド実行する
そうでないなら
  第一引数は、「」
もし終わり
一覧は、「TestApp」のプロセス一覧
インスタンス数は、一覧の個数

もしインスタンス数=1なら
  メイン画面を表示する
  待機する
そうでないなら
  一覧を要素にそれぞれ繰り返す
    もし要素のタイトルが「」でないなら
      要素のIDのプロセスへ切り替える
    もし終わり
  繰り返し終わり
  終了する
もし終わり

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
    キュー1というキューを作る
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この実質大きさを{408,125}に変える
  この内容を「メイン画面」に変える
  初期化開始する
  テキスト1というテキストを作る
    その位置と大きさを{12,25,379,19}に変える
    その最大文字数を200に変える
    その選択表示維持を○に変える
    その移動順を11に変える
  ボタン2というボタンを作る
    その位置と大きさを{280,72,85,32}に変える
    その内容を「表示」に変える
    その移動順を10に変える
  ボタン1というボタンを作る
    その位置と大きさを{154,72,85,32}に変える
    その内容を「全て終了」に変える
    その移動順を9に変える
  初期化終了する
終わり
  
  アクティブ時の手順
    テキスト1へフォーカス
    引数を更新する
  終わり

  ボタン1がクリックされた時の手順
    キュー1をすべて消す
    「@PowerShell ^&{Clear-Item -Path '[プログラムの位置]TestApp.exe' -Stream argument}」をコマンド実行する
    一覧を要素にそれぞれ繰り返す
      終了する
    繰り返し終わり
  終わり
  
  引数を更新する時の手順
    結果は、「more < "[プログラムの位置]TestApp.exe:argument"」をコマンド実行したもの
    「@PowerShell ^&{Remove-Item -Path '[プログラムの位置]TestApp.exe' -Stream argument}」をコマンド実行する
    もし結果が「」でないなら
      キュー1に「[結果]」を入れる
    もし終わり
  終わり

  ボタン2がクリックされた時の手順
    もしキュー1の要素数>0なら
      テキスト1の内容を(キュー1から取り出したもの)に変える
    そうでないなら
      テキスト1の内容を「」に変える
    もし終わり
  終わり
終わり
------------------------------------------------------------------------------------


関連一覧ツリー

をクリックするとツリーを一括表示します)

返信フォーム

(この投稿に返信する場合は下記フォームから投稿して下さい)
(1MBまで)
(英数字で8文字以内)

- 投稿修正/削除フォーム -
処理 No パスワード

▲ページの先頭へ

- WebForum -