「アプリケーションの追加と削除のプロパティ」をモーダル表示したいのですが・・・

[戻る]
ちえ [E-Mail] 2002/10/15(火) 15:19:04
プロパティページ内で、「アプリケーションの追加と削除のプロパティ」をモーダルで表示しよう
としているのですが、うまくいきません。親ウィンドウが操作できてしまうし、「アプリケーシ
ョンの・・・」を閉じたときにエラーになってしまいます。なんとかうまく表示できる方法を教
えて下さい。よろしくお願いいたします。

PATIO 2002/10/15(火) 18:03:20
どうやってやったらどんなエラーになったのかを具体的に提示して下さい。
これでは何をやったのか答える側が想像しないといけないことになります。
回答を得たいのですから答える側に不要の負担を強いるのはどうかと思います。

あと、何度かこの場で質問されているのだと思いますが、
ご自分の開発環境やその他もろもろの公開すべき情報は毎回書いてください。
前回貴方の書き込みを読んだ人だけがこれを見ているわけではありません。
こういった公の場で質問をするのですから質問する側で配慮してください。

ちえ [E-Mail] 2002/10/16(水) 09:44:33
PATIOさんご指摘どうもありがとうございます。
環境など、書いていらっしゃらない方もみえたので、自分までなあなあになっていました。
お恥ずかしい限りです。

改めて質問させてください。
御教授お願い致します。

環境
OS : Win 2000 / 開発言語 : VC++6.0(MFC使用)

プロパティシートを使用して、ウィザード形式のDOS起動用フロッピーディスクを作成する
ツールを作成しています。
ウィザード中で、「アプリケーションの追加と削除のプロパティ」を呼び出しているのですが、
その際、モーダルで表示する方法がわかりません。
現在はこのように呼び出しています。
   void CPage::OnButtonClick() 
   {
     SHELLEXECUTEINFO shell;
     ZeroMemory(&shell,sizeof(SHELLEXECUTEINFO));
     shell.cbSize=sizeof(SHELLEXECUTEINFO);
     shell.nShow=SW_SHOWNORMAL;
     shell.lpFile="C:\WINNT\System32\appwiz.cpl";

     this->GetParent()->EnableWindow(FALSE);

     if(!ShellExecuteEx(&shell) || (const int)shell.hInstApp <=32)
     {
    MessageBox("呼び出し失敗!!",NULL,NULL);
     } 

     this->GetParent()->EnableWindow(TRUE);
   }
 
スマートにモーダルで表示できる方法を教えてください。よろしくお願い致します。

らふ 2002/10/16(水) 10:36:34
不可視のモーダルダイアログを作ってそこから呼ぶとか。
#全然スマートじゃ無いですね。すいません

PATIO 2002/10/17(木) 10:13:56
このプログラムでは、ShellExecuteExが「アプリケーションの追加と削除のプロパティ」を
呼び出したら、すぐに、this->GetParent()->EnableWindow(TRUE);が動いてしまうので
this->GetParent()->EnableWindow(FALSE);が全く効いていませんね。

ShellExecuteExは、呼び出しが成功するとすぐに戻ってきてしまいます。
モーダル風にしたいのだったらWaitForSingleObjectなどでパネルが終了するまで
待つべきでしょう。

この手の話はWeb上にたくさん転がっています。
ご自分で調べてみてください。

ちえ 2002/10/19(土) 16:14:38
[[解決]]
むりやり過ぎるやり方ですが、以下のやり方で解決することができました。

/*******************/
/* 呼び出されたひと */
/*******************/
UINT CallModalCPropertyThread(HWND hOwnerWnd)
{
    //親ウインドウを無効にする
  ::EnableWindow(hOwnerWnd, FALSE);

  //"アプリケーションの追加と削除のプロパティ"の呼び出し
  SHELLEXECUTEINFO shInfo;
  ::ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
  shInfo.cbSize       = sizeof(SHELLEXECUTEINFO);
  shInfo.fMask        = SEE_MASK_NOCLOSEPROCESS;
  shInfo.hwnd         = hOwnerWnd;
  shInfo.lpVerb       = "OPEN";
  shInfo.lpFile       = "control.exe";
  shInfo.lpParameters = "appwiz.cpl";
  shInfo.lpDirectory  = NULL;
  shInfo.nShow        = SW_SHOWNORMAL;
  ::ShellExecuteEx(&shInfo);

  //"アプリケーションの追加と削除のプロパティ"の終了を待つ
  ::WaitForSingleObject(shInfo.hProcess, INFINITE);

  //プロセスを閉じる
  ::CloseHandle(shInfo.hProcess);

  //親ウインドウを有効にする
  ::EnableWindow(hOwnerWnd, TRUE);

  //スレッド終了
  AfxEndThread(0);

  return 0;

}

/***************/
/* 呼び出すひと */
/***************/
void CPropPage1::OnButtonClick() 
{
  AfxBeginThread((AFX_THREADPROC)ModalCallThread, 
          (LPVOID)AfxGetMainWnd()->m_hWnd);
}


らふさん、PATIOさん、御教授ありがとうございました。

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