いちにい さん 2001年 06月 23日 23時 21分 23秒

To: 管理人むたぐち さん

> おお、ありがとうございます。
> これで謎が解けました。

でも、使えないんですよね。(悲)


> 私からもお願いします。
> Win98,2000ともに、文字数が一定量を超えるとwscript.exeが落ちますね。

多分、VBSでは、駄目な感じですね。
VBでは、API(lstrlen, lstrcpy)宣言の引数の型を、「Any」にして、
呼び出し側で、「ByVal」キーワードを指定して呼び出さないと、
動かないんですが、VBSでは、コレが出来ないんですよ。
と言うか、「DYNACALL」の問題?
クリップボードへ、文字列をセットする場合も同じです。


>> "Progman"と、"Program Manager"は、OSによって変わるかも知れないので。
>> Spy++とかで、探ってみて下さい。
> Spy++持ってないです(^^;
> # Visual StudioじゃなくVB単体しかもってないので。
> 代替ツールありませんかね?

ベクター辺りに、ウインドウの属性を調べるツールがあったと思いますが、
Spy++見たく、リストビューで列挙するタイプは、無かったような・・・。
見たのは、だいぶ前ですけど。
例のウインドウのhWndを列挙する関数を使えば、キャプションと、クラス名、
hWnd、サイズ、可視/非可視、最小化状態などをリストするツールくらいなら、
作れますよ。


>> 所で、VBSで、クラスが作れるんですね。知らなかった。(こりゃ便利。笑)
> 私は使いどころが今ひとつわからぬ…。
> # wsc作るとき以外に使い道ってあるの?
> # ん? wscは関係なかったか…?

使い所は、色々です。
VBSでは開発経験が少ないので、まだ、作ったこと無いですが、VBでは、
チョコチョコ、使ってます。
自分の場合は、コントロールや、フォームの機能拡張なんかに使ってます。
後、自作関数や、APIのラッパーとか。
例えば・・・。
 フォームの位置や、サイズ、最小化・最大化状態のINIファイルへの保存、
 読み込み、状態復元。
 コンボボックスの項目登録・削除、内容のINIファイルへの保存、読み込み、
 状態復元。
 コントロールの位置又は、サイズの、フォームサイズ変更への追従。
 等・・・。これらは、コントロールや、プロパティを指定するだけで、後は、お任せです。

VBSでは、コントロールとか無いですけど、汎用性の高い、関連のある自作関数なんかを、
1つに纏めてパックしておけば、一々ネタ帳から関数をコピペしなくても楽に機能を、
追加できます。
関数をコピペだと、問題があったときに、その関数を使った全てのスクリプトファイルに、
変更を掛けないと行けないですけど、クラスとかなら、それ1つを変更すれば、
即、反映されます。

実は、「WSC」を知りませんでした。(笑)
こんな物があったんですね。凄く便利。(コンテンツを、全然見てないなぁ。笑)
で、早速、WSCを使って、例のウインドウ名の列挙関数を、comにしてみました。
100行位有った、スクリプトも、20行以下になってスッキリです。
たまたま、comにしましたが、クラスを使った場合でも同じ様なもんです。
VBS以外で使わないなら、クラスでも良いいと思いますよ。


>> コレも、家の環境だけで動いたりして。(笑)
> っぽいです。
> メッセージボックスが延々と出るだけです(^^;

又ですか。(笑)
その症状からして、多分、「FncShowExitUI」関数内の、
hRet = FncGetExitUIHnd(VBSMSGBOX_CLSNAM, VBSMSGBOX_CPTIN, SCRIPTNAME)
が、失敗してますね。
原因としては、「Private Const VBSMSGBOX_CPTIN = "VBScript: "」の文字列が異なるか、
「FncGetExitUIHnd」関数内の、
hRet = obj_FindWindowEx.FindWindowEx(0, 0, CStr(sMsgBoxClsName), CStr(sMsgBoxCptn))
が、失敗してます。
「FindWindowEx」が駄目な場合は、諦めるしかないです。(笑)


↓この問題については、判りました。

>>> ウインドウ名を表示から、チョット改造しました。
>>> 起動してから、メモ帳を新規に3つ起動すると、Msgが出ます。
>>> Win98しか確認してません。(笑)
>> Win98では何も起こりませんでした。何故?

えー。バグです。(笑)

「FncGetWndCaption」関数内に、

lNullPos = InStr(sBuff, Chr(0))
If 1 < lNullPos Then
  sBuff = Left(sBuff, lNullPos-1) '要らないみたい?
Else
  sBuff = ""
End If

と言う部分がありますが、要らないみたいです。(笑)
本来なら、「sBuff」には、「\0」を含んだ文字列が返るんですけど、どうも「\0」は、
含まないようです。
なので、文字列が返っても「sBuff = ""」が、実行されて結果が無くなるわけです。
実は、今日になって、この問題が発生しました。
今までどうして動いてたんだろ?(謎)

Else
  sBuff = ""
を、削除すれば、動くと思います。
コレで駄目なら判りません。(笑)


筑集眺餅 さん 2001年 06月 23日 01時 51分 39秒

>ところで、Win98で実行すると、wscript.exeが落ちるという非常に
To:むたぐちさん

>やばい結果になります。
>子プロセス(?)でexecuteを使っているからのような気がしますが、
>(executeは何かと挙動不審)このスクリプトで本当にexecuteは
>必要なんでしょうか?
>WSHは、スクリプトファイルを一度全部読み込んでからそのテキストデータを
>スクリプトエンジンに渡しますので、実行中にスクリプトファイルを削除しても
>何の問題もありません。

なはは。実行途中でスクリプトファイルを削除すると止まっちゃうような
気がして・・・。
使ったことのない execute なんて使ったのが仇でしたね。(^^;
私の環境(Win2000sp2)では動いているようなんですけどね。

ではまた。

以上

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 22日 22時 51分 59秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

あと、Yahoo! BBは泣けてくるね。
3年先どころか、1ヶ月先の状況すら読み損ねた。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 22日 22時 45分 04秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

あれ?
何か閑散としてる(^^;


To: ひろすけ さん

> Dim WSHShell,objSc
> Set WSHShell = WScript.CreateObject("WScript.Shell")
> For cntr=1 to 10 step 1
> Set objSc = WSHShell.CreateShortcut("C:\WINDOWS\筑集眺餅\_
> icon(" & cntr & ").lnk")
> objSc.TargetPath="C:\ikons\test.exe"
> objSc.Save
> Next
> WScript.Quit
>
> 上記のプログラムでショートカットの保存場所をごみ箱の中に作りたいのですが
> パスがわかりません。
> (C:\RECYCLED\icon(" & cntr & ").lnk)にもしてみましたが
> 作成されませんでした。どうすればごみ箱にアイコンが作れるのでしょうか?

ごみ箱は特殊なフォルダなので、WshShellやFileSystemObjectではアクセスできません。
Shell32を使うとうまくいくかもしれませんが、試したことがないのでわかりません。

と言うのもあれなので、試してみました。

Const ssfBITBUCKET = 10

Set WshShell = WScript.CreateObject("WScript.Shell")
Set Shell = WScript.CreateObject("Shell.Application")

Set oLink=WshShell.CreateShortcut("test.lnk")
oLink.TargetPath="C:\Windows\notepad.exe"
oLink.Save

Set oFolder=Shell.NameSpace (ssfBITBUCKET)
oFolder.MoveHere oLink.FullName

ところがこれ、何も起こりません。(Win2000)
MoveHereの代わりにCopyHereを使うと、ファイルが存在しないのに上書き
確認ダイアログが出て、しかも共有違反エラーが出て終了してしまいます。
他のフォルダだとうまくいくので、これはごみ箱特有の問題のようです。

MoveHereメソッドの第二引数をいろいろ変えてみたんですが、それでも
駄目でした。なぜだろう?


To: TAMWAN さん

> ただ、ひとつ心配なのが、管理人さんのコメントに「もうやけ気味に」と。
> 大変お手数、そしてご迷惑お掛けしました。

あ、誇張表現入ってますので、気になさらないでください…(^^;

> (1)PrinterFolderOpen.vbs
> (2)WindowClose.vbs(表示されたウィンドウを全て閉じる)
> (3)PrinterFolderOpen.vbs
>
> すると、(3)でスクリプトの終了と同時にプリンタダイアログが閉じてしまう
> 現象がまた発生します。

えっと、(1)のスクリプトなんですが、今実行してみるとなぜかうまくいきません(^^;
私の環境では3個のプリンタアイコンがあるのですが、一瞬3個表示された後、
2個のダイアログが閉じてしまいます。
前回はこんな現象はおこらなかったのに…なぜ?

というわけで、(1)→(2)→(3)の再現テストをすることもできません。
すいません。
どなたか、フォローしてください。

> Set WShell = CreateObject("Shell.Application")
> Set Win = WShell.Windows
>
> num = Win.Count -1
> For i = 0 To num
> Win.Item(0).Quit
> Next

↑Win.Item(i).Quitの間違い?

あと、For Each を使った方がいいかもしれません。


To: 筑集眺餅 さん

> 「引数にメッセージをもらって PopUpして、終わったら
> 自分のファイルを削除する」というスクリプトを一時ファイルに
> 書き込んで、その一時ファイルを直帰指定で Runさせる。
>
> という事が基本です。
> これのいいところは、引数に制限を受けないことと、複数の
> メッセージを同時に表示できるようになることです。

なるほど。
たしかに、Windowsではすぐに引数の制限にひっかかりますからねえ。
あと、自己呼び出しをしない分、暴走の危険性が少ないような気がします。

ところで、Win98で実行すると、wscript.exeが落ちるという非常に
やばい結果になります。
子プロセス(?)でexecuteを使っているからのような気がしますが、
(executeは何かと挙動不審)このスクリプトで本当にexecuteは
必要なんでしょうか?
WSHは、スクリプトファイルを一度全部読み込んでからそのテキストデータを
スクリプトエンジンに渡しますので、実行中にスクリプトファイルを削除しても
何の問題もありません。


To: いちにい さん

> > というか、本なんか書いてる暇ないです(^^;
> > ただし、原稿料によっては考えます。> 出版社殿 (笑)
>
> って、行けるんじゃないですか。(笑)

つまり、本業なんてどうでもいいと思えるようになる程度の額を
提示してくれた場合は考えますっていうことです(笑)

> 良いですよ。

おお、ありがとうございます。
これで謎が解けました。

> 家の環境(Win98)では、クリップボード内の文字数が、一定量を超えると駄目でした。
> 後、何故か、hText と、pText の戻り値が、4418448 固定なんですよね。
> コレってなんででしょう?ベテランの方、フォロー願います。(笑)

私からもお願いします。
Win98,2000ともに、文字数が一定量を超えるとwscript.exeが落ちますね。

> "Progman"と、"Program Manager"は、OSによって変わるかも知れないので。
> Spy++とかで、探ってみて下さい。

Spy++持ってないです(^^;
# Visual StudioじゃなくVB単体しかもってないので。
代替ツールありませんかね?

> 所で、VBSで、クラスが作れるんですね。知らなかった。(こりゃ便利。笑)

私は使いどころが今ひとつわからぬ…。
# wsc作るとき以外に使い道ってあるの?
# ん? wscは関係なかったか…?

> スクリプトを起動して、メモ帳を2つ起動すると、Msgが出ます。
> 但し、元もと2つ以上起動していた場合は、2つになるまで反応しません。

> コレも、家の環境だけで動いたりして。(笑)

っぽいです。
メッセージボックスが延々と出るだけです(^^;

いちにい さん 2001年 06月 21日 00時 40分 33秒

To: 管理人むたぐち さん

>> 解説本なんか出せる位じゃないですか?
> 実際はそんなに甘くないでしょう。
> というか、本なんか書いてる暇ないです(^^;
> ただし、原稿料によっては考えます。> 出版社殿 (笑)

って、行けるんじゃないですか。(笑)


>> 某サイトに、クリップボードからテキストを取得するサンプルがあったので、
>> 遣ってみたんですが、何故か26文字(半角で)以上の文字列が、クリップボード内に、
>> あると駄目なんです。

> あ、コード教えてもらえませんか?
> 私も以前(21-36)、試みたんですがやり方がわからなかったのです…。

良いですよ。
でも、動かないですが。(笑)
因みに、VBでは、クリップボードへの書き込みも、読み込みもできました。
出来ても意味無いけどね。(爆)

'---------------------------------------------
Private Const CF_TEXT = 1

' Create the wrapper object for dynamic DLL function calling
Set obj_OpenClipboard = CreateObject("DynamicWrapper")
Set obj_GetClipboardData = CreateObject("DynamicWrapper")
Set obj_CloseClipboard = CreateObject("DynamicWrapper")
Set obj_GlobalLock = CreateObject("DynamicWrapper")
Set obj_GlobalUnlock = CreateObject("DynamicWrapper")
Set obj_lstrlen = CreateObject("DynamicWrapper")
Set obj_lstrcpy = CreateObject("DynamicWrapper")

' GetProcAddress for WinAPIs
obj_OpenClipboard.Register "user32", "OpenClipboard", "i=l", "f=s", "r=l"
obj_GetClipboardData.Register "user32", "GetClipboardData", "i=l", "f=s", "r=l"
obj_CloseClipboard.Register "user32", "CloseClipboard", "f=s", "r=l"
obj_GlobalLock.Register "kernel32", "GlobalLock", "i=l", "f=s", "r=l"
obj_GlobalUnlock.Register "kernel32", "GlobalUnlock", "i=l", "f=s", "r=l"
obj_lstrlen.Register "kernel32", "lstrlen", "i=l", "f=s", "r=l"
obj_lstrcpy.Register "kernel32", "lstrcpy", "i=rl", "f=s", "r=l"


hRet = obj_OpenClipboard.OpenClipboard(0)

hText = obj_GetClipboardData.GetClipboardData(CF_TEXT)

If hText = 0 Then
MsgBox "クリップボードにテキストデータはない。"
Else
pText = obj_GlobalLock.GlobalLock(hText)
sRet = FncPtrToStr(pText)
MsgBox sRet
Call obj_GlobalUnlock.GlobalUnlock(hText)
End If

hRet = obj_CloseClipboard.CloseClipboard


Set obj_OpenClipboard = Nothing
Set obj_GetClipboardData = Nothing
Set obj_CloseClipboard = Nothing
Set obj_GlobalLock = Nothing
Set obj_GlobalUnlock = Nothing
Set obj_lstrlen = Nothing
Set obj_lstrcpy = Nothing

'-----------------------------------------------
Private Function FncPtrToStr(lpstr)


lBuffLen = obj_lstrlen.lstrlen(lpstr) * 2 ' < この方法は、適切ではない。

sBuff = String(lBuffLen, Chr(0))

lRet = obj_lstrcpy.lstrcpy(sBuff, lpstr)

FncPtrToStr = sBuff

End Function

'-----------------------------------------------
家の環境(Win98)では、クリップボード内の文字数が、一定量を超えると駄目でした。
後、何故か、hText と、pText の戻り値が、4418448 固定なんですよね。
コレってなんででしょう?ベテランの方、フォロー願います。(笑)
尚、このままでは、VBで動きません。


>> VBでコンポーネント作った方が良いな、こりゃ。楽だし。
> それをいっちゃあおしめえよ。
> VB等の商用アプリを使わず、どこまでやれるかの限界に挑戦しましょう。

根性無しなんで駄目です。(笑)
イージー指向だし。


>> ウインドウ名を表示から、チョット改造しました。
>> 起動してから、メモ帳を新規に3つ起動すると、Msgが出ます。
>> Win98しか確認してません。(笑)
> Win98では何も起こりませんでした。何故?

そうですか。(笑)
えー。原因は・・・・判りません。(笑)
なんせ理屈抜きの、コピペPGなんで。(爆)
wscript.exeのバージョンやら、OSの種別・バージョンなんかで、駄目なんですかね?

hPrgmWnd = obj_FindWindow.FindWindow("Progman", "Program Manager")
辺りで、コケてるかも知れません。
"Progman"と、"Program Manager"は、OSによって変わるかも知れないので。
Spy++とかで、探ってみて下さい。

で、今度は、FDフォーマットダイアログでも行けるやつを作ってみました。
スクリプト停止用のMsgboxも付けてみました。
もしかすると、コレなら動くかも知れません。(笑)
コレ又、動いても意味無いですが・・・・(死)


> Win2000でやるとwscript.exeが落ちました(^^;

家の場合は、OSごと逝ったりしてます。>クリップボード関係。


>> 所で、VBSで、
>> ReDim Preserve hogeArr(i)
>> とか、出来ないですか?
>> いまいち、VBSでの配列の使い方が良く判んない。
> できますよん。

例まで載せてもらってすいません。
実は、変数の宣言をしてなかったという、なんとも初歩的なミスでした。(汗)
所で、VBSで、クラスが作れるんですね。知らなかった。(こりゃ便利。笑)


スクリプトを起動して、メモ帳を2つ起動すると、Msgが出ます。
但し、元もと2つ以上起動していた場合は、2つになるまで反応しません。

'----------- SetWindowPos -----------
'Public Const HWND_TOP = 0
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
'Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
'Public Const SWP_NOACTIVATE = &H10

'----------- SendMessage ------------
Private Const WM_SYSCOMMAND = &H112
Private Const SC_CLOSE = 61536

'------------- Win API --------------
' Create the wrapper object for dynamic DLL function calling
Set obj_PostMessage = CreateObject("DynamicWrapper")
Set obj_FindWindowEx = CreateObject("DynamicWrapper")
Set obj_Sleep = CreateObject("DynamicWrapper")
Set obj_SetWindowPos = CreateObject("DynamicWrapper")

' GetProcAddress for WinAPIs
obj_PostMessage.Register "user32", "PostMessage", "i=llll", "f=s", "r=l"
obj_FindWindowEx.Register "user32", "FindWindowEx", "i=llss", "f=s", "r=l"
obj_Sleep.Register "kernel32", "Sleep", "i=l", "f=s"
obj_SetWindowPos.Register "user32", "SetWindowPos", "i=lllllll", "f=s"

'--------------- User ---------------
'Private Const TGET_CLSNAM = "#32770" 'FD用
'Private Const TGET_CAPTIN = "フォーマット - 3.5 インチ FD (C:)" '環境によって異なります。
Private Const TGET_CLSNAM = "Notepad" '検索対象のクラス名
Private Const TGET_CAPTIN = "無題 - メモ帳" '検索対象のタイトル
Private Const CHKWND_CNT = 2 '対象の検索数
Private Const SCRIPTNAME = "複数の同名ウインドウ検索" 'スクリプト名
Private Const VBSMSGBOX_CLSNAM = "#32770"
Private Const VBSMSGBOX_CPTIN = "VBScript: "
Private Const EXITUI_FILENAME = "_$Temp$._.vbs" 'スクリプト停止用UI(MsgBox)ファイル名

Set WshShell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

CR = vbCrLf
CR2 = CR & CR
Dim hRetArr()

'スクリプト停止用UI(MsgBox)の起動
If FncShowExitUI(EXITUI_FILENAME, SCRIPTNAME) = False Then
Call WSHSHell.Popup("スクリプト停止用UIの起動に失敗しました!!" & CR & _
"処理を終了します。", 3, SCRIPTNAME, vbCritical)
WScript.Quit 'Goto ExitTag
End If

'対象の監視
Do
Call obj_Sleep.Sleep(50) 'Wscript.Sleep の代用。

'スクリプト停止用UIの存在チェック
hRet = FncGetExitUIHnd(VBSMSGBOX_CLSNAM, VBSMSGBOX_CPTIN, SCRIPTNAME)
If 0 = hRet Then Exit Do

lWndCnt = FncGetSpeficWndHnds(TGET_CLSNAM, TGET_CAPTIN, hRetArr)

If CHKWND_CNT = lWndCnt Then
MsgBox "『 " & TGET_CAPTIN & " 』" & " が、" & lWndCnt & " つ起動しました!!" & CR & _
"『 " & TGET_CAPTIN & " 』 を終了します。",,SCRIPTNAME

For i = 0 To lWndCnt - 1 'hWndを利用する。
'対象を終了させる。
Call obj_PostMessage.PostMessage(hRetArr(i), WM_SYSCOMMAND, SC_CLOSE, 0)
Next
'スクリプト停止用UIを終了させる。
hRet = FncGetExitUIHnd(VBSMSGBOX_CLSNAM, VBSMSGBOX_CPTIN, SCRIPTNAME)
Call obj_PostMessage.PostMessage(hRet, WM_SYSCOMMAND, SC_CLOSE, 0)
Exit Do

End If

Loop

'ExitTag: Goto は駄目?
Call WSHSHell.Popup("スクリプトを終了します。", 3, SCRIPTNAME)

Set WshShell = Nothing
Set FSO = Nothing
Set obj_PostMessage = Nothing
Set obj_FindWindowEx = Nothing
Set obj_Sleep = Nothing
Set obj_SetWindowPos = Nothing

'------------ User Function/Sub -------------
Private Function FncGetSpeficWndHnds(ByVal sClsName, ByVal sCaption, ByRef hRetArr)'Ret WndCnt

'特定ウインドウのhWnd検索

lHitCnt = 0

hNext = obj_FindWindowEx.FindWindowEx(0, 0, CStr(sClsName), CStr(sCaption))

Do while hNext
ReDim Preserve hRetArr(lHitCnt)
hRetArr(lHitCnt) = hNext
lHitCnt = lHitCnt + 1
hNext = obj_FindWindowEx.FindWindowEx(0, hNext, CStr(sClsName), CStr(sCaption))
Loop

FncGetSpeficWndHnds = lHitCnt


End Function
'--------------------------------------------
Private Function FncShowExitUI(ByVal sExitUI_FileName, ByVal sScriptName)' Ret Boolean

'スクリプト停止用UI(MsgBox)の作成・表示

Set obj_Msg = FSO.CreateTextFile(sExitUI_FileName, True)

sOut = "MsgBox ""スクリプトを終了する場合は、[ O K ] ボタンを、"" & vbCrLf & _" & CR
sOut = sOut & """クリックして下さい。"",,""「 " & sScriptName & " 」の終了"""

With obj_Msg
.Write sOut
.Close
End With


'停止用スクリプトの起動確認(タイムアウト 5 Sec)
Do
On Error Resume Next
Call WshShell.Run(sExitUI_FileName)
On Error Goto 0

Call obj_Sleep.Sleep(1000) 'Wscript.Sleep の代用。

hRet = FncGetExitUIHnd(VBSMSGBOX_CLSNAM, VBSMSGBOX_CPTIN, SCRIPTNAME)
If 0 <> hRet Then Exit Do

lTimOut = lTimOut + 1
If 5 = lTimOut Then Exit Do
Loop

'停止用スクリプトファイルの削除
If FSO.FileExists(sExitUI_FileName) Then
Call FSO.DeleteFile(sExitUI_FileName)
End If

If 0 <> hRet Then
'停止用UI(MsgBox)を画面左上に移動して、最前列にセット。
Call obj_SetWindowPos.SetWindowPos(hRet, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE)
FncShowExitUI = True
Else
FncShowExitUI = False
End If

Set obj_Msg = Nothing


End Function

'--------------------------------------------
Private Function FncGetExitUIHnd(ByVal sMsgBoxClsName, ByVal sVBSMsgBoxCptn, ByVal sScriptName) 'Ret Handle

'停止用UI(MsgBox)のhWnd検索

hRet = 0

sMsgBoxCptn = sVBSMsgBoxCptn & "「 " & sScriptName & " 」の終了"

hRet = obj_FindWindowEx.FindWindowEx(0, 0, CStr(sMsgBoxClsName), CStr(sMsgBoxCptn))

FncGetExitUIHnd = hRet

End Function


コレも、家の環境だけで動いたりして。(笑)

筑集眺餅 さん 2001年 06月 20日 13時 18分 23秒

To:むたぐちさん

>キャンセルと終了ができるわけですね。
># すいません、具体的なからくりまではまだ拝見してません(^^;
>
>ただ、筑集眺餅さんのスクリプトも私のスクリプトも、なぜかWin98では
>うまく動作しません。Win2000専用かもしれませんね。
># もしかするとスペックの違いが効いているのかもしれないが。

Win98の環境がないのでなんとも・・・。
スクリプトが汚くてすみません。
やりたかった事は、

「引数にメッセージをもらって PopUpして、終わったら
自分のファイルを削除する」というスクリプトを一時ファイルに
書き込んで、その一時ファイルを直帰指定で Runさせる。

という事が基本です。
これのいいところは、引数に制限を受けないことと、複数の
メッセージを同時に表示できるようになることです。

ではまた。

TAMWAN さん 2001年 06月 20日 12時 03分 48秒

To:管理人むたぐち さん

並々ならぬご教示ありがとうございます。
Win2000で試したところ、動作OKです。
ただ、ひとつ心配なのが、管理人さんのコメントに「もうやけ気味に」と。
大変お手数、そしてご迷惑お掛けしました。

これまで、このサイトでいう「VBスクリプト講座・基礎編」というレベルで
しかWSHを利用したことがなかった私ですが、今後、これを機に幅を広げて
いきたいと思います。管理人さんのご好意に報いるためにも。

さてさて。。。恐縮ですがまた質問いいですか?
実は、管理人さんから提供していただいたスクリプト(PrinterFolderOpen.vbs)
を以下の順で実行しました。
(1)PrinterFolderOpen.vbs
(2)WindowClose.vbs(表示されたウィンドウを全て閉じる)
(3)PrinterFolderOpen.vbs

すると、(3)でスクリプトの終了と同時にプリンタダイアログが閉じてしまう
現象がまた発生します。

原因?は、WindowClose.vbs のようです。これを実行しなければPrinterFolderOpen.vbsは正常に動作し続けます。
以下に(2)のWindowClose.vbsサンプルを記します。サンプル内容ほかについて
アドバイスしていただければ幸いです。

Set WShell = CreateObject("Shell.Application")
Set Win = WShell.Windows

num = Win.Count -1
For i = 0 To num
Win.Item(0).Quit
Next


※(1)〜(3)の繰り返し実行の仮対処として、PrinterFolderOpen.vbs の
 Sub IE_DocumentCompleteのNext後で、エラーを発生させ停止させています。
 これにより(1)〜(3)は繰り返し処理が可能となっています。


ひろすけ さん 2001年 06月 20日 09時 55分 48秒

ひろすけです

すみません。
すごく馬鹿馬鹿しい質問をしたいのですが。。。
宜しくお願いします。

Dim WSHShell,objSc
Set WSHShell = WScript.CreateObject("WScript.Shell")
For cntr=1 to 10 step 1
Set objSc = WSHShell.CreateShortcut("C:\WINDOWS\筑集眺餅\_
icon(" & cntr & ").lnk")
objSc.TargetPath="C:\ikons\test.exe"
objSc.Save
Next
WScript.Quit

上記のプログラムでショートカットの保存場所をごみ箱の中に作りたいのですが
パスがわかりません。
(C:\RECYCLED\icon(" & cntr & ").lnk)にもしてみましたが
作成されませんでした。どうすればごみ箱にアイコンが作れるのでしょうか?

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 20日 03時 21分 06秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: aki-aki さん

> たとえば、1レコード目の項目2『KKKXKKXX』を得るには・・。
> Split(MyString, ",", -1, 1)で良さそうですね・・。
> 試しにやってみればわかるのだけれども。>自分。

やってみてくださいな(^^;
たぶん問題ないと思いますよ。

>  こんなのを発表しています。(・・と言うには恥ずかしいものですが。)
> 改行挿入マクロ For 秀丸 1.0
> INSNL.LZH 00/05/05 1491
> 概要:固定長ファイルに任意のバイト数で改行を挿入します

なるほど、マクロですか。
スクリプトの公開と通ずるものがありますね(^^;

>  もう一つもですが。(でも、これは内容が古い!)
> 小田急電鉄土休日 98/06
> OER9808H.LZH 99/03/14 68145
> 概要:小田急電鉄土休日のWinDIA時刻表ファイル集

これは何か濃そうなデータですね。
# WinDIAの公式サイトらしきところを見つけたんですが、@niftyな人じゃないと
# データを落とせない…。


To: ゴン さん

> AppActivateを使用して下記のように使用してみましたが
> やはりむりでした.....
> ------------
> Set objWS=WScript.CreateObject("WScript.Shell")
> Do While ret=False
> ret=objWS.AppActivate("フォーマット結果 - 3.5 インチ FD (A:)")
> wscript.sleep 100
> Loop

非常に無理やりな方法で実現してみました。
(Win2000用)

「フォーマット中 A:\」となっている親ダイアログにEscを送っても何も起こらないのに対し、
「フォーマット中 A:\」となっている完了メッセージが表示される子ダイアログに
Escを送ると閉じることを利用したものです。
ただし、Escを送出するたびにbeepが鳴るので多少うるさいのが難点ですが…。

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run "RUNDLL32.EXE Shell32.dll,SHFormatDrive"

sendkeys "フォーマット A:\","%S"
sendkeys "フォーマット A:\","{Enter}"
sendkeys "フォーマット中 A:\",""

Do While WshShell.AppActivate ("フォーマット中 A:\")
WshShell.SendKeys "{Esc}"
WScript.Sleep 500
Loop

sendkeys "フォーマット A:\","%C"

Sub sendkeys(title,key)
For I=1 To 10
WScript.Sleep 500
If WshShell.AppActivate(title) Then
WshShell.SendKeys key
Exit For
ElseIf I=10 Then
MsgBox "アクティブ化失敗"
WScript.Quit
End If
Next
End Sub


To: TAMWAN さん

> さて前回ご教示いただいた以下WshShell.Runについて兼ねてよりトライ
> しているのですが「書き込みできません。」でエラーとなってしまいます。
> 他のショートカット(リンク先がhttp://・・・)は実行できるのですが。
> プリンタウィンドウをOPENする場合、何か特殊な指定があるのでしょうか?
> よろしくお願いします。
>
> WshShell.Run "printer.lnk"

この現象はWin2000、Win98ともに再現しますね。
要するに、仮想アイテムのショートカットはWshShell.Runで実行できないようです。

ならばとばかりにこれ↓を試したんですが、
Set Shell = WScript.CreateObject("Shell.Application")
Shell.ShellExecute "printer.lnk"
これはInvokeVerbする場合と同じ結果になってしまいます。(スクリプトの終了と同時に
ダイアログが閉じてしまう)

もうやけ気味に、こんなのもためしてみましたが…。
WshShell.Run """::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{2227A280-3AEA-1069-A2DE-08002B30309D}\printer"""
だめだ。仮想アイテムは「関連付けされているファイル」とはみなされないので、実行できない。
# 一応、"printer"の手前で止めると、プリンタフォルダが開きます。
# マイコンピュータ\コントロールパネル\プリンタ というわけです。
# 実は、"shell:PrintersFolder"と等価なのですが、ここではどうでもいいことですね(^^;

もはや訳がわかりませんが、下のコードでうまくいきます。
なんでこれがうまくいくのか、私にもわかりませんが、これでいかがですか。
(もちろんWin2000以外での動作はまったく考えてません)

Set Ie = WScript.CreateObject("InternetExplorer.Application","IE_")
Ie.Navigate "shell:PrintersFolder"

Do
WScript.Sleep 100
Loop

Sub IE_DocumentComplete(ByVal pDisp, URL)
For I=1 To Ie.Document.Folder.Items.Count-1
Ie.Document.Folder.Items.Item(I).InvokeVerb
Next
Ie.Quit
End Sub

Sub IE_OnQuit()
WScript.Quit
End Sub


To: いちにい さん

> 解説本なんか出せる位じゃないですか?
> 一発書いてみるとか。

実際はそんなに甘くないでしょう。
というか、本なんか書いてる暇ないです(^^;

ただし、原稿料によっては考えます。> 出版社殿 (笑)

> 某サイトに、クリップボードからテキストを取得するサンプルがあったので、
> 遣ってみたんですが、何故か26文字(半角で)以上の文字列が、クリップボード内に、
> あると駄目なんです。

あ、コード教えてもらえませんか?
私も以前(21-36)、試みたんですがやり方がわからなかったのです…。

> VBでコンポーネント作った方が良いな、こりゃ。楽だし。

それをいっちゃあおしめえよ。
VB等の商用アプリを使わず、どこまでやれるかの限界に挑戦しましょう。

> 家のバージョンだと、「WScript.Sleep」を入れたら、怒られました。

WSH2.0以上で使用可能です。
wscript.exeのバージョンが5.5以上のものですね

> > とりあえずこっそりコードを見せてもらえませんか?
> > # APIのことはわからないので、力になれるかどうかはわかりませんが。
>
> 良いですよ。

ありがとうございます。

> ウインドウ名を表示から、チョット改造しました。
> 起動してから、メモ帳を新規に3つ起動すると、Msgが出ます。
> Win98しか確認してません。(笑)

Win98では何も起こりませんでした。何故?
Win2000でやるとwscript.exeが落ちました(^^;

> 所で、VBSで、
> ReDim Preserve hogeArr(i)
> とか、出来ないですか?
> いまいち、VBSでの配列の使い方が良く判んない。

できますよん。
Dim hogeArr()
ReDim hogeArr(3)
hogeArr(0)=0
hogeArr(1)=1
hogeArr(2)=2
hogeArr(3)=3
ReDim Preserve hogeArr(5)
hogeArr(4)=4
hogeArr(5)=5

For I=LBound(hogeArr) To UBound(hogeArr)
s=s & hogeArr(I) & vbCrLf
Next

MsgBox s

VBとの違いは、
・型宣言ができない
・インデックスの最小値は常に0(LBound関数は常に0を返す)
だけです。


To: 筑集眺餅 さん

> 一時ファイルに自爆させる(何のこっちゃ?)変形例を考えてみたので載せて
> みます。日曜プログラマには楽しいパズルですね。

いいですねえ。
キャンセルと終了ができるわけですね。
# すいません、具体的なからくりまではまだ拝見してません(^^;

ただ、筑集眺餅さんのスクリプトも私のスクリプトも、なぜかWin98では
うまく動作しません。Win2000専用かもしれませんね。
# もしかするとスペックの違いが効いているのかもしれないが。


というわけで、前回と今回の返信は、図らずも、パズル色が濃いものとなりました。
ひっじょーに頭を使った気がします(^^;

筑集眺餅 さん 2001年 06月 19日 00時 44分 22秒

To:むたぐちさん

>なるほど、別プロセスで動かせばいいわけですね。
>というわけで、少し応用して「キャンセル可能なスクリプト」を
>作ってみました。なお、1ファイルで済ませるためにwsfファイルを
>使っています。(本来の使い方とは違いますけど(^^;)
>意外と使えるテクかもしれません。

wsfが便利なことがよく判りました。
ためになります。 ^^)

一時ファイルに自爆させる(何のこっちゃ?)変形例を考えてみたので載せて
みます。日曜プログラマには楽しいパズルですね。

Set oFS = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")
sFile = SpawnMessage("OKで中止するです。", 10)
For intI = 1 To 1000
' 本命的処理は、この辺り。
WScript.Sleep 10
If oFS.FileExists(sFile & ".ok.tmp") Then
oFS.DeleteFile(sFile & ".ok.tmp")
Exit For
End If
Next
oShell.AppActivate sFile
oShell.SendKeys "{ESC}"
MsgBox intI & "だけ処理したぞい。"
WScript.Quit

Function SpawnMessage(sMes, iTime)
Dim sFile, stmMes
sFile = oFS.GetTempName & ".vbs"
Set stmMes = oFS.CreateTextFile(sFile, True)
stmMes.Write("Set oFS = CreateObject(""Scripting.FileSystemObject"")" & _
vbCRLF & "Set oShell = CreateObject(""WScript.Shell"")" & vbCRLF & _
"iButton = oShell.PopUp(" & """" & sMes & """, " & iTime & "," & _
" """ & sFile & """, vbInformation + vbOKCancel)" & vbCRLF & _
"If iButton = vbOK Then oFS.CreateTextFile(""" & sFile & _
".ok.tmp"")" & vbCRLF & _
"s = ""oFS.DeleteFile(""""" & sFile & """""): WScript.Quit""" & _
vbCRLF & "execute s" & vbCRLF)
stmMes.Close
oShell.Run sFile, , False ' 直帰指定
SpawnMessage = sFile
End Function

いちにい さん 2001年 06月 19日 00時 12分 19秒

To: 管理人むたぐち さん

> 日曜日は静かだ(笑)
> やっぱりみなさんco.jpな方なんでしょうかねえ?

そんな感じですね。
やっぱり、仕事上の定型処理なんかを、WSHで処理するってのが、
多いんですかね?


>> 逆に、むたぐちさんのWSHの知識は、凄いなぁと思いますよ。マジで。
>> WSH関連を検索したら、結局ココへ戻っちゃうんですよね。(笑)
> あきもせず結構長いことやってますからね。

解説本なんか出せる位じゃないですか?
一発書いてみるとか。


>> 所がコレ、ちょっと変かも。>DynaCall。
> やっぱりWSHからじかにAPIをコールするには無理があるようで、
> いろいろとおかしいところもあるみたいですね。

他にも出てきました。(使い方が悪いんだろって? 笑)
某サイトに、クリップボードからテキストを取得するサンプルがあったので、
遣ってみたんですが、何故か26文字(半角で)以上の文字列が、クリップボード内に、
あると駄目なんです。
VBでコンポーネント作った方が良いな、こりゃ。楽だし。


> ですね。
> ループ中、WScript.Sleepを入れてやると、CPU使用率が100%になる弊害を回避できます。

家のバージョンだと、「WScript.Sleep」を入れたら、怒られました。


>> IEだけじゃなくて、FDフォーマットのダイアログも駄目みたいです。
> 何ででしょうね。
> とりあえずこっそりコードを見せてもらえませんか?
> # APIのことはわからないので、力になれるかどうかはわかりませんが。

良いですよ。
あんまり使い道は、無いですけど。
アイデア次第?(笑)

ウインドウ名を表示から、チョット改造しました。
起動してから、メモ帳を新規に3つ起動すると、Msgが出ます。
Win98しか確認してません。(笑)
'------------------------------------------
'Private Const GW_HWNDFIRST = 0
'Private Const GW_HWNDLAST As Long = 1
'Private Const GW_HWNDNEXT = 2
Private Const GW_HWNDPREV = 3
Private Const GW_OWNER = 4
'Private Const GW_CHILD As Long = 5
Private Const TGET_APPCAPTION = "無題 - メモ帳"

' Create the wrapper object for dynamic DLL function calling
Set obj_FindWindow = CreateObject("DynamicWrapper")
Set obj_GetWindow = CreateObject("DynamicWrapper")
Set obj_IsWindowVisible = CreateObject("DynamicWrapper")
Set obj_GetWindowText = CreateObject("DynamicWrapper")
'Set obj_GetClassName = CreateObject("DynamicWrapper")
Set obj_Sleep = CreateObject("DynamicWrapper")

' GetProcAddress for WinAPIs
obj_FindWindow.Register "user32", "FindWindow", "i=ss", "f=s", "r=l"
obj_GetWindow.Register "user32", "GetWindow", "i=ll", "f=s", "r=l"
obj_IsWindowVisible.Register "user32", "IsWindowVisible", "i=l", "f=s", "r=l"
obj_GetWindowText.Register "user32", "GetWindowText", "i=lrl", "f=s", "r=l"
'obj_GetClassName.Register "user32", "GetClassName", "i=lrl", "f=s", "r=l"
obj_Sleep.Register "kernel32", "Sleep", "i=l", "f=s"

'Set WSHShell = Wscript.CreateObject("Wscript.Shell")

CR = vbCrLf
CR2 = CR & CR

Do
lHitCnt = 0
sWndCptn = ""
Call obj_Sleep.Sleep(500) 'Sleepの代用。
lWndCnt = FncGetTopWindows(sWndCptn)

If 0 < lWndCnt Then
sWndCptnArr = Split(sWndCptn, CR, -1, 1) '第3・4引数の意味は、何?(笑)

For i = LBound(sWndCptnArr) To UBound(sWndCptnArr)
If sWndCptnArr(i) = TGET_APPCAPTION Then lHitCnt = lHitCnt + 1
Next

If 3 =< lHitCnt Then
sWndCptn = sWndCptn & CR2 & "検索ウインドウ数 = " & lWndCnt
MsgBox sWndCptn
Exit Do
End If

End If

Loop

Set obj_FindWindow = Nothing
Set obj_GetWindow = Nothing
Set obj_IsWindowVisible = Nothing
Set obj_GetWindowText = Nothing
'Set obj_GetClassName = Nothing
Set obj_Sleep = Nothing

'------------ User Function/Sub -------------
Private Function FncGetTopWindows(ByRef sWndCptn)

'ウインドウ列挙

'OSによって、文字が変わるかも知れません。↓
hPrgmWnd = obj_FindWindow.FindWindow("Progman", "Program Manager")
'hSeek = obj_GetWindow.GetWindow(Me.hwnd , GW_HWNDFIRST) '< 本来は、コレ。(VBとか)

hSeek = hPrgmWnd

Do Until hSeek = 0
'注:子ウインドウも検索する場合は、2段目の「obj_GetWindow.〜」を削除。
If hSeek <> hPrgmWnd And _
obj_GetWindow.GetWindow(hSeek, GW_OWNER) = 0 And _
obj_IsWindowVisible.IsWindowVisible(hSeek) = 1 Then

sTemp = FncGetWndCaption(hSeek)
If Trim(sTemp) <> "" Then
sWndCptn = sWndCptn & sTemp & CR
lCnt = lCnt + 1
End If

End If
hSeek = obj_GetWindow.GetWindow(hSeek, GW_HWNDPREV)'GW_HWNDNEXT)

Loop

FncGetTopWindows = lCnt

End Function
'--------------------------------------------
Private Function FncGetWndCaption(hTaget)

'ウインドウキャプション取得

sBuff = String(255, Chr(0))

lRet = obj_GetWindowText.GetWindowText(hTaget, sBuff, Len(sBuff))

lNullPos = InStr(sBuff, Chr(0))
If 1 < lNullPos Then
sBuff = Left(sBuff, lNullPos-1) '要らないみたい?
Else
sBuff = ""
End If

FncGetWndCaption = sBuff

End Function

'--------------------------------------------
よくあるやつです。(笑)
前にも書いたように、IEのタイトルは取得できません。
所で、VBSで、
ReDim Preserve hogeArr(i)
とか、出来ないですか?
いまいち、VBSでの配列の使い方が良く判んない。



To: aki-aki さん

> こんなのを発表しています。(・・と言うには恥ずかしいものですが。)
> 改行挿入マクロ For 秀丸 1.0
> INSNL.LZH 00/05/05 1491
> 概要:固定長ファイルに任意のバイト数で改行を挿入します

おっ。 秀丸マクロを公開してるんですか。
秀丸のサイトに有りましたっけ?
秀丸の場合は、バージョンが違っても、マクロが使えるんですか?
DLして、参考にさせていただきます。
(と言っても、まだ、何にも作ってないけど。(笑))


> もう一つもですが。(でも、これは内容が古い!)
> 小田急電鉄土休日 98/06
> OER9808H.LZH 99/03/14 68145
> 概要:小田急電鉄土休日のWinDIA時刻表ファイル集

ははっ。確かに、鮮度が命の物ですね。(笑)
小田急って、首都圏?


To: ゴン さん

> WSHで行うのはあきらめます....

すいません、力不足で。
って、元もと、コンポーネント無しで考えてたんですよね?



ひろすけ さん 2001年 06月 18日 11時 56分 07秒

to むたぐちさん

アドバイスありがとうございます。
早速確認してみたいと思います。

>microsoft.xmlhttpを使う方法:
>15-31 管理人むたぐち 2000/06/02 23:28
>28-14 Lib30 さん 2001/01/13 17:20
>BASP21・winsockなどのコンポーネントを使う方法:
>32-48 管理人むたぐち 2001/03/24 19:03
>があります。

>Iriaをお持ちならIriaAPIを呼び出すという手もあります。(サンプルが付属して>ます)

TAMWAN さん 2001年 06月 18日 09時 59分 15秒

To:管理人むたぐち さん

おはようございます。
今週もよろしくお願いします。(笑)

さて前回ご教示いただいた以下WshShell.Runについて兼ねてよりトライ
しているのですが「書き込みできません。」でエラーとなってしまいます。
他のショートカット(リンク先がhttp://・・・)は実行できるのですが。
プリンタウィンドウをOPENする場合、何か特殊な指定があるのでしょうか?
よろしくお願いします。

WshShell.Run "printer.lnk"

> ちょっと言葉足らずでしたが、これらのショートカットはあらかじめ
> 手動で作っておくという方法です。
> で、WshShell.Run "printer.lnk"のようにしてやります。
> やっぱりあまりかっこいい方法とは言えませんが…。
 とんでもないです。
 いろいろアドバイスいただき、とても感謝しております。
 引き続き、見捨てることなくご指導よろしくお願いします。  


ゴン さん 2001年 06月 18日 08時 58分 56秒

to 管理人むたぐち さん
to いちにい さん

いろいろとありがとうございました。
AppActivateを使用して下記のように使用してみましたが
やはりむりでした.....
------------
Set objWS=WScript.CreateObject("WScript.Shell")
Do While ret=False
ret=objWS.AppActivate("フォーマット結果 - 3.5 インチ FD (A:)")
wscript.sleep 100
Loop
--------

WSHで行うのはあきらめます....



aki-aki さん 2001年 06月 17日 23時 57分 02秒

aki-akiです。まとめてレスですが。

to:むたぐちさん
> >  本当は、区切り文字は、(本当は)エクセルでマスターとして更新できる
> > csvファイルの『,』がいいのだけれども、これは使えそうもないので、
>
> 使えると思いますけど?
> 項目自体に『,』という文字が存在するってことでしょうか。

ええと、こんな場合は如何ですか?

 abc,XKKKX,KKKXKKXX
abd,XXXKKX,XXXXXKKKK
 (1) (2) (3)

  (1) KEY
 (2) 項目1
 (3) 項目2

たとえば、1レコード目の項目2『KKKXKKXX』を得るには・・。
Split(MyString, ",", -1, 1)で良さそうですね・・。
試しにやってみればわかるのだけれども。>自分。

> スクリプトはフリーソフトになるのかな?
 どうなんでしょ。私はベクターの短いのを発表してますが、順調にダウンロ
ード数を伸ばしていまして、(勝手に)そう思うことにしていますけれども。

to:いちにいさん
> 今は、何か発表してるんですか?>フリーウェア。
 こんなのを発表しています。(・・と言うには恥ずかしいものですが。)
改行挿入マクロ For 秀丸 1.0
INSNL.LZH 00/05/05 1491
概要:固定長ファイルに任意のバイト数で改行を挿入します

 もう一つもですが。(でも、これは内容が古い!)
小田急電鉄土休日 98/06
OER9808H.LZH 99/03/14 68145
概要:小田急電鉄土休日のWinDIA時刻表ファイル集

to:松島さん
> > 皆さんはどのようなエディターを使っていますか?
>
> Windowsでは秀丸(Ver.3)で、Unix系ではvi系です。

 あ、全く私と同じですね!

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 17日 22時 34分 03秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

VBS版を作りました。
わざわざwsfファイルを使う必要はありませんでしたね。

Set WshShell = WScript.CreateObject("WScript.Shell")
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")

If WScript.Arguments.Count > 0 Then
If WScript.Arguments.Count=2 Then
If WScript.Arguments(1)="msg" Then
MsgBox WScript.Arguments(0),vbOKOnly+vbSystemModal,"Message"
Fs.CreateTextFile "#tmp.txt"
End If
End If
WScript.Quit
End If

WshShell.Run WScript.Fullname & " " & WScript.ScriptFullName & " " & "実行中です。" & vbCrLf & "OKをクリックすると中止します。" & " msg"

For I=0 To 1000000
a=a+1
If I mod 10000=0 Then
iTurn=I \ 10000
WScript.Sleep 1
If Fs.FileExists("#tmp.txt") Then

Exit For
End If
End If
Next

WshShell.AppActivate("Message")
WshShell.SendKeys "{ENTER}"

Fs.DeleteFile "#tmp.txt"
MsgBox iTurn & "の処理を完了"

このスクリプトは自己呼び出し型なので、
暴走の危険性があります。
というか、作成中にミスって一度暴走しました。
Enterを送出するので、エラーダイアログも勝手に
閉じてしまい、非常に悪質です。

For each Process in GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_Process where Name='wscript.exe'")
Process.Terminate
Next

のような緊急停止スクリプトも効きません(^^;
注意してください。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 17日 22時 01分 18秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: 筑集眺餅 さん

> 筑集家 第95代当主 眺餅でございます。(嘘)

これはこれは、ようこそおいでくださいました。

> ところで、execWB の方もやってみたのですが、私の環境(WinNT4.0&IE5.5)だと、
> 「完全」保存の選択肢がなくなってますね。なんででしょ?

私のところでも再現します。
33-50 管理人むたぐち 2001/04/06 01:58

なんか、昔のIEの保存ダイアログが呼び出されているっぽいですね。

> ところで、IEの自動運転を考えている時に気がついたのですけど、WSHShell.PopUpで
> メッセージを出すスクリプトを別で作っておいて、WSHShell.Runで直帰指定で走らせ
> ると処理が止まらなくていいですね。表示文を引数にして渡すとかもできるし。

なるほど、別プロセスで動かせばいいわけですね。
というわけで、少し応用して「キャンセル可能なスクリプト」を
作ってみました。なお、1ファイルで済ませるためにwsfファイルを
使っています。(本来の使い方とは違いますけど(^^;)
意外と使えるテクかもしれません。
# 次回からこの質問が来たら、この記事を参照してもらおう(^^;

<package>

<job id="main">
<object id="WshShell" progid="WScript.Shell" />
<object id="Fs" progid="Scripting.FileSystemObject" />
<script language="vbscript">

WshShell.Run WScript.Fullname & " //job:msg " & WScript.ScriptFullName & " " & "実行中です。" & vbCrLf & "OKをクリックすると中止します。"

For I=0 To 1000000
a=a+1
If I mod 10000=0 Then
iTurn=I \ 10000
WScript.Sleep 1
If Fs.FileExists("#tmp.txt") Then
Exit For
End If
End If
Next

WshShell.AppActivate("Message")
WshShell.SendKeys "{ENTER}"
Fs.DeleteFile "#tmp.txt"
MsgBox iTurn & "の処理を完了"

</script>
</job>
<job id="msg">
<object id="Fs" progid="Scripting.FileSystemObject" />
<script language="vbscript">

MsgBox WScript.Arguments(0),vbOKOnly+vbSystemModal,"Message"
Fs.CreateTextFile "#tmp.txt"

</script>
</job>
</package>

筑集眺餅 さん 2001年 06月 17日 20時 29分 43秒

To:むたぐちさん

お世話になっております。
筑集家 第95代当主 眺餅でございます。(嘘)

>> ところで、objIEで表示させているHTMLのタイトルを書き換えて
>> 保存したいと思っているのですが、良い方法は無いでしょうか?
>> Document.Title="..."
>> で、書き換えられたように見えるのですが、ページ保存をすると
>> HTMLのタイトル部分はそのままなんです。
>> (保存は、WSHShell.SendKeys でごまかしていますが ^^;)
>
>SendKeysでごまかしついでに、クリップボード経由でタイトルを
>貼り付けてやってはいかがでしょうか。
>
>Set oClip=Ie.Document.parentWindow.clipboardData
>sData=oClip.getData("text")
>
>oClip.setData "text",Ie.Document.Title
>...(保存ダイアログ開く)
>WshShell.SendKeys "%N"
>WshShell.SendKeys "^V"
>...(保存処理)
>oClip.setData "text",sData (クリップボードを元に戻しておく)
>
>それか、
>Const OLECMDID_SAVEAS = 4
>Const OLECMDEXECOPT_DONTPROMPTUSER = 2
>IE.ExecWB OLECMDID_SAVEAS,OLECMDEXECOPT_DONTPROMPTUSER,"c:\" & Ie.Document.Title & ".htm"
>というのはどうですか。

教えていただいてありがとうございました。
クリップボードに貼り付けるやり方でできました。

ところで、execWB の方もやってみたのですが、私の環境(WinNT4.0&IE5.5)だと、
「完全」保存の選択肢がなくなってますね。なんででしょ?

ところで、IEの自動運転を考えている時に気がついたのですけど、WSHShell.PopUpで
メッセージを出すスクリプトを別で作っておいて、WSHShell.Runで直帰指定で走らせ
ると処理が止まらなくていいですね。表示文を引数にして渡すとかもできるし。

ではまた。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 17日 19時 06分 16秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

http://newtown.hi-ho.ne.jp/raibo/raidersei/agency/cm_07.html
http://newtown.hi-ho.ne.jp/raibo/raidersei/agency/cm_08.html
http://newtown.hi-ho.ne.jp/raibo/raidersei/agency/cm_09.html
…Hi-HO惚れ直した。


To: TAMWAN さん

> 内容はといいますと、以下のShortcut.TargetPathに@、Aのように指定
> した場合、@はOKで、AはWshShell.Runでエラーとなります。
> このAがプリンタウィンドウのOPENの方なんですが、指定の仕方等
> マズイでしょうか。レス願います。

ちょっと言葉足らずでしたが、これらのショートカットはあらかじめ
手動で作っておくという方法です。
で、WshShell.Run "printer.lnk"のようにしてやります。
やっぱりあまりかっこいい方法とは言えませんが…。


To: ゴン さん

> Win2000での話になるのですが、例えばDOS上のFormatコマンドではなくWindows上のフォーマット処理を行う際にフォーマットウィンドウとフォーマット結果のウィンドウのウインドウタイトルが同じものなので結果がでる前に次の処理へ行ってしまいます。
> (Windows2000の場合は「フォーマット中」と表示)

難しいですね。
たとえば、タイトルがA→B→A
のように変化する場合なら、WshShell.AppActivateを使ってタイトルの変更を
検出できますが、A→A→A の変化は難しそうです。

A→A の間にわずかでもブランクがあれば、そのブランクを利用できるかもしれませんが、
どうでしょう。
要するに、WshShell.AppActivate("フォーマット中")が
True→False→True→False→Trueとなった時点でウィンドウが3回開いたと判定するわけです。


To: いちにい さん

> >> 急に賑やかになりましたね。

日曜日は静かだ(笑)
やっぱりみなさんco.jpな方なんでしょうかねえ?

> > はい、まるでWSHについて情報交換する掲示板のようです。
>
> ははっ。すいません、何時も関係ない話題で。
> ROMってるかな。(笑)

いえいえ、私も質問に答えているだけでは疲れますので、
質問以外の話題をふっていただけるのはありがたいです。

> 逆に、むたぐちさんのWSHの知識は、凄いなぁと思いますよ。マジで。
> WSH関連を検索したら、結局ココへ戻っちゃうんですよね。(笑)

あきもせず結構長いことやってますからね。

> 所がコレ、ちょっと変かも。>DynaCall。
> 実は、他にも試しに作ったんですが挙動がおかしい。

やっぱりWSHからじかにAPIをコールするには無理があるようで、
いろいろとおかしいところもあるみたいですね。

> 逆に、VBSでのタイマー処理とか判らないので、コレを、どう機能させるかは、
> 判りませんが。>ループするしかない?

ですね。
ループ中、WScript.Sleepを入れてやると、CPU使用率が100%になる弊害を回避できます。

> IEだけじゃなくて、FDフォーマットのダイアログも駄目みたいです。
> 何か、シェルに関連した物は、駄目?
> VBでは、OKですが・・・。

何ででしょうね。
とりあえずこっそりコードを見せてもらえませんか?
# APIのことはわからないので、力になれるかどうかはわかりませんが。

いちにい さん 2001年 06月 16日 21時 12分 44秒

To: ゴン さん

すいません、訂正します。
IEだけじゃなくて、FDフォーマットのダイアログも駄目みたいです。
何か、シェルに関連した物は、駄目?
VBでは、OKですが・・・。
コードの載せなくて良かった。

と言うか、多分、作業は、終わってますよね。(笑)

いちにい さん 2001年 06月 16日 15時 14分 47秒

To: 管理人むたぐち さん

>> 急に賑やかになりましたね。
> はい、まるでWSHについて情報交換する掲示板のようです。

ははっ。すいません、何時も関係ない話題で。
ROMってるかな。(笑)


> やはりWin32APIを知っている方は違うなあ(^^;

逆に、むたぐちさんのWSHの知識は、凄いなぁと思いますよ。マジで。
WSH関連を検索したら、結局ココへ戻っちゃうんですよね。(笑)


> 私なんか、こういうAPIがそもそも「ある」ということを知らないので、なかなか
> ぱっと書けないですね。

自分も、WSHについて、同じなんですよ。
同様に、非常に参考になります。


> こういうわりとさっぱり系(謎)なAPIは、WSHから呼び出すとなかなか効果的ですね。

所がコレ、ちょっと変かも。>DynaCall。
実は、他にも試しに作ったんですが挙動がおかしい。
アレを直すだけのスキル無い。(笑)


To: ゴン さん

> ウインドウが3回開いたら次の処理へ進むような方法ってありますか?!

起動中のアプリのタイトルを取得するサンプルを作ったので、DynaCallを使用で、
良ければ、これで行けるかも知れません。
と言うか、WSH的なアプローチが出来ない。(笑)

実行結果。
----------------------
掲示板 - Netscape
ドキュメント - ワードパッド
無題 - メモ帳
無題 - メモ帳
無題 - メモ帳


検索ウインドウ数 = 5
----------------------

逆に、VBSでのタイマー処理とか判らないので、コレを、どう機能させるかは、
判りませんが。>ループするしかない?
後、DynaCallか、VBSの問題か判りませんが、IEのタイトルは、取得できません。
VBでは、問題ないですが。
不完全なので、取り敢えずコード載せてませんが。
コレで、行って見ますか?

Win2000だと、チョット変更必要かも。

ゴン さん 2001年 06月 15日 12時 30分 25秒

>> ウインドウが3回開いたら次の処理へ進むような方法ってありますか?!

>何のウィンドウの話でしょうか。
># さすがにこれだけじゃわからないっす。

to管理人むたぐちさんへ

急いでいたもので要点もなにも書かずに質問してしまい、失礼しました。

Win2000での話になるのですが、例えばDOS上のFormatコマンドではなくWindows上のフォーマット処理を行う際にフォーマットウィンドウとフォーマット結果のウィンドウのウインドウタイトルが同じものなので結果がでる前に次の処理へ行ってしまいます。
(Windows2000の場合は「フォーマット中」と表示)
Sleepを使用すると時間がズレた場合はすぐ止まってしまうので
同じウィンドウタイトルのものが3回表示したら次の処理へいくという感じにしたいのですが掲示板をざっとみてみた感じですとウィンドウ情報の取得はタイトルのみしか取得できないような話がちらほらでているのでなにかいい方法はないでしょうか?!
(WSHでは無理でしょうか?!)

TAMWAN さん 2001年 06月 15日 11時 12分 51秒

TO:管理人むたぐち さん

以下、いろいろとお手数お掛けしています。

さて、ショートカットからの実行をとやってみたのですが。。。。
またまた壁?!
内容はといいますと、以下のShortcut.TargetPathに@、Aのように指定
した場合、@はOKで、AはWshShell.Runでエラーとなります。
このAがプリンタウィンドウのOPENの方なんですが、指定の仕方等
マズイでしょうか。レス願います。

Set WshShell = WScript.CreateObject("WScript.Shell")
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")

sFile="test.lnk"
Set oShortcut=WshShell.CreateShortcut(sFile)
@oShortcut.TargetPath="http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/wshtop.htm"
AoShortcut.TargetPath="\\Test-sv\pr007"
oShortcut.Save

WshShell.Run Chr(34) & sFile & Chr(34)


> Win98で動作させるとCloseしないんですが、Win2000で動作させるとなぜかCloseしますね。
> どうもスクリプトの終了と同時に閉じてしまうようです。
> 最後にWScript.Sleepでウェイトを取ってやると、その時間だけは表示されています。
> Win2000の仕様でしょうか。

> この挙動は、InvokeVerb "properties" でプロパティを表示させたときと同じ挙動ですね。
> …困りましたね。
> WshShell.Run oFolder.Self.Path & "\" & oFolder.Items.Item(I).Name
> とかやってみましたけどダメです…。(仮想アイテムは何かとやっかいだ)

> かっこわるいですけど、これらのアイテムのショートカットを作成しておき、
> それをWshShell.Runしてやるしかないのかもしれません。


ななこ さん 2001年 06月 15日 09時 31分 28秒

to管理人むたぐちさん、aki-akiさん
親切に教えてくださってありがとうございました。
結局、「WshShell.Popup "処理を実行中...",1,」
と数回表示させることで、逃げました。
これからも、わからないことがあったら教えてください。
よろしくお願いします。
記事検索のツールを利用させていただいています。
とても便利ですね。
こちらもありがとうございました。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 15日 03時 00分 36秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: しげの父 さん

メールありがとうございました。

> いつもいただくだけでなく私もあるフォルダー内にあるサブフォルダーを削除する
> VBScriptを作成しました。

どうもありがとうございます。
Lessonにも、こういう「基本的だけど即戦的な」サンプルを載せておくべきですねえ(^^;

> あまりかっこは良くありませんが参考まで

まあ、かっこを気にせず、気楽に書けるのもスクリプトの魅力というわけで。

関係ないですけど、どうもIISの調子が悪くて…。
フォルダのプロパティが開かないという症状に見舞われまして、
結局「Web共有」タブが死んでいることが判明したんですが、
問題は根が深くて、IIS自体が死んでいる(コンパネから起動不能)ようです。
で、IISのアンインストールもできないし(途中で停止してしまう)。
どうしよう…。


To: Kaz さん

> AppActivateで指定のときにタスクIDもしくはタイトル バーに表示されているタイトルを指定できるみたいですが、タスクIDの取得方法?!ということはどのようにおこなえば取得できるのでしょうか?!

つい先日のネタですね(^^;
38-39 管理人むたぐち 2001/06/10 08:52

> 個々のウィンドウの タスクIDを自動で取得するツールとかありますでしょうか?!

要するにウィンドウのプロセスIDを取ってくることができればいいわけですが、
WMIで可能かな?
# 全プロセスを列挙することは簡単なのですが、
# 「ウィンドウを持っているプロセス」を調べる方法はありますかねえ?


To: TAMWAN さん

> 以下で動作確認したところ、各アイテムはOPENされるのですが、全てのアイテムを
> OPENすると全アイテムがCLOSEします。
> InvokeVerbは、OPENし、CLOSEするものなのでしょうか。

Win98で動作させるとCloseしないんですが、Win2000で動作させるとなぜかCloseしますね。
どうもスクリプトの終了と同時に閉じてしまうようです。
最後にWScript.Sleepでウェイトを取ってやると、その時間だけは表示されています。
Win2000の仕様でしょうか。

この挙動は、InvokeVerb "properties" でプロパティを表示させたときと同じ挙動ですね。
…困りましたね。
WshShell.Run oFolder.Self.Path & "\" & oFolder.Items.Item(I).Name
とかやってみましたけどダメです…。(仮想アイテムは何かとやっかいだ)

かっこわるいですけど、これらのアイテムのショートカットを作成しておき、
それをWshShell.Runしてやるしかないのかもしれません。

> それと、「ウィンドウの整列でレジストリ。。。」
> う〜〜ん??????頭がついていけない状態です。

これらのウィンドウを一度手動で整列させて、手動で閉じます。
すると、レジストリキーにウィンドウの位置とサイズが記録されます。
このレジストリキー(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Printers)を
regファイルとして書き出しておきます。

で、スクリプト実行時に、まずこのregファイルを
WshShell.Run "regedit.exe /s hoge.reg",,True
のようにして実行してやります。
そのあと、ウィンドウを開くコードを記述します。
これで、スクリプト実行時にはいつでもウィンドウが整列した状態で
開かれるようになるわけです。


To: ゴン さん

> ウインドウが3回開いたら次の処理へ進むような方法ってありますか?!

何のウィンドウの話でしょうか。
# さすがにこれだけじゃわからないっす。


To: aki-aki さん

>  本当は、区切り文字は、(本当は)エクセルでマスターとして更新できる
> csvファイルの『,』がいいのだけれども、これは使えそうもないので、

使えると思いますけど?
項目自体に『,』という文字が存在するってことでしょうか。

>  「VB Script ポケットリファレンス」

>  「Windows Scipting Host プログラミング入門」

以前、WSH関係の書籍をまとめたことがあります。
15-25 管理人むたぐち 2000/06/01 00:12

マニアックなWSH(というかCOM)の話が知りたい方は、
「Rubyを256倍使うための本 邪道編」がおすすめ。
24-02 管理人むたぐち 2000/11/02 02:43
23-45 管理人むたぐち 2000/11/01 13:05


To: matu さん

> pocket愛用させていただいています。

pocketってなんだろう、と思ってしまいました(笑) (忘れてたし)
私の作ったスクリプトを愛用しているなんて、あまり聞かないのでうれしいです。
…昔作ったスクリプトは、本当はリメイクしたいんですけどね。

> もう一つ愛用しているwshbbs.vbsにコメント文付きで書いてありました。

…たしかにありますね。私ってじつに親切だなあ(爆)

> 追記ですが、SendKeysで変換キーは送れるのでしょうか。

これも送れないキーの一つじゃないでしょうか。
いちにいさんのDynaCallを使う方法なら、できると思います。


To: 筑集眺餅 さん

↑「デスクトップさん」ですか?
それとも狙ってますか(笑)

> ところで、objIEで表示させているHTMLのタイトルを書き換えて
> 保存したいと思っているのですが、良い方法は無いでしょうか?
> Document.Title="..."
> で、書き換えられたように見えるのですが、ページ保存をすると
> HTMLのタイトル部分はそのままなんです。
> (保存は、WSHShell.SendKeys でごまかしていますが ^^;)

SendKeysでごまかしついでに、クリップボード経由でタイトルを
貼り付けてやってはいかがでしょうか。

Set oClip=Ie.Document.parentWindow.clipboardData
sData=oClip.getData("text")

oClip.setData "text",Ie.Document.Title
...(保存ダイアログ開く)
WshShell.SendKeys "%N"
WshShell.SendKeys "^V"
...(保存処理)
oClip.setData "text",sData (クリップボードを元に戻しておく)

それか、
Const OLECMDID_SAVEAS = 4
Const OLECMDEXECOPT_DONTPROMPTUSER = 2
IE.ExecWB OLECMDID_SAVEAS,OLECMDEXECOPT_DONTPROMPTUSER,"c:\" & Ie.Document.Title & ".htm"
というのはどうですか。

> >スクリプトのあるパス名の取得の方法
> 私は
> Left(WScript.ScriptFullName, _
> Len(WScript.ScriptFullName) - Len(WScript.ScriptName))
> を使っています。

どうもありがとうございます。
FileSystemObjectを使わないなら、VBSの関数を使うこういうやり方の方が
いいですね。


To: RiffRaff さん

> でも簡単に使われたくないという理由で隠しメソッドとして実装してい
> る場合もあるかも....。ちなみに JScript ではこういう制限はないよう
> です。

_NewEnum以外に何かありますかねえ?
もし見かけたら、[]を試してみたいと思います(^^;


To: いちにい さん

> 急に賑やかになりましたね。

はい、まるでWSHについて情報交換する掲示板のようです。

> と言うか、嘘っぱちのレスをUPしちゃったので、テンキー1を送るサンプルを、
> 乗せときます。(笑)

ありがとうございます。

> 'FindWindow :アプリのクラス名とタイトルで、hWndを検索するAPI。
> 'SetForegroundWindow :指定したhWndのアプリを、最前列に指定するAPI。
> 'Sleep ;指定した時間(ミリ秒)だけ、アプリを停止するAPI。
> 'keybd_event :キーストロークのエミュレート(キーボードドライバの呼び出し)

やはりWin32APIを知っている方は違うなあ(^^;
私なんか、こういうAPIがそもそも「ある」ということを知らないので、なかなか
ぱっと書けないですね。
非常に参考になります。

こういうわりとさっぱり系(謎)なAPIは、WSHから呼び出すとなかなか効果的ですね。

いちにい さん 2001年 06月 15日 01時 21分 40秒

To: 管理人むたぐち さん

急に賑やかになりましたね。

> なんか、簡易マクロプラグインってありませんでしたっけ。
> 気のせいかな?

そうなんですか。
皆、考えることは、同じなんですね。(笑)


> DynaCallですね。
> keybd_eventは、引数に構造体を取らないので、VBSからも使えるのでは
> ないかと思います。
> 試してないですけど。

DynaCallですか。
チョット、DLしてみました。
と言うか、嘘っぱちのレスをUPしちゃったので、テンキー1を送るサンプルを、
乗せときます。(笑)

電卓を起動して実行すると、「1」が入力されます。
敢えて、keybd_event 以外も使ってみました。

'FindWindow :アプリのクラス名とタイトルで、hWndを検索するAPI。
'SetForegroundWindow :指定したhWndのアプリを、最前列に指定するAPI。
'Sleep ;指定した時間(ミリ秒)だけ、アプリを停止するAPI。
'keybd_event :キーストロークのエミュレート(キーボードドライバの呼び出し)

以下ソース:
'---------------------------------------------------
Private Const vbKeyNumpad1 = 97 'テンキーの「1」を表す定数。
Private Const KEYEVENTF_KEYUP = &H2 'キー解放を表す定数。
Private Const KEYSEND_APPCLS = "SciCalc" '電卓のクラス名。
Private Const KEYSEND_APPCPTN = "電卓" '電卓のタイトル。
Private Const ERRMSG_NOAPP = " が起動していません。"

'Set WSHShell = Wscript.CreateObject("Wscript.Shell")

' Create the wrapper object for dynamic DLL function calling
Set obj_FindWindow = CreateObject("DynamicWrapper")
Set obj_SetForegroundWindow = CreateObject("DynamicWrapper")
Set obj_Sleep = CreateObject("DynamicWrapper")
Set obj_keybd_event = CreateObject("DynamicWrapper")

' GetProcAddress for WinAPIs
obj_FindWindow.Register "user32", "FindWindow", "i=ss", "f=s", "r=l"
obj_SetForegroundWindow.Register "user32", "SetForegroundWindow", "i=l", "f=s", "r=l"
obj_Sleep.Register "kernel32", "Sleep", "i=l", "f=s"
obj_keybd_event.Register "user32", "keybd_event", "i=llll", "f=s"

'電卓のhWnd取得
hWnd = obj_FindWindow.FindWindow(KEYSEND_APPCLS, KEYSEND_APPCPTN)

If 0 = hWnd Then MsgBox (KEYSEND_APPCPTN & ERRMSG_NOAPP): WScript.Quit

'電卓を最前列にセット
Call obj_SetForegroundWindow.SetForegroundWindow(hWnd)

'1秒間停止
obj_Sleep.Sleep(1000)

'テンキー「1」を送る。
Call obj_keybd_event.keybd_event(vbKeyNumpad1, 0, 0, 0)
Call obj_keybd_event.keybd_event(vbKeyNumpad1, 0, KEYEVENTF_KEYUP, 0)

Set obj_FindWindow = Nothing
Set obj_SetForegroundWindow = Nothing
Set obj_Sleep = Nothing
Set obj_keybd_event = Nothing
'---------------------------------------------------

↓VBの場合は、不要です。vbKeyNumpad1は、組み込み定数。
Private Const vbKeyNumpad1 = 97

RiffRaff さん 2001年 06月 14日 22時 44分 08秒

>> むたぐちさん

>私も知りませんでしたが、[]をつけると通常は呼び出せないメソッドが呼び出せると
>いうことでしょうか?

単にアンダースコアから始まるメソッド名を呼び出せるだけのようです。
(普通エラーになりますから)もともとそういうメソッドはオートメー
ションで使われることを想定していないでしょうからカスタムインター
フェイスが使える VB や VBA はともかく VBScript では多分役に立た
ないでしょうね。
でも簡単に使われたくないという理由で隠しメソッドとして実装してい
る場合もあるかも....。ちなみに JScript ではこういう制限はないよう
です。

matu さん 2001年 06月 14日 21時 19分 10秒

To: 筑集眺餅 さん

ありがとうございます。
スクリプトのあるパス名が取れました。

筑集眺餅 さん (pealy21c@hotmail.com) 2001年 06月 14日 20時 58分 30秒

To:むたぐちさん

たいへん判りやすい説明で、ありがたく読ませていただいています。
WSHは、IEの自動運転とテキストプロセッサに使えたらナァと思い、
勉強中です。(正規表現は強力ですね。)
特に、IEの自動運転では、フレームの中のエレメントに触れなくて
困っていましたので、ここの掲示板の内容で助かりました。

ところで、objIEで表示させているHTMLのタイトルを書き換えて
保存したいと思っているのですが、良い方法は無いでしょうか?
Document.Title="..."
で、書き換えられたように見えるのですが、ページ保存をすると
HTMLのタイトル部分はそのままなんです。
(保存は、WSHShell.SendKeys でごまかしていますが ^^;)

To:matuさん
>スクリプトのあるパス名の取得の方法
私は
Left(WScript.ScriptFullName, _
Len(WScript.ScriptFullName) - Len(WScript.ScriptName))
を使っています。

matu さん 2001年 06月 14日 20時 53分 13秒

すみません。書き込んで間も無く解決しました。

もう一つ愛用しているwshbbs.vbsにコメント文付きで書いてありました。

そういえば、wshbbs.vbsでemlfilesフォルダなんかはどうやってスクリプトのある
フォルダにできているのだろう? と思って見てみると....


これからも、宜しくお願いします。


追記ですが、SendKeysで変換キーは送れるのでしょうか。
以前、Excelのマクロで漢字→かな変換をやりたいときに、IMEのキー設定で送れる
キーに設定して回避したことがありますが。

aki-aki さん 2001年 06月 14日 20時 39分 26秒

to:むたぐちさん
> こういうデータ構造なら、split関数を使うといいかもしれません。
> スペースをスプリット文字にするわけです。
 早速にありがとうございます。split関数ですか。ヘルプをみながら簡単な
のを作ってみました。(おヒマな方は切りとって、遊んでみて下さいね。)
------------------------------------------------------------
Dim MyString, MyArray, Msg
MyString = "項目0/項目 1/項 目 2/ 項  目  3"
MyArray = Split(MyString, "/", -1, 1)
ans = Inputbox("表示項目をイン!",MyString)
Msgbox(MyArray(ans))
-------------------------------------------------------------
 本当は、区切り文字は、(本当は)エクセルでマスターとして更新できる
csvファイルの『,』がいいのだけれども、これは使えそうもないので、
『/』にしたいと思います。これだったら、半角/全角が混じっていても平気
ですね。

to:ななこさん
> また、VBSの良い参考書がありましたら、教えてください。
 私は次の2冊を使っています。(と言うか、本屋ではこの2冊くらいしか
見つからなかった・・)

 「VB Script ポケットリファレンス」
   技術評論社 ISBN4-7741-0812-X  本体1,680円
  ポケットリファレンスですが、例が豊富。ie・ASP・WSHのどれで使えるの
 か表示も便利。機能で引くことが出来ます。「ホルダーを削除したい」→
 DeleteHolderですね。

 「Windows Scipting Host プログラミング入門」
   エーアイ出版 ISBN4-87193-667-8 本体2,300円
  WSHの全体像がわかります。(前半部分)
  後半部分は、ヘルプを書き写したような内容ですけれども。

 皆様、如何ですか?

matu さん 2001年 06月 14日 20時 37分 54秒

はじめまして。

Windows 2000 Worldの1月号でWSHに興味を持って、少しずつ勉強しています。
そこで、スクリプトのあるパス名の取得の方法が知りたいのですが、どのような方
法で取得できるのでしょうか。

過去ログは一通り読んだのですが。


To: 管理人むたぐち さん

pocket愛用させていただいています。

ゴン さん 2001年 06月 14日 19時 21分 30秒

教えてください!
ウインドウが3回開いたら次の処理へ進むような方法ってありますか?!

TAMWAN さん 2001年 06月 14日 17時 26分 50秒

TO:管理人むたぐち さん

確認です!!
以下で動作確認したところ、各アイテムはOPENされるのですが、全てのアイテムを
OPENすると全アイテムがCLOSEします。
InvokeVerbは、OPENし、CLOSEするものなのでしょうか。

それと、「ウィンドウの整列でレジストリ。。。」
う〜〜ん??????頭がついていけない状態です。
トホホ。。。
結局、管理人さんに全てお世話になりそうです。
ご迷惑おかけします。

>oItem.InvokeVerb でOKです。
>ただし、新しいプリンタの追加ウィザードが立ち上がってしまうので、工夫が必要です。
>たとえば:
>For I=1 To oFolder.Items.Count-1
>oFolder.Items.Item(I).InvokeVerb
>Next

>あと、このウィンドウの整列ですが、レジストリにウィンドウサイズと位置が記録
>されていることを利用してはいかがでしょう。
>HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Printers


Kaz さん 2001年 06月 14日 17時 00分 49秒

こんにちは!
はじめまして、WSH初心者です。

いくつか質問したいことがありますので分かる方がいらっしゃいましたらよろしくお願いします。

AppActivateで指定のときにタスクIDもしくはタイトル バーに表示されているタイトルを指定できるみたいですが、タスクIDの取得方法?!ということはどのようにおこなえば取得できるのでしょうか?!
個々のウィンドウの タスクIDを自動で取得するツールとかありますでしょうか?!



しげの父 さん (kawatsu@bicom-j.com) 2001年 06月 14日 15時 58分 49秒

いつもいただくだけでなく私もあるフォルダー内にあるサブフォルダーを削除する
VBScriptを作成しました。
あまりかっこよくないですが感謝の気持ちで置いておきます
Option Explicit
Dim objFS,objFolder,colSubFolders
Dim x
'wwwroot 内のフォルダーを削除 July 14th 2001 S.K
On Error Resume Next
'オブジェクトを生成する
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
' Folder オブジェクトを取得する
'Windows Server
Set objFolder=objFS.GetFolder("C:\Windows\筑集眺餅\wwwroot")

Set colSubFolders = objFolder.SubFolders
'取得したサブフォルダー名をxにもらって削除する
For Each x in colSubFolders
WScript.Echo x&"フォルダーを削除しました"
x.Delete
Next

If Err Then
WScript.Echo Err.Description
End If
あまりかっこは良くありませんが参考まで

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 14日 15時 03分 02秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: いちにい さん

> # マクロファイルを読み込んで、EmEditorプラグイン機能を操作できる、プラグインが
> 有ったら面白いですね。(秀丸マクロを、EmEditorで実行できるとか・・・。 笑)
> 実際は、制限有るけど。

なんか、簡易マクロプラグインってありませんでしたっけ。
気のせいかな?

> もし、まだ解決してないようでしたら、VBSから、APIをCallするコンポーネントが
> 有るそうなので、「keybd_event」の使用を検討してみて下さい。
> コレは、文字通りのキーイベント発行関数です。

DynaCallですね。
keybd_eventは、引数に構造体を取らないので、VBSからも使えるのでは
ないかと思います。
試してないですけど。


To: ななこ さん

> 処理中にメッセージボックスで処理中と表示させて、処理が終わったら、
> そのメッセージボックスを消したいのですが、
> ・ボタンなしのメッセージボックスの作り方
> ・メッセージボックスをプログラムで消す方法
> がわかりません。

FAQなので過去記事を参照してください。
12-11 管理人むたぐち 2000/04/15 18:08等が参考になるかと。

ボタンなしメッセージボックスに関しては
4-42 管理人むたぐち 1999/11/27 01:36
をどうぞ。

> また、VBSの良い参考書がありましたら、教えてください。

IEで動かすVBSの参考書なら結構出てますが、
WSHで動かすVBSの参考書はあまりないですね。

うちのLessonは…だめですか(^^;


To: 梨 さん

> 現在IEを起ち上げて印刷をしているプログラムがあるのですが、
> このプログラムを使っているPCが24時間立ち上げっぱなしです。
> そのためメモリーがいっぱいになって、指定したフォントスタイルに
> 置き換えられなくなって、違うスタイルで印刷されるという現象が起きています。
> (スタイルが変わってしまう原因はこれではないかと言われたのです。)
>
> 何か良い回避策は有りますでしょうか??

・メモリをいっぱい積む
・Win2000にする
しか思いつきません(^^;


To: TAMWAN さん

> Set Shell = WScript.CreateObject("Shell.Application")
> Set oFolder=Shell.NameSpace(4)
> For Each oItem In oFolder.Items
> ここでパス名を取得して、OPEN 
> Next

oItem.InvokeVerb でOKです。
ただし、新しいプリンタの追加ウィザードが立ち上がってしまうので、工夫が必要です。
たとえば:
For I=1 To oFolder.Items.Count-1
oFolder.Items.Item(I).InvokeVerb
Next

あと、このウィンドウの整列ですが、レジストリにウィンドウサイズと位置が記録
されていることを利用してはいかがでしょう。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Printers


To: RiffRaff さん

> 実は最近知ったのですが変数名やメソッド名って [ ] で括れるんですね。
> 強引にコレクションの _NewEnum メソッドを呼んでみました。

私も知りませんでしたが、[]をつけると通常は呼び出せないメソッドが呼び出せると
いうことでしょうか?


To: ひろすけ さん

> WHSでWEBで公開しているダウンロード可能なFILE
> をコピーしたいのですが可能でしょうか?
> (WSHのソースでダウンロードが可能でしょうか?)

microsoft.xmlhttpを使う方法:
15-31 管理人むたぐち 2000/06/02 23:28
28-14 Lib30 さん 2001/01/13 17:20
BASP21・winsockなどのコンポーネントを使う方法:
32-48 管理人むたぐち 2001/03/24 19:03
があります。

Iriaをお持ちならIriaAPIを呼び出すという手もあります。(サンプルが付属してます)



なんか久しぶりのWSHネタという気がする(笑)

ひろすけ さん 2001年 06月 14日 14時 24分 07秒

こんにちは、ひろすけです。
WSHのありがたみを最近すごく感じています。
また欲をかいて、変な質問をしたいのですが、

WHSでWEBで公開しているダウンロード可能なFILE
をコピーしたいのですが可能でしょうか?
(WSHのソースでダウンロードが可能でしょうか?)

RiffRaff さん 2001年 06月 14日 13時 11分 10秒

こんにちは、RiffRaff です。
実は最近知ったのですが変数名やメソッド名って [ ] で括れるんですね。
強引にコレクションの _NewEnum メソッドを呼んでみました。
IUnknown インターフェイスが Unknown というオブジェクト名で
返ってきました。オートメーションオブジェクト以外は扱えない
VBScript で使い道はないですが...。

Set WshShell = CreateObject("WScript.Shell")
Set WshCollection = WshShell.SpecialFolders
Set obj = WshCollection.[_NewEnum]
MsgBox TypeName(obj)

TAMWAN さん 2001年 06月 14日 10時 50分 34秒

To:管理人むたぐち さんへ

早速、アドバイスありがとうございます。
そこで、以下を参考にちょっとやってみましたが、以下のようなイメージで
いいのでしょうか。
ただ、「各々のアイテムに対してopenアクションを実行」というところが
わからなく、ご教示願います。こんなレベルで申し訳ないです。

Set Shell = WScript.CreateObject("Shell.Application")
Set oFolder=Shell.NameSpace(4)
For Each oItem In oFolder.Items
ここでパス名を取得して、OPEN 
Next

※ プリンターキュー画面は、むたぐちさんに理解していただいた通りです。

>>  自分の設定しているネットワークプリンタの、プリンタキュー画面を
>>  スクリプトで 開きたいというものです。
>>  現在、自分のPCにプリンタキューの管理という意味で、ネットワーク
>>  プリンタを複数台接続しています。そこで、これら複数のプリンタキュー
>>  画面をスクリプトで1回で表示させ、画面上に整列させるということを
>>  考えています。

> Shellオブジェクトを使って、プリンタフォルダを開き、各々のアイテムに対して
> openアクションを実行させればいいと思います。
> (プリンタキュー画面ってこれのことですよね?)
> ウィンドウの整列もShellオブジェクトのメソッド(TileHorizontallyとか)で
> できますが、これはすべてのウィンドウが対象になります。

> 詳しくは、オブジェクトの解説-Shellオブジェクトをどうぞ。
> もしご入用ならサンプルを作ってみます。



さん 2001年 06月 14日 09時 56分 45秒

こんにちは、前回はありがとうございました。
しかしやはりエラーになってしまい、先に進みません(^_^;
(別の方法を調査中です)

ところで今日は別の質問なのですが、
現在IEを起ち上げて印刷をしているプログラムがあるのですが、
このプログラムを使っているPCが24時間立ち上げっぱなしです。
そのためメモリーがいっぱいになって、指定したフォントスタイルに
置き換えられなくなって、違うスタイルで印刷されるという現象が起きています。
(スタイルが変わってしまう原因はこれではないかと言われたのです。)

何か良い回避策は有りますでしょうか??

ななこ さん 2001年 06月 14日 09時 45分 43秒

初めて書き込みします。
仕事で、VBSのプログラムを作っています。
処理中にメッセージボックスで処理中と表示させて、処理が終わったら、
そのメッセージボックスを消したいのですが、
・ボタンなしのメッセージボックスの作り方
・メッセージボックスをプログラムで消す方法
がわかりません。
どなたか教えてください。よろしくお願いします。

また、VBSの良い参考書がありましたら、教えてください。


いちにい さん 2001年 06月 14日 01時 21分 42秒

To: 管理人むたぐち さん

> あのUIが駄目なんです…という意見をよく聞きますが、私も同じ(笑)
> Windows標準に近いEmEditorは、その点大安定ですよね。

アレを、フローティングツールに設定すると、案外違和感無くなりますよ。
フローティングは、縦型しか設定できないんですが、それが、あの
ツールボタンに、マッチしている感じで。
と言うか、本体から離れて目に入らないから?・・・。(笑)


>> 4)マクロが、比較的簡単に作成できる。

> これがEmEditorユーザーから見ればうらやましい点、というか一番重要な
> 違いと言うか。

ですね。
「無い機能を外部から追加で」、と言う考え方をするなら、それをユーザの手で、
簡単に(それなりのスキルは、要るけど。)実現できる環境を提供しなきゃ駄目ですね。
EmEditorの場合は、柔軟性を選んだのかも知れませんが・・・。
(秀丸マクロでも、外部DLLをCall出来るので、(制限有り)有る程度、凝ったことも
出来そうですが。)

# マクロファイルを読み込んで、EmEditorプラグイン機能を操作できる、プラグインが
有ったら面白いですね。(秀丸マクロを、EmEditorで実行できるとか・・・。 笑)
実際は、制限有るけど。


> あー。某アレですな。アレ。(ってバレバレやん)

そう、アレです。アレ。(笑)


>> vbKeyNumpad1 97 1 キー

> これはFormなどのKeyPressイベントなどの引数を調べるときに使う定数で、
> SendKeysとは関係ありません。
> やっぱりSendKeysでテンキーのキーコードを送る方法はないんじゃないかと
> 思います。

そうですね、全く違いました。
試した方、武井 さん大変失礼しました。
keybd_event のVK_〜定数と勘違いしてました。(笑)


>> 自分は、シェアにレジストしたこと無いです。(ケチ。と言うか面倒くさい。 笑)

> 私は、DatulaとEmEditorのみです。
> 私の場合、他はフリーのもので代替できるものばかりです。

ですね。
たいがい、有って便利なツールは、無くてもOKです。(笑)
家みたいな、HDD2GBだと、そうそうDLして、なんて行きません。
残り、15MB切ってるし。


To: 武井 さん
もし、まだ解決してないようでしたら、VBSから、APIをCallするコンポーネントが
有るそうなので、「keybd_event」の使用を検討してみて下さい。
コレは、文字通りのキーイベント発行関数です。



AKiOS さん 2001年 06月 14日 01時 09分 38秒

To: Black Rain さん

はじめまして。

> 画面の初期サイズについての話題が中途半端に終わっていたので
> 今更ながら対処法を載せておきます

おお、有用な情報ありがとうございます。
早速、記事検索HTAでも使わせていただきます。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 13日 21時 10分 30秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: aki-aki さん

>  win2.0とかの頃は、ノートパッド。(その頃もそう言う名前?)

3.1では「メモ帳」になっていました。

>  秀丸はwin3.1の時代からです。4000円送金しました。
>  今から思うと、フリーウェアの作者は無料になるのですよね。(でも、当時は
> フリーウェアを発表してなかったケド。)

スクリプトはフリーソフトになるのかな?

>  繰り返しになりますが、今はviと秀丸。秀丸はマクロでもお世話になってい
> るし、grepや正規表現の検索が出来て好きですが、他の(普通にPCで使う)エ
> ディターは使ったことがないので、比較対象を語る資格はないですね。本当は。

最近正規表現を覚えたんですが、EmEditorでは正規表現の検索ができないんで、
ちょっと物足りない感じもします。

>  abc XKKKX KKKXKKXX
> abd XXXKKX XXXXXKKKK
>  (1) (2) (3)
>
> (1) KEY
>  (2) 項目1
>  (3) 項目2
>  Xは1バイト文字(ANK)、Kは2バイト文字(漢字とか)を示します。

こういうデータ構造なら、split関数を使うといいかもしれません。
スペースをスプリット文字にするわけです。

>  ところが・・。得たいケタ数で、項目が得られないのですよね。
>  ひょっとして、2バイト文字はだめなんでしょうか?良くは知らないので
> すが、2バイト文字にはkiとkoが入っていて、それが上手く処理出来ない?

VBSでは文字列をUNICODEで処理するからだと思います。
つまり、あらゆる文字が2バイト。(*B系の関数はあまり意味がないような気が)


To: 松島 さん

> 「卓駆★」http://www.valley.ne.jp/~com/ を長いこと愛用してます。
> 初期表示状態だと使いにくいので、設定はあれこれ弄って使っていますが。

メジャーどころですよね。
私はエクスプローラ派なので、こういうファイラは使わないのですが、
一時期エクスプローラのあまりの重さに耐えかねて、本気で移行を
検討したことがあります。
私的には、どこまでシェルの機能を取り込んでいるかがポイントになります。
関連付けは当然エクスプローラ準拠として、右クリックメニューとかプロパティとか
どこまで忠実に再現しているか。
ちょっとでも挙動が違うと、それでもう使う気をなくします。
…で、結局エクスプローラから離れられない(^^;

> いやあ、目の前のハードで十分に動く事だけを考えていればよかった時代が懐かしいです。(笑)
> 今ではそんな短命な考え方できなくなってしまいましたから。(^^;
>
> #といいつつ、試行錯誤の連続で結果的に短命なコードばかり作ってしまっていますが…(汗)。

ちょっと話がずれるかもしれませんが、最近のハードは高機能・高性能すぎて、
だれも限界まで能力を引き出せないという皮肉っぽい現状が
あると思います。(あ、家庭用ゲーム機の話です)

> 自分の方のサーバ構築の準備に掛かりっきりで、「PGPって何か用意しないといけないの(?_?)」
> みたいな状態だったりして(^^;;;;

DatulaではPGPを割と簡単に扱えるようなので、これを機会に導入してみようとしました。
が、なんだかいろいろ複雑で、途中で挫折してしまいました。
なんかよくわからない用語・設定事項が満載。日本語化してもよくわからない。
うーん。

> VineLinux2.xにrpmで入っていたものを使ってます。
> なので、セットアップや設定については、ちょっと分かりません。すみません。
> #GIF吐けるのは問題ないのかなあ。(^^;)

最近のはGIF吐けなくなっているはずですが。
# ソースをちょこっといじったら(コメントをはずすとか)できるようになるとか?

> L2TP とか PPTP とか。他で耳にした事が無かったので(^^;)。

とりあえず、Win2000のヘルプを見ると基本だけはわかります(^^;
私もそれ以上のことは知らないです(^^;


To: TAMWAN さん

>  自分の設定しているネットワークプリンタの、プリンタキュー画面を
>  スクリプトで 開きたいというものです。
>  現在、自分のPCにプリンタキューの管理という意味で、ネットワーク
>  プリンタを複数台接続しています。そこで、これら複数のプリンタキュー
>  画面をスクリプトで1回で表示させ、画面上に整列させるということを
>  考えています。

Shellオブジェクトを使って、プリンタフォルダを開き、各々のアイテムに対して
openアクションを実行させればいいと思います。
(プリンタキュー画面ってこれのことですよね?)
ウィンドウの整列もShellオブジェクトのメソッド(TileHorizontallyとか)で
できますが、これはすべてのウィンドウが対象になります。

詳しくは、オブジェクトの解説-Shellオブジェクトをどうぞ。
もしご入用ならサンプルを作ってみます。


To: いちにい さん

> 独特のUIって、あのツールボタンと、その画像ですか?
> 確かに、独特ですね。(笑)
> ツールボタンが大きくなると、安っほく為っちゃうんですよね。

あのUIが駄目なんです…という意見をよく聞きますが、私も同じ(笑)
Windows標準に近いEmEditorは、その点大安定ですよね。

> 4)マクロが、比較的簡単に作成できる。
>   文字列操作も簡単で、なかなかいい感じ。でも、その分、自由度が制限される。

これがEmEditorユーザーから見ればうらやましい点、というか一番重要な
違いと言うか。

> むしろ、バージョンアップが無料なので、バージョンアップ料が掛かるエディタよりも、
> 安く付きますよ。

あー。某アレですな。アレ。(ってバレバレやん)

> テンキーのキー
>
> 定数 値 内容
> vbKeyNumpad0 96 0 キー
> vbKeyNumpad1 97 1 キー
>
> です。

これはFormなどのKeyPressイベントなどの引数を調べるときに使う定数で、
SendKeysとは関係ありません。
やっぱりSendKeysでテンキーのキーコードを送る方法はないんじゃないかと
思います。

> 症状が出たのは、外付けHDDだったんですよ。
> (外付けHDDにも、スタンバイモードとか、有るのかな?)

あると思いますよ。

> 自分は、シェアにレジストしたこと無いです。(ケチ。と言うか面倒くさい。 笑)

私は、DatulaとEmEditorのみです。
私の場合、他はフリーのもので代替できるものばかりです。


To: Black Rain さん

> 画面の初期サイズについての話題が中途半端に終わっていたので
> 今更ながら対処法を載せておきます
>
> <HTML>
> <HEAD>
> <SCRIPT language=VBScript>
> ' 画面初期化
> Const initWidth = 200
> Const initHeight = 200
> resizeTo initWidth, initHeight
> moveTo (screen.width-initWidth)/2, (screen.height-initHeight)/2
> </SCRIPT>
> <HTA:APPLICATION 〜

!!!!
これは盲点でした。
今まで、Sub window_onload()で実行していたから、一瞬デフォルトサイズで
表示されていたわけですね。
こうやって、Subプロシージャ外に記述してやれば問題ないわけです。
うーむ。なぜこんな簡単なことに気づかなかったのか。

情報提供ありがとうございました。

Black Rain さん 2001年 06月 13日 14時 52分 37秒

はじめまして

htaの情報を検索中に1年程前のログがヒットしまして

画面の初期サイズについての話題が中途半端に終わっていたので
今更ながら対処法を載せておきます

<HTML>
<HEAD>
<SCRIPT language=VBScript>
' 画面初期化
Const initWidth = 200
Const initHeight = 200
resizeTo initWidth, initHeight
moveTo (screen.width-initWidth)/2, (screen.height-initHeight)/2
</SCRIPT>
<HTA:APPLICATION 〜

いちにい さん 2001年 06月 13日 14時 43分 47秒

To: 高橋 さん

> 逆に秀丸などはあまり好きになれないんですよ。独特のUIがあまり好きに
> なれなくて…

独特のUIって、あのツールボタンと、その画像ですか?
確かに、独特ですね。(笑)
ツールボタンが大きくなると、安っほく為っちゃうんですよね。
画像については、自分も「アレ」なので、コメントを控えさせていただきます。(笑)

秀丸で、チョット気になったところ・・・。

1)ツールバーに、色々登録しても、フローティングツールバーに、
  出来るので、全ボタンが表示される。
  但し、縦型しかないのと、切り替えが面倒です。

2)ツールバーに登録できる数が制限されてる。
  GUI派としては、チョット不満かも。せっかく分離できるのに・・・。

3)文字列を選択したときに出る、コンテキストメニューに、
  ショートカットキーが、設定されてない。何故?(笑)
  キー操作で、コンテキストメニューを出すことが良くあるので、結構不満。
  (性がないので、自分で、ショートカットキーを設定。今のところ、無問題 笑)

4)マクロが、比較的簡単に作成できる。
  文字列操作も簡単で、なかなかいい感じ。でも、その分、自由度が制限される。


> あとはシェアウェアにしては割と高めなところですかねぇ。

開発に掛かる経費とか勘案したら、シェアウェアとしては、妥当な線じゃないですか?
むしろ、バージョンアップが無料なので、バージョンアップ料が掛かるエディタよりも、
安く付きますよ。


> 静かなHDDなら富士通がお勧めですよ。

購入時には、参考にします。(^-^)


> To: 武井 さん

>> sendkeysでテンキーの「1」を送信するにはどうしたらよいでしょうか?

VBかVBAを持っていましたら、ヘルプを見てみて下さい。
他にも色々載ってます。

テンキーのキー

定数 値 内容
vbKeyNumpad0 96 0 キー
vbKeyNumpad1 97 1 キー

です。


To: 管理人むたぐち さん

> HDDは、一定時間アクセスがないとスタンバイモードに入ります。
> 「電源のオプション」でその時間を設定できます。
> もちろん、スタンバイさせないようにもできます。

症状が出たのは、外付けHDDだったんですよ。
(外付けHDDにも、スタンバイモードとか、有るのかな?)


>> CD-ROMは、どうなんでしょう?
> 読み出し時以外は止まっているんじゃないですか?

判りません。(笑)


>> HDDをミラーするなんて、家みたいなヘッポコ環境から見たら、
>> 贅沢な仕様です。

> まあ、サーバーなら当然ですよね。
> # でもない?

なるほど、そう言うことですか。
単なるバックアップでは、無いわけですね。


>> HDDのDIRをクリックしたら、為ったような記憶が・・・。(忘れました 笑)
> dirでHDDにアクセスした結果ですね。

いずれにせよ、まともな動きでは、無かったようです。


To: aki-aki さん

> 秀丸はwin3.1の時代からです。4000円送金しました。
> 今から思うと、フリーウェアの作者は無料になるのですよね。(でも、当時は
> フリーウェアを発表してなかったケド。)

正規ユーザですか。
自分は、シェアにレジストしたこと無いです。(ケチ。と言うか面倒くさい。 笑)
しかし、フリーウェアの作者は無料なんですか、知りませんでした。
でも、ソフト公開してないし、ガラクタばっかで公開できないし。(笑)
今は、何か発表してるんですか?>フリーウェア。


To: 松島 さん

> 12x12は、会社の液晶XGAモニタで作ったんですが、家のモニタで見たら、ドットがつぶれて
> 全く別のように見えてしまいました(^^;;;;

なるほど。
そんなこと、考えたこともありませんでした。
やっぱ、色んなケースでテストできる環境が無いといかんですね。
特に、公開とか、するつもりじゃ無いんですけどね。(笑)
テストできないから、公開も出来ないって事もありますが・・・。

TAMWAN さん (tamwan@yahoo.co.jp) 2001年 06月 13日 11時 31分 51秒

はじめまして、TAMWANです。

実は、VBスクリプトで以下のようなことができないかと、関連サイトを
検索しましたが、未熟者ゆえ応用きかず、行き詰まり、投稿したしだいです。
アドバイス、よろしく願います。

<内容>
 自分の設定しているネットワークプリンタの、プリンタキュー画面を
 スクリプトで 開きたいというものです。
 現在、自分のPCにプリンタキューの管理という意味で、ネットワーク
 プリンタを複数台接続しています。そこで、これら複数のプリンタキュー
 画面をスクリプトで1回で表示させ、画面上に整列させるということを
 考えています。

以上です。よろしくお願いします。

松島 さん (matsushima@popup.org) 2001年 06月 13日 02時 39分 36秒
URL:http://www.popup.org/ai/

どうも。毎回、WSHには全く関係ないネタばかり持ち込んで来るたわけ者です(^^;;)。

To: むたぐち さん

> ちなみに何のファイラをお使いですか?

「卓駆★」http://www.valley.ne.jp/~com/ を長いこと愛用してます。
初期表示状態だと使いにくいので、設定はあれこれ弄って使っていますが。

> やっぱ、このへんのパラメータを組み合わせて、いかに少ない音色(+音数)で豊かな音楽を
> 奏でるかがサウンドプログラマーの職人芸なんですよね。

タイマ割り込み毎に音源レジスタの値を弄ったり、
FM音源でキーオンした状態のまま音色番号を変えたりパラメータ弄ったり、
チップの仕様にないレジスタの使い方をしたり…。
色々と無茶やってました。(というより、無茶な希望を実装してくれた音源ドライバ作者に感謝)

> いかん、たぶんマニアックすぎて誰もついてこないぞ(笑)

いやあ、目の前のハードで十分に動く事だけを考えていればよかった時代が懐かしいです。(笑)
今ではそんな短命な考え方できなくなってしまいましたから。(^^;

#といいつつ、試行錯誤の連続で結果的に短命なコードばかり作ってしまっていますが…(汗)。

> > Webサービス系の異OSサーバ間の接続実験が出来たら面白いかもしれないと、
> > 思っているんですが、いかがでしょうか。(笑)
> ぜひやってください(^^;

SOAPでは、Microsoftの.NET や PerlのSOAP::Lite、Javaの Apache-SOAP などが有力な選択肢らしいです。
ただ、相互接続には色々と気を使わないといけないみたいです。
どこかで互換性が詳しく表になったものを見かけたのですが、場所を忘れてしまいました(不覚…)。

> # 「何か。(仮)」、ついに人工知能(人工無能)搭載ですか…。
> # 最近、ぜんぜん追従してないなあ、いろんな意味で。

同じく(汗)。


To: いちにい さん

> 12x12ですか・・・・。
> 16x15でも結構苦しんでます。
> 1ドットの差が、かなり影響与えます。

少ない色数や固定パレットが前提だと、1ドットの存在感が本当に大きくなりますよね。

12x12は、会社の液晶XGAモニタで作ったんですが、家のモニタで見たら、ドットがつぶれて
全く別のように見えてしまいました(^^;;;;


To: チャブーン さん

> PGPをお持ちの方なら無償で試験参加いただけます。

自分の方のサーバ構築の準備に掛かりっきりで、「PGPって何か用意しないといけないの(?_?)」
みたいな状態だったりして(^^;;;;

> なお現状では、通常のSMTP/POP3ですが、APOP対応にした方がいいのかなって気がしてます。
> #それともIMAPがいいですか?

一次プロバイダでの場合と違って、不特定の中継サーバを伝って目的サーバに繋がると思いますので、
なるべく平文パスワードは避けたほうが安全だと思います。(サーバのハッキング対策にも…)

IMAPは、ホントに高速/大容量向きの環境ですよね(どちらかと言えばLAN)。
言ってみれば、どのメールを見るときでも、プロバイダからメールを取得するときと
同じだけのウェイトが発生するようなものでしょうから…。

> お使いなのはUNIXベースの本家ですよね?私も使っているのですが、実は
> Windows版でして、これがちょっとした問題があるのです。矩形/円形領域
> を選択して何か操作するとそれだけで強制終了してしまうのです(Win2000/
> 98とも)

VineLinux2.xにrpmで入っていたものを使ってます。
なので、セットアップや設定については、ちょっと分かりません。すみません。
#GIF吐けるのは問題ないのかなあ。(^^;)

>>(VPNで)よく分からない単語がいっぱい…。(笑)
>すみません。こちらが不勉強で纏めが悪いのでしょう。

いえいえ、こちらの「無」勉強が原因ですので。

>ご指摘よろしくお願いいたします

L2TP とか PPTP とか。他で耳にした事が無かったので(^^;)。


To: むたぐち さん

> vi系よりEmacs系の方が取っ付きやすいかもしれないですね。

ヘルプが日本語化していると、CUIでもヘルプが引きやすい方が便利かもしれません。
そんな理由でこのごろvi系をよく使ってます。


To: aki-aki さん

> 皆さんはどのようなエディターを使っていますか?

Windowsでは秀丸(Ver.3)で、Unix系ではvi系です。

ただ、秀丸にはタブ型等のインターフェース等で複数文書を扱う機能が備わっていないので、
多数のファイルをプロジェクト的に編集する際には不向きだと思います。
#ウィンドウをたくさん開かないといけない…(汗)。

というわけで、今 http://www.m-mix.com/Program/SOEV/index.htm を試しに使ってみているところです。
求めていた機能は概ね備わっていたのですが、逆にテキストエディタとしての使い勝手には少し不満(^^;)。
#ちなみに今、10本以上の「CREATE TABLE」なSQLのファイルを開いてます。(^^;


To: aki-aki さん

VB/VBScriptでは、UTF-16 として扱われていたと思います。
VBでは、StrConv() でSJISに変換して求める方法が一般的です。(VBScriptではどうだったかなあ…)

ところで、JavaScript/JScript/ECMAScriptで、スクリプト側の規定として、
非アスキー文字(0〜127でない文字)の扱い方について、何か言及されているものを
見かけた方はいらっしゃいますでしょうか?(^^; 規定されているという話を聞いた事が無くて…。
VBScriptでの扱いも、もしかしたら同じように曖昧なグレーゾーンの代物なのかも(?)。


aki-aki さん 2001年 06月 12日 23時 38分 38秒

もう一つ発言します。

 今、VBSで小さな(50行くらい)表引きをしようとしています。
 表の構造なのですが、キーとなる部分が英字3文字(3バイト)で、
description(表引きしたいところ;なんと言ったら?)が、半角やら漢字
やらが混じっているんです。しかも複数の項目。

 abc XKKKX KKKXKKXX
abd XXXKKX XXXXXKKKK
 (1) (2) (3)

(1) KEY
 (2) 項目1
 (3) 項目2
 Xは1バイト文字(ANK)、Kは2バイト文字(漢字とか)を示します。

 こんな構造なんです。

 表(テキストファイル)を順次に読み込んで、項目1とか項目2を得たい
ので、キーがヒットしたら、MidB関数を使用しようとしました。
 ところが・・。得たいケタ数で、項目が得られないのですよね。
 ひょっとして、2バイト文字はだめなんでしょうか?良くは知らないので
すが、2バイト文字にはkiとkoが入っていて、それが上手く処理出来ない?
 多分、leftBとかも同じでしょうね。

 例えば、こんな簡単な例:
 (宜しかったら、切り取って実行してみて下さい。:インプットBOXに
表示された文字から好きなバイト数を表示します。)
--------------------------------
Const test = "xKKxKx"
ans = Inputbox("表示バイト数をイン!",test)
Msgbox(Midb(test,1,ans))
--------------------------------
 思ったケタ数が得られないのですが・・。

 皆様、宜しくお願いします・・。

Return