SMART SPACE

ハイブラウ&ハイセンス

000バッチファイル

[ リスト | 詳細 ]

記事検索
検索

全4ページ

[1] [2] [3] [4]

[ 前のページ | 次のページ ]

9-3 バッチファイルからウィンドウを操作する

○Windows95のバッチファイルは、16ビットアプリケーション
Windowsのアプリケーションは、ウィンドウを表示してユーザがウィンドウを操作することによって実行されますが、バッチファイルはその名のとおりバッチ処理を行います。
このため、ウィンドウを開くアプリケーションと同期して動作することが難しく、使い道を限らせてしまうようです。
そこで、バッチファイル用の外部コマンド(コンソールアプリケーション)を作成して、ウィンドウを持つアプリケーションをバッチファイルで操作できるようにしたいのですが、一つだけ困ったことがあります。
それは、Windows95 のバッチファイルは、COMMAND.COM (16ビットアプリケーション)で実行されるということです。
Cのソースファイルをコンパイルするときに利用する、NMAKE.EXECL.EXE などの32ビットコンソールアプリケーションは、コンソールにフォーカスがなくても動作します。
しかし、バッチファイルを実行しているコンソールにフォーカスがないときには、バッチファイルの処理は停止してしまいます。
このため、Windows95 で他のウィンドウを制御するときは、バッチファイルを実行したコンソールからフォーカスが移動しないときだけ制御を行うことができます。
なお、Windows95 では32ビット環境でのバッチファイルはサポートしていませんので、 WindowsNTでなけれな動作しないバッチファイルは、拡張子をCMDにしておくとよいでしょう(注1)。
(注1)もともと、CMD はOS/2のバッチファイル拡張子ですがWindowsNTでは、この拡張子をもつバッチファイルをサポートしています。

○バッチファイルからウィンドウを操作するための外部コマンドを作成
バッチファイルからウィンドウを操作するためのコマンドは標準ではサポートされません。そこで、操作を行うための外部コマンドを作成します。
  1. バッチファイルを実行しているコンソールを非表示にする
  2. 指定されたウィンドウが存在するかを得る
  3. 指定されたウィンドウにメッセージを送信する
    これらの外部コマンド以外に、
  4. 指定時間処理を停止する
  5. 他のマシンにメッセージを送信する
    といった機能を補助的に追加します。

9-4 コンソールを非表示にする

○コンソールの制御は複雑
コンソールアプリケーションは起動すると、必ずコンソールウィンドウを開きます。しかし、このウィンドウは意外と邪魔物にされることが多く、できれば消してしまいたいことがあります。自動的に表示されるコンソールを消すには、 Win32 API FreeConsole() を利用することができます。
しかし、このAPIを利用してコンソールを削除すると、標準入出力 (stdin, stdout, stderr) とコンソールとのリンクがなくなり、利用できなくなります。
これらのハンドルは、Win32 API CreateConsole でコンソールを再度生成しても元のハンドルとは異なるため、それぞれのハンドルを再度設定し直すまで利用できません。
そこで、コンソールウィンドウを通常のウィンドウと同様に制御する方法を考えます。

○一時的にユニークな名前をつけてウィンドウハンドルを取得
コンソールは、他のウィンドウとは異なるAPIで生成しますが、ウィンドウハンドルを取得することができれば、他のウィンドウと同様に制御することができます。
しかし、コンソールのウィンドウクラス名は、変化しないため、コンソールと他のウィンドウを識別することができますが、複数のコンソールを識別することができません。
このため、ウィンドウ名を利用します。しかし、コンソールのウィンドウ名も実行したファイル名が表示されたり、PIFファイルで設定した値が利用されるため、複数のコンソールウィンドウから特定のコンソールウィンドウを識別することができません。
そこで、コンソールのウィンドウ名は変更するためのAPIである、 Win32 API SetConsoleTitle() 取得するための Win32 API GetConsoleTitle() を利用して一時的にウィンドウ名を変更します。
つまり、一時的にユニークな名前をつけてウィンドウハンドルを取得し、ウィンドウハンドルを取得後にコンソールのタイトルを元に戻します。
ここでは、ユニークなウィンドウ名として、アプリケーション名と、システムの起動からの経過時間を利用していますが、完全に識別するにはも少しユニークな名前である必要があるかも知れません。 なお、Win32 API SetConsoleTitle() は、ウィンドウ名が完全に変更される前に関数が終了してしまうようなので、完全に変更されるまで待つ処理が必要となります(例9-1, 例9-2)。



例9-1:コンソールのウィンドウハンドルを取得する
GetConsoleTitle(szOldText, sizeof(szOldText)); sprintf(szId, "bHide%08X", timeGetTime()); SetConsoleTitle(szId); /* ウィンドウ名が変更されるまで待つ */ do{ Sleep(100); GetConsoleTitle(szTemp, sizeof(szTemp)); }while(strcmp(szId, szTemp) != 0); hWnd = FindWindow(NULL, szId); SetConsoleTitle(szOldText);
例9-2:コンソールを5秒間非表示状態にする
@echo off bhide on bsleep 5 bhide off
 
 
 
 
 
