CreateProcess

解決


ワンワン  2012-12-14 23:31:44  No: 43484

御世話になります。
Delphi 2007にて開発を行っています。
開発と言っても、簡単なプログラムしか作成できません。
ひとつ、不明な点がご質問します。
Delphiから  CreateProcess  で外部プログラムを起動しているのですが
その外部プログラムが起動している間は、その外部プログラムのフォームが
表示されるようにできますでしょうか?


ほむっほ  2012-12-14 23:47:35  No: 43485

できます。

ttp://www.wwlnk.com/boheme/delphi/tips/tec0260.htm


Mr.XRAY  2012-12-15 03:33:39  No: 43486

こんちには.

>その外部プログラムが起動している間は、その外部プログラムのフォームが
>表示されるようにできますでしょうか?

ということですが.
その外部プログラムには,例えば [ 閉じる ] とか [ 終了 ] のボタンがあるかも知れません.
あるいは,フォームの右上に [ X ] ボタンがあるかも知れません.
とするとですね.

「その外部プログラムのフォームを閉じない限り,その外部プログラムのフォームは表示されている」

ということになるの思うのですが.
これは,CreateProcess で起動しようが,[ スタート ] メニューから起動しようが同じだと思います.
その外部プログラムの,そのフォームが,何かの拍子,
例えば一定の時間が経つと,閉じてしまうのでしょうか ?


ワンワン  2012-12-15 17:51:48  No: 43487

ほむっほさん、Mr.XRAYさんお返事ありがとうございます。
ほむっほさんからご指示頂いたサイトを拝見しましたが、
知識不足の為、意味が理解出来ませんでした。
9番目の変数を何にしたら、外部プログラムが終了しない限り、
フォームが表示されているのでしょうか?

Mr.XRAYさん、私の説明不足でご迷惑おかけし申し訳ありません。
私が行いたいことは、Delphiのフォーム上のボタンをクリックしたら、
CreateProcessの外部プログラムが起動します。
外部プログラムが起動している間は、Delphiのフォームを選択など
しても、Delphiのフォームが前面にならないように
してほしいです。
ご面倒おかけしますが、ご教授お願いします。


Mr.XRAY  2012-12-15 20:51:32  No: 43488

>ご面倒おかけしますが、ご教授お願いします。

残念ですが,私は「教授」する資格もありませんし,立場でもありませんが...
自アプリから,別のアプリを起動し,
その別のアプリが終了するまで待つ,ということですよね.

>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


Quest  2012-12-16 04:12:43  No: 43489

ワンワンさん、こんばんは。

>外部プログラムが起動している間は、Delphiのフォームを選択など
>しても、Delphiのフォームが前面にならないように
これはDelphiでFormをShowModalした時の様に、外部プログラムを呼び出したら
そのプログラム以外のウィンドウに行かない様にしたいということでしょうか?

呼び出し元のDelphiプログラムに戻らなければいいのであれば
Delphiプログラムの中で、自分が(アプリケーションレベルで)アクティブになったら
呼び出した外部プログラムがまだ実行されているかを調べて、実行しているようなら
そのプログラムにフォーカスを移動させるようにすれば、一見それらしくなるのではないでしょうか?

あるいは、外部プログラムを呼び出した後、自分を最小化してタスクバーからも消してしまうとか。
まぁこれはうまくいくか判らないし、下手をすると元のDelphiプログラムに戻れなくなるなど
いろいろ危険な感じもしますが^^;


KHE00221  2012-12-17 07:09:50  No: 43490

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;


ワンワン  2013-01-05 04:19:12  No: 43491

新年明けましておめでとうございます。
皆様のアドバイスのお陰で、なんとか
解決できました。
新年早々、よいスタートがきれました。
皆様、ありがとうございました。
今年もよろしくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加