Windows 8.1 のナレーター使用中、アプリが終了後もタスクマネージャに残る

[戻る]
ゲキアツ 2014/03/01(土) 11:47:49
お世話になります。

自分が作ったアプリに、MUTEXによる二重起動防止を入れています。
Windows 8.1 に搭載されている音声読み上げ「ナレーター」を動作させているときに、こ
のアプリを起動・終了し、再度起動したところ、二重起動防止が働いて、起動できません
でした。
タスクマネージャーを調べたところ、バックグラウンド・プロセスの中にこのアプリが
残っています。
「ナレーター」を終了すると、このアプリの残存プロセスも消えます。

「ナレーター」を動作させていない場合は、もちろん問題はありません。

そこで、新規にアプリのスケルトンを作って試してみました。
Visual Studio 2010、MFC、SDI です。途中すべて VS の既定のままのプロジェクトとし
ました。
何のコードも入れずビルドし、「ナレーター」動作中に起動・終了したところ、タスクマ
ネージャーのバックグラウンド・プロセスに残ります。

これは「ナレーター」のバグでしょうか?
二重起動防止をやめる以外に、アプリ作成上の回避策はあるでしょうか?
よろしくお願いいたします。

なお、MFC、ダイアログベースのアプリではこの現象は起きないことを確かめました。

仲澤@失業者 2014/03/03(月) 10:28:12
たとえナレーターのバグであっても回避しなければなりませんよね。

ちなみに、ミューテックスの作成方法によるかもしれませんので。
まず、グローバルでない名前付きミューテックスになってるかどうかを調べましょう。
(例)
m_hMSP = CreateMutex(NULL, TRUE, "MyApplicationStartPrevent");// 名前付き、かつ
グローバルでない。
if(GetLastError() == ERROR_ALREADY_EXISTS){
   //既に起動してます。
}

ゲキアツ 2014/03/05(水) 09:01:57
有り難うございます。

Mutex の名前をグローバルで定義していました。
そこで、例示して戴いたように、グローバルでない名前付きに変えてやってみました。
結果は同じです。

「ナレーター」起動中はタスクマネージャーのバックグラウンド・プロセスに残り、ERRO
R_ALREADY_EXISTS となるようです。

VC でビルドしたスケルトン(コードは何も入れないままのもの)自体が、ナレーター起
動中に終了するとタスクマネージャーに残る。Mutex は関係ないように思います。
アプリの終了の仕方を何か工夫すればいいかもしれないと思うのですが、判りません。

ゲキアツ 2014/03/11(火) 06:47:22
[[解決]]
Mutex の代わりに、二重起動防止に FindWindow 関数を使うことにしました。

タスクマネージャーのバックグラウンド・プロセスの中に、ナレーター起動中に起動・終
了した同じアプリのプロセスが残っていても、FindWindow の戻り値は NULL となります
。

古いスレッドには追加発言できません。