忍者ブログ
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

続きの記事です。
このブログ横幅狭いんで、コピペしてみたほうがいいと思います・・・。
あとタブが無効にされるみたいなんで、段がちょっと分かりにくいですが。

---------------------エクセルチェック---------------------
var LimechatPath; //ユーザ設定のパスを格納する
var ExlExistCheck; //ExcelCheck.jsでの結果を格納する。
var ExlOpenCheck; //ExcelCheck.jsでの結果を格納する。

LimechatPath="絶対パスを記述"

ExlExistCheck = false; //初期化
ExlOpenCheck = false; //初期化
var ExlCheckCounter = 0;

var fso = new ActiveXObject('Scripting.FileSystemObject');
if(!fso.FileExists(LimechatPath)){
ExlExistCheck = false;
}else{
ExlExistCheck = true;
var e= new Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process"));
for (;!e.atEnd();e.moveNext()){
var Process = e.item();
if(Process.Name == "EXCEL.EXE"){
ExlCheckCounter++;
}
}
if(ExlCheckCounter == 0){
ExlOpenCheck = true;
}else{
ExlOpenCheck = false;
}
e = null;
}
fso = null;
}
---------------------------------------------------------

Limechatpathに多重制御したいエクセルファイルの絶対パスを格納します。
ここでは、
①そのパスにちゃんとファイル存在してる?
②いまエクセル開いてない?
と言うことを最初にチェックしています。
フラグを2つ用意してます。
ExlExistCheck はファイルが見つかればtrue
ExlOpenCheck は他にエクセルが開いてなければtrue
となっています。
細かく見ていくと
if(!fso.FileExists(LimechatPath))
の部分でファイルの存在を見ています。
エクスクラメーション「!」は否定を意味します。
なのでファイルが存在していない場合にはifの内部に分岐し、ファイルが存在していればelseに分岐します。

Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process"));
これがプロセスを見るおまじないです。

for (;!e.atEnd();e.moveNext()){
var Process = e.item();
if(Process.Name == "EXCEL.EXE"){
ExlCheckCounter++;
}
}
続くこの部分で、プロセスを1つ1つ見て、プロセスを全部見終わるまでこのforから抜けません。
もしEXCEL.EXEが見つかったらExlCheckCounterを1つ加算しなさいという無いようです。

if(ExlCheckCounter == 0)
エクセルが開いてないってことはこのExlCheckCounterが0だということなので、0の場合はtrueを、そうじゃないときはfalseを返します。

なので、ファイルがあってエクセルは今何も開いてないよ。となると
2つのフラグがtrueで返るようになっています。がExlOpenCheckがtrueになるにはfileExistがtrueになってないといけないので、実際このあとの判定はExlOpenCheckだけで行っています。

