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

「アプリケーションの追加と削除のプロパ...
 
通知
すべてクリア

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


ちえ
 ちえ
(@ちえ)
ゲスト
結合: 23年前
投稿: 4
Topic starter  

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


引用未解決
トピックタグ
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

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

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


返信引用
ちえ
 ちえ
(@ちえ)
ゲスト
結合: 23年前
投稿: 4
Topic starter  

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);
}

スマートにモーダルで表示できる方法を教えてください。よろしくお願い致します。


返信引用
らふ
 らふ
(@らふ)
ゲスト
結合: 23年前
投稿: 18
 

不可視のモーダルダイアログを作ってそこから呼ぶとか。
#全然スマートじゃ無いですね。すいません


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

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

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

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


返信引用
ちえ
 ちえ
(@ちえ)
ゲスト
結合: 23年前
投稿: 1
 

むりやり過ぎるやり方ですが、以下のやり方で解決することができました。

/*******************/
/* 呼び出されたひと */
/****************/
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さん、御教授ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました