Windows10/Delphi103の環境です。
自アプリの二重起動防止のため、既に起動していたら切り換えて後から起動した方を終了させようとしています。
ネットで調べ、以下のコードで最小化されていても元に戻して全面表示にはできました。
しかし、その後最小化から元に戻した場合、右上の最小化ボタンやキャプションバー右クリックメニューの最小化では最小化できなくなります。
原因等ネットを探していますが見つけられずお手上げ状態です。
//最小化されていたら元のサイズに戻す
SendMessage(DlgHWnd, WM_SYSCOMMAND, WPARAM(SC_RESTORE and $FFF0), 0);
//前面に移動させる
SetForegroundWindow(DlgHWnd);
Close;
対応策等、お解りの方宜しくお願いいたします。
自分では、いつもこんなイメージで処理していましたが、不具合は出ていません。新規プロジェクトでも同じ結果が出ますか?
SendMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0 );
すみません。出先なので検証できませんが、自分で使うときは、
if (IsIconic(handle) then
といった条件文を付けていました。
回答ありがとうございます。
FormにButtonだけの新規プロジェクトを作成して、ボタンを押したら質問の自作ソフトを最小状態から元に戻しましたが症状は変わりませんでした。
しかし、その新規プロジェクトから違う市販ソフトを同様の処理を実行したところ、正しく再度の最小化が機能しました。
以上のことより、自作のソフト内部に再度最小化するのを邪魔している何かがあるのだと思います。
今のところ皆目見当が付きませんが、また調べてみようと思います。
長々とコードを載せるわけにもいきませんので難しいと思いますが、何か予想が付く方がいらっしゃれば宜しくお願いします。
自分は10.3 Delphi Communityで Owl's perspective さんの記事のソースコードを素にして使ってます。
アプリケーションの多重起動を禁止する
http://owlsperspective.blogspot.com/2008/11/avoiding-multiple-instance.html
arigayasさん、ありがとうございます。
二重起動防止に関しては現状のコードで問題ないのですが、リンク先のサンプルは非常に確実な方法で、今後使用したいと思いました。
ネットで検索すると二重起動防止のサンプルがいくつかあります.
おそらく,それらは定番とも言えるコードではないかと思います.
以下は,最近私が掲載したサンプルです.参考になれば.
[ Lazarus のアプリの二重起動防止 ]
http://mrxray.on.coocan.jp/Delphi/Others/Lazarus_InhibitRun.htm
Mr.XRAYさん、ありがとうございます。
Mr.XRAYさんのHPは、よく拝見させて頂いています。
先に起動中側が最小化されていて、二重起動防止コードでウィンドウを元に戻した場合に再度の最小化が出来ない状態になっていた問題ですが、
Mr.XRAYさんの二重起動防止サンプルの解説を読んで、もしかしたらと思い下の1行をプロジェクトソースに追加したら解決しました。
Application.MainFormOnTaskBar := True;
調べても、上の1行が何故影響していたかは分かりませんが、解決できました。
Mr.XRAYさん、ありがとうございました。これからもHPは参考にさせて頂くことが多いと思いますので、宜しくお願いいたします。
アドバイス頂いた皆さん、ありがとうございました。
ツイート | ![]() |