SMART SPACE

ハイブラウ&ハイセンス

全体表示

[ リスト ]

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
 
 
 
 
 

.

過去の記事一覧

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

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

もっと見る

[PR]お得情報

数量限定!イオンおまとめ企画
「無料お試しクーポン」か
「値引きクーポン」が必ず当たる!
いまならもらえる!ウィスパーWガード
薄いしモレを防ぐパンティライナー
話題の新製品を10,000名様にプレゼント
コンタクトレンズで遠近両用?
「2WEEKメニコンプレミオ遠近両用」
無料モニター募集中!
ふるさと納税サイト『さとふる』
11/30まで5周年記念キャンペーン中!
Amazonギフト券1000円分当たる!
いまならもらえる!ウィスパーうすさら
薄いしモレを防ぐ尿ケアパッド
話題の新製品を10,000名様にプレゼント
お肉、魚介、お米、おせちまで
おすすめ特産品がランキングで選べる
ふるさと納税サイト『さとふる』

その他のキャンペーン


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

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

みんなの更新記事