Delphiでつくったソフトを動かしているときに×ボタンで終了しても
処理の途中だったらなかなか、終了してくれません。
タスクマネージャーのプロセスから終了するような
ボタンをつけたいのですが方法はありますでしょうか?
Mr.XRAYです.
>ボタンをつけたいのですが方法はありますでしょうか?
そんなボタンはみたことがありませんが,
そのアプリ(フォーム)にボタンを配置して,Closeと書いても閉じないのであれば,
処理中という処理のコーディングを工夫する必要があるかも知れません.
だって,ボタンむ[×]をクリックしても,反応しないのですから.
どのような処理かもDelphiや他の環境も不明ですが,
以下の記事が,もし,参考になれば幸いです.
http://mrxray.on.coocan.jp/Delphi/plSamples/840_CancellLockDisable.htm
>http://mrxray.on.coocan.jp/Delphi/plSamples/840_CancellLockDisable.htm
このページでは主に,Application.ProcessMessages を使用していますが,
常にこの方法でうまくいくとは限りません.
処理内容によっては Application.ProcessMessages を使用すると処理が不安定に
なることがあります.
ご注意ください.
早速のアドバイスありがとうございます。
Application.ProcessMessages は以前もしようした事がありまして
早速ためしたみたのですが、結局×と終了速度は同じでした。
なのでApplication.ProcessMessages でアプリ名を指定して
停止するアプリを作って試してみましたがこれも同じ結果でした。
タスクのプロセスって強烈ですねw
あれをDosのBatとかで実行できないですかね???
すいません、勘違いしていました、私が使用したのは
PostMessage(FindWindow です。
Application.ProcessMessages を調べてみたのですが
どのように使用するのでしょうか?この関数の意味が
よくわかりません。
すいません。
Thredを使ってみればどうですか?
>この関数の意味が よくわかりません。
>http://mrxray.on.coocan.jp/Delphi/plSamples/840_CancellLockDisable.htm
ここには,
「Application.ProcessMessageは,「その時対処しなければならないウィンドウメッ
セージをとりあえず処理」し,再描画が必要なら実行します.これは,...(以下略)」
または,Delphiのヘルプでは
http://docwiki.embarcadero.com/VCL/ja/Forms.TApplication.ProcessMessages
これ以上の説明は私にはできません.
>>HOta
Thredとは何でしょうか・・・
どの様に使用すればよろしいですか?
Mr.XRAYです.
現在の環境にはヘルプがない,ということはないですよね?
TThreadという単語はみたことがなくても,「スレッド」という言葉はきいたことがある
と思います.
Windows はマルチスレッド何とかかんとか,というように.
Delphiのオンライン・ヘルプの多分(?)該当ページです.
Classes.TThread
http://docwiki.embarcadero.com/VCL/ja/Classes.TThread
更に追い討ちをかけて(笑).
インターネット.この掲示板を見たり,書き込んだりしていますので,
接続しているわけですね.
インターネットでは「検索」という便利な機能があります.
例えば以下のURLで「TThreadとは」とか
「TThread Delphi」で検索すると,いろいな情報を得ることができます.
他の方に検索してもらってレスしてもらうのもいいかも知れませんが,
自分で時間をかけて調べたものは,結構身につきますよ.
procedure
長い処理
end;
この長い処理中にボタンを押すとメッセージがスタックされて
procedure 〜 end; の処理が終わった後に処理される
PoseMessage でメッセージを送ってもメッセージがスタックされる
だけなので当然
>早速ためしたみたのですが、結局×と終了速度は同じでした。
となる
Application.ProcessMessages があるとその時点でメッセージを
処理してくれるようになるので X を押すことは可能となる
がアプリケーションの終了は出来ないので
http://mrxray.on.coocan.jp/Delphi/plSamples/840_CancellLockDisable.htm
にあるように長い処理(ループ?)を抜けるようにしなければならない
>タスクのプロセスって強烈ですねw
>あれをDosのBatとかで実行できないですかね???
でスレッドでどうしろと?
ものはついでに.参考としてです.
>タスクのプロセスって強烈ですねw
>あれをDosのBatとかで実行できないですかね???
いずれにしてもボタンのクリックが検出できなければどうにもなりません.
Windowsはメッセージの嵐です.WindowsというOS(Windowsとは限りませんが)は常にシステム
を監視していて,
[Ctrl]+[Alt]+[Delete]
を検出すると,タスクマネージャーを表示しているようになっています.
DelphiのボタンもWindowsのメッセージを監視していますが,自分のアプリ内だけです.
そうしないと,プログラムの開発者は,どこからそのメッセージからで,どんなメッセージ
かを判定する処理,つまりプログラムを書かなければなりません.
プログラマーに便利なような仕組みになっているわけです.
しかし,Delphiでは自アプリ以外のメッセージも処理できるようになっています.
それには主にフックというものを使用します.
(フックと用語は違いますが,似たような他の処理もあります)
フックは,Windowsのメッセージを横取りして処理することが可能です.
ただし,フックの処理はプログラムとしては難しい方でしょう.
今回の質問の内容は,実際の処理内容が不明(DelphiとOS等の環境も不明)なので
なんとも言えませんが,フックを使用するほどのことではないと推定します.
(フックの動作仕様はOSによって違う場合があります)
スレッドというのがレスにありますが,これに限らず,このような機会に調べる
というのもまたいいチャンスのような気もします.
フックもネットでいろいろ調べることができますが,手前味噌で紹介しておきます.
もちろん,どうしても
>あれをDosのBatとかで実行できないですかね???
ということをしたいのであれば,参考になるとは思いますが,わさわざ難しい
コーディングをする必要もないと思いますよ.
第4章 メッセージを盗む: サブクラス化とフック関数
http://mrxray.on.coocan.jp/Halbow/Chap04.html
第7章 ウィンドウメッセージを捕まえる : ローカルフック
http://mrxray.on.coocan.jp/Halbow/VCL07.html
フック関数のインスタンス化
http://mrxray.on.coocan.jp/Halbow/Notes/N006.html
フック関数の種類
http://mrxray.on.coocan.jp/Others/A_KindOfHook.htm
260_グローバルフック(キー・マウス)
http://mrxray.on.coocan.jp/Delphi/plSamples/260_HookKeyMouseEvent.htm
270_ウインドウの生成を知る
http://mrxray.on.coocan.jp/Delphi/plSamples/270_HookCBTCreate.htm
280_アプリの起動と終了を知る
http://mrxray.on.coocan.jp/Delphi/plSamples/280_HookCBTActivate.htm
290_グローバルフックWH_GETMESSAGE
http://mrxray.on.coocan.jp/Delphi/plSamples/290_HookGetMessage.htm
300_グローバルフックWH_CALLWNDPROC
http://mrxray.on.coocan.jp/Delphi/plSamples/300_HookCallWndProc.htm
310_グローバルフックWH_CALLWNDPROCRET
http://mrxray.on.coocan.jp/Delphi/plSamples/310_HookCallWndProcRet.htm
内容がよくわからないのですが、
プロセスのexe名やフルパスexeやプロセスIDで
プロセスを落としたいのなら、コマンドを作っています。
http://delfusa.main.jp/delfusafloor/opensource/execontrol/20070709160841/index.html
ExeTerminate/ExeTerminateMultiのソースみてください。
他のユニットもusesする必要があるかもしれません。
ツイート | ![]() |