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

- >
- コンピュータとインターネット
- >
- コンピュータ
- >
- ソフトウェア








