御世話になります。
Delphi 2007にて開発を行っています。
開発と言っても、簡単なプログラムしか作成できません。
ひとつ、不明な点がご質問します。
Delphiから CreateProcess で外部プログラムを起動しているのですが
その外部プログラムが起動している間は、その外部プログラムのフォームが
表示されるようにできますでしょうか?
できます。
ttp://www.wwlnk.com/boheme/delphi/tips/tec0260.htm
こんちには.
>その外部プログラムが起動している間は、その外部プログラムのフォームが
>表示されるようにできますでしょうか?
ということですが.
その外部プログラムには,例えば [ 閉じる ] とか [ 終了 ] のボタンがあるかも知れません.
あるいは,フォームの右上に [ X ] ボタンがあるかも知れません.
とするとですね.
「その外部プログラムのフォームを閉じない限り,その外部プログラムのフォームは表示されている」
ということになるの思うのですが.
これは,CreateProcess で起動しようが,[ スタート ] メニューから起動しようが同じだと思います.
その外部プログラムの,そのフォームが,何かの拍子,
例えば一定の時間が経つと,閉じてしまうのでしょうか ?
ほむっほさん、Mr.XRAYさんお返事ありがとうございます。
ほむっほさんからご指示頂いたサイトを拝見しましたが、
知識不足の為、意味が理解出来ませんでした。
9番目の変数を何にしたら、外部プログラムが終了しない限り、
フォームが表示されているのでしょうか?
Mr.XRAYさん、私の説明不足でご迷惑おかけし申し訳ありません。
私が行いたいことは、Delphiのフォーム上のボタンをクリックしたら、
CreateProcessの外部プログラムが起動します。
外部プログラムが起動している間は、Delphiのフォームを選択など
しても、Delphiのフォームが前面にならないように
してほしいです。
ご面倒おかけしますが、ご教授お願いします。
>ご面倒おかけしますが、ご教授お願いします。
残念ですが,私は「教授」する資格もありませんし,立場でもありませんが...
自アプリから,別のアプリを起動し,
その別のアプリが終了するまで待つ,ということですよね.
>Delphiから CreateProcess で外部プログラムを起動しているのですが
現在は,どのようなコードで実行しているのですか ?
コードがわかれば,どこを修正すればいいのか,指摘できると思いますよ.
手前味噌ですが,以下を参考にしてください.
ただし,Windows のバージョンによっては,何か必要かも知れません.
[500_コマンドプロンプト起動 2 ( CreateProcess使用 )]
http://mrxray.on.coocan.jp/Delphi/plSamples/500_CmdPrompt2.htm
[他のプログラムを起動してそれが終了するのを待つ]
http://mrxray.on.coocan.jp/Halbow/Notes/N001.html
参考リンク
http://ht-deko.minim.ne.jp/tech045.html#tech095
ワンワンさん、こんばんは。
>外部プログラムが起動している間は、Delphiのフォームを選択など
>しても、Delphiのフォームが前面にならないように
これはDelphiでFormをShowModalした時の様に、外部プログラムを呼び出したら
そのプログラム以外のウィンドウに行かない様にしたいということでしょうか?
呼び出し元のDelphiプログラムに戻らなければいいのであれば
Delphiプログラムの中で、自分が(アプリケーションレベルで)アクティブになったら
呼び出した外部プログラムがまだ実行されているかを調べて、実行しているようなら
そのプログラムにフォーカスを移動させるようにすれば、一見それらしくなるのではないでしょうか?
あるいは、外部プログラムを呼び出した後、自分を最小化してタスクバーからも消してしまうとか。
まぁこれはうまくいくか判らないし、下手をすると元のDelphiプログラムに戻れなくなるなど
いろいろ危険な感じもしますが^^;
CreateProcessで起動したやつに HWND_TOPMOST をSETするとか・・
var
ExecuteProcess: Boolean = False;
WinExecAndWait32V2 の中身
ExecuteProcess := True;
while WaitForSingleObject(ProcessInfo.hProcess, 100) = WAIT_TIMEOUT do
begin
Application.ProcessMessages;
ExecuteProcess := False;
end;
procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
var
H: HWND;
begin
if ExecuteProcess = True then
begin
H := GetForegroundWindow;
SetWindowPos(H,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
end;
end;
新年明けましておめでとうございます。
皆様のアドバイスのお陰で、なんとか
解決できました。
新年早々、よいスタートがきれました。
皆様、ありがとうございました。
今年もよろしくお願いいたします。
ツイート | ![]() |