----------------------フラグを受け取ったあと-----------
if (ExlOpenCheck == true) {
var objExcel = new ActiveXObject("Excel.Application");
objExcel.Visible = true;
objExcel.Workbooks.Open(LimechatPath);
objExcel.DisplayAlerts = false;
objExcel = null;
var e= new Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process"));
for (;!e.atEnd();e.moveNext()){
var Process = e.item();
if(Process.Name == "EXCEL.EXE"){
var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
var PC=テキストファイルの名前
var objOutFile = objFileSys.OpenTextFile(PC, 2);
objOutFile.WriteLine("ProcessID="+Process.ProcessID);
objOutFile.Close();
objFileSys = null;
objOutFile = null;
}
}
---------------------------------------
最初のほうはエクセルを開く作業なので特に解説はいらないかと。
で、プロセスIDをゲットするには、エクセルを開いたあとに再びプロセスを見に行きます。↓またこれです。
Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process"));
さっきは解説してなかったですがvar Process = e.item();はプロセスをみたときに色々情報を収集する命令です。itemを収集しないとプロセス名もプロセスIDもみれません。これを行うことによってProcessにはプロセス名とかプロセスIDとかいろんな情報が格納されます。で、実際に参照するにはProcess.NameのようにドットとNameなどを付けて、集めた情報から名前だけを見せてください。と命令します。

コレを使って、まずはEXCEL.EXEを見つけます。そして見つかったら、
var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
var PC="テキストファイルのパス"
var objOutFile = objFileSys.OpenTextFile(PC, 2);
でプロセスIDを格納するテキストファイルを指定します。
えーっと本来であればメモリ空間を確保してそこにプロセスIDを覚えさせればいいんでしょうが、テキストファイルにプロセスIDを書き込んじゃいます。こうしている理由は色々ありますが、一番の理由がそのやり方がわからない。です!

objOutFile.WriteLine("ProcessID="+Process.ProcessID);
いまちょうどテキストファイルにアクセスしている状態なので、ライトラインでプロセスIDを書き込んじゃいます。先のとおりProcess.ProcessIDは集めた情報からプロセスIDだけ見せてくれと言う命令です。

さて、コレで初回起動が終わって、多重起動を制御する準備は出来ました。

あとはこのファイルにアクセスする際には、同じようにプロセスIDをテキストファイルから持ってきてマッチングを取れば、確かにそのエクセルファイルが立ち上がっていると(ファイル名が取得できなくても)確信がもてるようになります。

また、上のソースをRUNさせるトリガですが、Limechatなので、コマンドによってRUNするようにします。そうすれば、二回目にコマンドで起動しても、他のエクセルが立ち上がっていると認識されて多重起動が制御できます。手動で立ち上げてもウィンドウがアクティブになる程度です。

*上記ソースはそのままでは使えません。
・エクセルファイルへの絶対パスを記述する必要があります。
・テキストファイルを指定する必要があります
・RUNのためのトリガがひつようです
・2つ目のソースはフラグがfalseで返ってきたときの処理の記述が抜けています。てきとうにエラーメッセージを吐く記述が必要です。

一例ですがプロセスIDの参照方法(functionにしちゃってます)
--------------------------
function ExcelCheck2() {

ExlExistCheck = false; //初期化。親元でグローバルで宣言してるので引数としてもらう必要はなし
ExlOpenCheck = false; //おなじく初期化。
PIDExistCheck = false; //されど初期化
//事前に取得したPIDを格納するよ。
var file = OpenFile(PC); //PCにはPID.dllへのパスが格納されている。
if (file){
PIDExistCheck = true; //PID.dllがあったらtrue
var s;
while(s=file.readLine()){
if(s.match(/ProcessID=/)){
var PID = s.replace(/ProcessID=/,"");
}
}
file.close();



var fso = new ActiveXObject('Scripting.FileSystemObject');
if(!fso.FileExists(LimechatPath)){
ExlExistCheck = false; //エクセルがないときはExistをfalse
}else{
ExlExistCheck = true; //エクセルがあったらExistをtrue
var e= new Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process"));
for (;!e.atEnd();e.moveNext()){
var Process = e.item();
if(Process.Name == "EXCEL.EXE"&&Process.ProcessID == PID){ //AND条件
ExlOpenCheck = true; //エクセルのPIDが一致したらOpenをtrue
}
}
e = null;
}
fso = null;
}else{
PIDExistCheck = false; //PID.dllがなかったらfalse
}
}
PR
jscriptでのエクセルの多重起動の制御について。
(特定のファイルが開いていることを知る方法)

◇まずは必要性について
エクセルをデータロガーのように、開いた状態にしておいて、Limechatから自動で必要な発言だけを収集する。などといった動作をさせたいとします。

エクセルの操作をjscriptで行いたいとき、開くときにはWorkbooks.Open等を使うと思います。また、既に開いているエクセルにアクセスする際にはGetobject等を使うと思われます。

結構これらは曲者で、トリガのたびにWorkbooks.Openなんてしてたらウィンドウがガンガン増えていきますし、Getobjectはちゃんと指定したエクセルが既に開いている状態でないといろいろ予期しない動作をします。
特に二回目以降は読み取り専用で開いていくので厄介です。

なので特定のファイルがいま開いています。と言う状態を知りたいわけです。
そして確かに開いてます。と分かればGetobjectで安全にアクセスできると言うわけです。

多重起動と書いてますが、私のメインの使用目的は上記のようなものです。


◇考え方
jscriptでの多重起動は結構厄介です。
VB.NETをやったあとだと特にそう感じます。

多重起動のチェックは通常はファイル名等を見る
・MainWIndowTitleプロパティ
・Mutexクラス
等の方法があるのですが、今回はLimechatでのVerについて限定します。
このVer5.8.22886ではこれらが使えません。
なので代案として、

プロセス監視

を用います。

基本的な考え方としては
・既にそのプロセスが存在していたら多重起動をさせないように制御する
具体的にいえばプロセスにEXCEL.EXEが既にあったら制御を掛けるといったふうになります。

しかし、エクセルは開くたびにプロセスが個数分増えていきます。
3つのエクセルファイルを開けば3つのEXCEL.EXEプロセスが生まれます。
なのでこのエクセルファイルの多重起動を制御したい。と言う場合にはプロセスの監視だけでは不十分です。
つまり以下の問題が発生します。

①プロセスではファイル名が分からない。
②ファイル名を取得する手法がjscript5.8.22886では使えない
③エクセルは複数プロセスを発生させる(すべてEXCEL.EXE)

以上の理由によって複数のエクセルが開いている場合には、特定のエクセルファイルの判別が困難になっています。

じゃぁ固有の属性は何か無いかと考えたときに、プロセスIDがあります。
・プロセスIDは同時には重複しない
・開くたびに割り振られるIDが変わる
・開いている間はずっと固定
こういう特徴があります。

多重起動を制御するということは、一度は既に開いた状態なのですから、その初回のときにEXCEL.EXEのプロセスIDを記憶させておいて、以後プロセスIDを指定してアクセスするようにすれば、他のエクセルが混じっていても特定のエクセルファイルを操作できますし、多重起動のチェックも出来ます。

しかしこの手法には、「初回起動時に他のエクセルが起動していないこと」が必須条件になります。
というのもプロセスIDを取得するにはやはりプロセスからEXCEL.EXEを探して、それに付随するプロセスIDを記憶させるからです。他のEXCEL.EXEが混ざっていると正しく取得が出来なくなります。

◇必要な機能
まとめるとだいたい以下のような機能を持ったスクリプトを組まないといけません。
①特定ファイルの初回起動時に他のEXCELが開いてないかチェックする機能
②起動させるときにプロセスIDを記憶させる機能
③エクセルにアクセスするトリガが発生したときに、PIDを使って特定のファイルにアクセスする機能

ソースと解説はまた後日追記します。
どうもシュクレールです。

前回の修正を含めた
WARGs1.01のβが完成しました。

身内に公開してテストしてもらう予定です。

あんな機能も欲しい
こんな機能も欲しい
ってやってるとすごく複雑なソフトが出来上がっていきますね。

しかしまぁ、やっとベヨネッタができるかなぁ・・・とか。
でもファンタシースター2の体験版が面白いんだよな。
体験版で5時間くらい遊べるってのもすげーです。

だれかブルースいかせて!!
こんばんはシュクレールです。

なんやかんやあって名称をWARGsとしました。

β版ですが、98%完成です。
画像はWikiからのを自分で二次加工することにしました。

フル透過モードと透過解除モードを追加。

ギルマスライブラリについてはちょっと力技で解決しました。

起動時にアプリケーションが起動しているパスは取得してるので、それにMasterLibraryをくっつけて、フォルダ内部のファイルをGetfileで全部取り出します。サブディレクトリは含まないで。

一気に配列に入れるのも考えたんですが、テキストファイル以外が混ざると困るので、For Each inでひとつひとつ調べて拡張子がテキスト以外のものは除外するようにしました。

で、テキストのファイル名(拡張子を省く)をGetFileNameで取り出して、コンボボックスに追加すると同時に、配列を作って、そのファイルのパスをひとつひとつ加えていきます。このとき配列の番号はカウンターをiで作って追加するたびに回していきます。

で、個々までが初回起動時。

次に実際にコンボボックスで選択された場合。

実は配列の番号とコンボボックスのSelectedIndexが一致するので(するように最初追加させたから)、このSelectedIndexを配列番号にして配列からアドレスを引っ張ってきます。あとはStreamReaderでファイルの中身を読んで、テキストラベルボックスに反映させるだけです。

一応うまく動いてよかったです。

あと何気にアイコンも自作してみました。4つくらい作って一番アイコンとしてみやすいものを選びました。

どうもシュクレールです。
ハード屋なのにソフトが楽しくなってきました。
VB.NETは出来ることが多いので、jscriptのように代案を考える必要もないので。
あとぐぐるとすぐ出てくるのでいいっすねー・・・。

というわけで開発途中経過です。

ちょっとスクリプトの部分が裏に見えてますが気にしないでください。

リンクフラッグナビゲーションの部分が出来ました。
左上のコンボボックスに同期して変わるようになってます。

右下の部分はいろいろテスト用のものです。
この部分にマスター情報を出力させようかなと思っています。
ただ、ライブラリから読み込んでコンボボックスにファイル名を表示させるのは出来たのですが、そのファイル名の中身とどうやってリンクさせようかなーと思っています。
なんかif文でSelectedText="同盟名"で分岐させようとしても、文字列をうまく拾ってくれなくてどうしようかと・・・。DropDownだと文字列拾えないとかMSDNに書いてあるし・・・。なんか前もってリンクさせておく必要がありそうですなぁ。
悩み中・・・。

あとレイアウトを左右入れ替えられるようにしようかなと思っています。
チェックボックスで各デザインの座標を変えるだけなのでこれは簡単に出来そうでした。
まぁ、全部出来上がらないと書き込めないスクリプトなのでさいごっすね。

そんな感じです。
今週中にはβ版完成させたいんですが、まぁ、週末あれだからねぇ・・・。
来週になりそうなよかん。

あと、地味に名前を付けてみました。
War Asist for Ragnarok SE
略してW.A.R.S
どうだ!中2っぽいだろ!英語おかしいあたりが!
あとすぐ英語にしたがるあたりが!
でもRagnarok SEっておかしいからせめてGVGを入れようか迷ってるがどうでもいいところです。
W.A.R.G.S?
PREV ←  HOME  → NEXT
プロフィール
HN:
komyu/シュクレール/修造
性別:
非公開
自己紹介:
こうぶつはけものみみとのーびす(♀)とエリーン
主にROとTERAとラノベと雑多なkomyuの日記帳です。
新生FF14
TERA紋章しみゅ
ROサポートツール
タイムライン
RSSボットが記事更新をつぶやくのがほとんどっス…
ROキャラクター紹介


TERAキャラ紹介

シュクレール(バサ)



syuzo(エレ)



サケマス(アチャ)


その他サブ

ウリエルキゥィス(スレLv54)

Vermillion(サラLv56)

パズドラ

157,318,362
フレンド募集中
枠なきゃ増やす
最終プレイ3日以上になったら消す
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
ツリーカテゴリ
ブログ内検索
最新コメント
[04/30 のな]
[03/22 NEIN]
[03/22 NEIN]
[10/31 イロイ]
[05/02 NONAME]
Copyright (C) 2024 のーびす監察日記 All Rights Reserved.
Photo by 戦場に猫 Template Design by kaie
忍者ブログ [PR]