アプリ終了
taskkill /F /IM chrome.exe /T
 
  • /Fが強制。/Tが 「指定したプロセスとそのプロセスが開始したすべての子プロセスを削除します。」だそうです。
  •  /FつけないとGoogleChromeは終了できませんでした。「終了しますか?」みたいなプロンプトすらでない・・・。
  •  /F 強制終了にすると、次回起動時、「前回のセッション中にGoogle Chromeは強制終了されました。開いていたページをすべて復元するには、[復元]をクリックしてください。」と出るので注意。ここで復元しないでまたChoromeを終了しちゃうと、同じタブを復元することはできなくなるので、注意。気になる場合はChoromeだけは手動で終了するようにするか、もっといい方法をググるかですかね。
batファイルをダブルクリックすれば使えるのですが、windows 7の場合、スタートメニューのランチャ機能がしっかりしていて、「Windowsキー」→appkill→「tabキー」→「エンター」、と少ないステップですぐ実行できます。

 
もっと便利に実行できるようにするにはbatファイルが格納されているフォルダへPathを通すか、Pathが通ってるフォルダ内にbatを置けばいいです。
  • Windows7の場合
    • 「コンピューター」を右クリック→「プロパティ」
    • 画面左「システムの詳細設定」
    • 環境変数(N)
    • 「システムの環境変数(S)」の中に「Path」をダブルクリック
    • ずらずらとフォルダのPathが書いてある。一番右端にいったら「;」とbatファイルがおいてあるフォルダのPathを書く。「;」は値をつなげて書くときの区切りみたいなもの
    • 特に再起動とかはいらない。これで準備OK
    • Windows+Rをおして「ファイル名を指定して実行」で「appstart」などbatファイル名を打ってみよう。.batや.exeは省略可能。これでだめならpathが通ってないってことなので、手順をもういちど見直し
セット起動


@echo off
    setlocal
    set run01="%ProgramFiles%\Internet Explorer\iexplore.exe"
    set opt01=http://www.google.co.jp
    set run02="%USERPROFILE%\Documents\memo.xlsx"
    set run03="%USERPROFILE%\Documents\P_MYCOM"

:execute
    start ""  /B %run01% %opt01% || echo "Error %run01%"
    start ""  /B %run02% || echo "Error %run02%"
    start ""  /B %run03% || echo "Error %run03%"

:end
    endlocal


5〜6行目のローカル環境変数は、それぞれファイルおよびフォルダーが値として設定されているため、首をかしげる方もおられるのではないでしょうか。バッチファイルやコマンドプロンプト上からファイルを実行しますと、関連付けられたアプリケーションが起動し、ファイルを開きます。フォルダーの場合はバッチファイル内では自動的にエクスプローラーの引数として用いられるため、このような記述にしました。それぞれのローカル環境変数をお使いのレジメファイル、および作業フォルダーのパス名に変更してください。
 
「|| echo "Error %run01%"」は、「start」コマンドが正しく実行されなかった場合、標準出力にエラーメッセージを表示させるための記述です。今回はバッチファイルをダブルクリックで実行しますので、あまり意味がありません。それでも正しく動作しないときは、バッチファイルをコマンドプロンプト上から実行すれば、エラーメッセージを確認できますので、正しく動作しない場面になってから記述してもいいでしょう。
 
 
@echo off
start explorer "D:\Users\neo-s6ka13120\Desktop\■\batch"
exit

::フォルダを引数に渡してexplorerを起動
SET TARGET_DIR1=C:\ほげほげ1\
EXPLORER "%TARGET_DIR1%"
 
 
 
::「start」コマンドの後ろの「""」はタイトルバーに表示されるタイトル。
::これを指定しておかないと「"%TARGET_DIR1%"」の部分がダブルクォートに囲まれているのでタイトル扱いになる。
SET TARGET_DIR1=C:\ほげほげ1\
START "" "%TARGET_DIR1%"
start ONENOTE.EXE
start WINWORD.EXE
start EXCEL.EXE
start POWERPNT.EXE
start MSACCESS.EXE
start OUTLOOK.EXE
start calc.EXE
start notepad.EXE
start mspaint.EXE
start snippingtool.EXE
 
 
::Office11  2003
::Office12  2007
::Office13  2010
::Office14  2013
 
 
start "" "C:\Program Files\Microsoft Office\Office13\OUTLOOK.EXE"
start "" "C:\Program Files\Internet Explorer\iexplore.exe"
start "" "C:\Program Files (x86)\Google\Chrome\Application\Chrome.EXE"
start "" "C:\Users\heruryoma\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories\Windows Explorer.lnk"
 

全4ページ

[1] [2] [3] [4]

[ 前のページ | 次のページ ]


.

過去の記事一覧

diogenes
diogenes
男性 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について

よしもとブログランキング

もっと見る

プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事