DOBON.NET DOBON.NETプログラミング掲示板過去ログ

外部プログラムを起動後、ウィンドウ移動が失敗する

環境/言語:[環境(WindowsXP)、使用言語(C# 2005)、.NET Frameworkのバージョン(2.0)]
分類:[.NET]

お世話になります。

現在開発しているプログラムで、うまく動作しない箇所がありまして、皆様のお知恵を拝借できればと考えております。

◆【開発しているプログラムの概要】
 外部プログラムを一定間隔で、順次起動していく。
 起動後に外部プログラムのウィンドウの位置を指定した箇所に移動させる。
 なお、呼び出す外部プログラムはVB6、Delphiで作成されたもの。

◆【質問内容】
 外部プログラムの起動は問題なくできるのですが、指定位置に移動させるところがうまくいきません。"MoveWindow"、"SetWindowPos"を用いて試してみたのですが、
例えば"notepad.exe"だと移動までうまく動作しますが、本当に呼び出したいプログラムは起動した位置から変更されません。
外部プログラムのハンドルは取れているようですし、"SetWindowPos"の場合は、復帰値が"True"で終了します。
下記に起動箇所のソースを記載させていただきます。何かお気づきの点がありましたら、ご教示いただけます様、よろしくお願い致します。

◆【ソース】
 #region "(Fnc_AplProcessメソッド) :指定アプリ起動メソッド"
//名称 : Fnc_AplProcessメソッド
//引数 :
//戻り値 :
//処理内容 : 指定された外部アプリケーションを起動する。
//備考 :

private void Fnc_AplProcess(string Wrk)
{
bool intReturn;

System.Diagnostics.Process[] ps;

string[] B = Wrk.Split(new char[] { ',' }); //分解

//アプリ起動
System.Diagnostics.Process proc = new System.Diagnostics.Process();

proc.StartInfo.FileName = B[1];
proc.StartInfo.Arguments = B[2];
proc.StartInfo.WorkingDirectory = B[3];
proc.Start();

//アイドル状態になるまで待機
proc.WaitForInputIdle();

********** ↓↓ここがうまくいかない↓↓ ************

//ウィンドウの位置を変更する
MoveWindow(proc.MainWindowHandle, 0, 500, 300, 200, 1);
//intReturn = SetWindowPos(proc.MainWindowHandle, HWND_TOP, 500, 100, 0, 0, SWP_NOSIZE);

********** ↑↑ここがうまくいかない↑↑ ************

Application.DoEvents();

}
Delphi なんかだと、タスクバーに表示されるウィンドウはある種のダミーウィンドウであり、実際にデスクトップに表示されているウィンドウとは別のウィンドウだったりすることがあったと思います。
Win32API の CreateProcess 関数は起動時の座標を指定できるので、ひょっとしたら有効かもしれません。
それが効かない場合、ウィンドウのタイトルまたはクラス名で識別できるのなら、FindWindow 関数で目的のウィンドウを探し出せば多分可能です。
それも無理なら、EnumWindows 関数を使ってウィンドウを列挙し、GetWindowThreadProcessId 関数やら GetWindowInfo 関数やらを使って目的のウィンドウを特定することになります。
■No26584に返信(Hongliangさんの記事)
> Delphi なんかだと、タスクバーに表示されるウィンドウはある種のダミーウィンドウであり、実際にデスクトップに表示されているウィンドウとは別のウィンドウだったりすることがあったと思います。
> Win32API の CreateProcess 関数は起動時の座標を指定できるので、ひょっとしたら有効かもしれません。
> それが効かない場合、ウィンドウのタイトルまたはクラス名で識別できるのなら、FindWindow 関数で目的のウィンドウを探し出せば多分可能です。
> それも無理なら、EnumWindows 関数を使ってウィンドウを列挙し、GetWindowThreadProcessId 関数やら GetWindowInfo 関数やらを使って目的のウィンドウを特定することになります。

Hongliang様、ありがとうございます。

ご教示いただきました内容を元に、CreateProcess 関数から、試させていただきます。

ただし、関数の詳細を調べるところから入りますので、結果が分かるまで、しばらく時間がかかるかと思います。また分かり次第、当掲示板にて連絡させていただきます。

DOBON.NET | プログラミング道 | プログラミング掲示板