![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
お世話になります。
VC++ 6.0 MFC で開発しております。
A.exeから、B.exeを起動しています。
A.exeの(画面上の)上にB.exeが表示されるのですが、
そのB.exeを動かすと白い残像みたいな跡がでます。
そのB.exeの残像みたいなのを出さないようにしたいのですがどのようにすればよいでしょうか
※B.exeを起動している間は、A.exeを操作できないようにしたいのです。
***********実際のソースです。********
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);
int kekka = CreateProcess(Pass,CommandChar,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
if(kekka==0)
{
CStringstr;
str.Format("起動することはできません。);
AfxMessageBox(str, MB_OK, 0);
}
else
{
WaitForSingleObject(pi.hProcess,INFINITE);
}
PeekMessage()とかを使えばいいとか聞いたのですが、まったくわからない状態です。
大変お手数ですが具体的に教えていただければ大変ありがたいです。
なにとぞよろしくお願いします。
No.3ベストアンサー
- 回答日時:
B.exeの終了を待たなければ、画面も正常に更新されます。
操作を禁止したいのなら、EnableWindowを使いましょう。
もちろん、このままではB.exeが終了してからもA.exeが操作不能のままなので、タイマーなどを使ってB.exeの終了を監視するといいでしょう。
No.2
- 回答日時:
こんにちは。
「B.EXEの終了を待機する」のではなく、「B.EXEの終了を通知してもらう」方が良いのでは。
其れにはスレッドを回して、B.EXEが終了した時、終了を通知する為のメンバ関数を呼び出してもらいます。
以下はボタン1を押してB.EXE(メモ帳)を立ち上げ、B.EXEが終了するまでダイアログが操作を受け付けないようにします。参考程度に。
//ヘッダ
/////////////////////////////////////////////////////////////////////////////
// CMfcprocDlg ダイアログ
class CMfcprocDlg : public CDialog
{
//省略
//追加分
//スレッド関数
static UINT ThreadProc(LPVOID pParam);
//B.EXEが終了した時に呼ばれる
void Done();
//アクセサ
void SetProcess(HANDLE hProcess);
HANDLE GetProcess();
protected:
//クリティカルセクションクラス(stdafx.hの中にafxmt.hをインクルードしておく)
CCriticalSection m_cs;
//スレッドクラス
CWinThread* m_pThread;
//B.EXEのプロセスハンドル
HANDLE m_hProcess;
//省略
};
//ソース
/////////////////////////////////////////////////////////////////////////////
// CMfcprocDlg ダイアログ
CMfcprocDlg::CMfcprocDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMfcprocDlg::IDD, pParent),
m_pThread(NULL),//初期化
m_hProcess(NULL)//初期化
{
//省略
}
//スレッド関数
UINT CMfcprocDlg::ThreadProc(LPVOID pParam)
{
CMfcprocDlg* pThis = static_cast<CMfcprocDlg*>(pParam);
while(pThis->GetProcess())
{
const DWORD dwResult = ::WaitForSingleObject(pThis->GetProcess(), 0);
if(dwResult == WAIT_OBJECT_0 || dwResult == WAIT_ABANDONED_0)
{
//B.EXEのプロセスが終了したら呼び出す
pThis->Done();
//スレッドから抜け出す
break;
}
else if(dwResult == WAIT_TIMEOUT)
{
}
::Sleep(1);
}
//::MessageBox(NULL, TEXT("スレッド終了"), TEXT("確認"), MB_OK);
return 0;
}
//ボタン1が押された時
void CMfcprocDlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
PROCESS_INFORMATION pi;
STARTUPINFO si = {sizeof(si)};
//B.EXE(メモ帳)を立ち上げる
const int kekka = ::CreateProcess(TEXT("c:\\winnt\\notepad.exe"), NULL, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
if(kekka==0)
{
CString str;
str.Format(TEXT("起動することはできません。"));
AfxMessageBox(str, MB_OK, 0);
return;
}
//ウィンドウを無効化する
this->EnableWindow(FALSE);
//B.EXEのプロセスハンドルを設定する
SetProcess(pi.hProcess);
//スレッドを回す
m_pThread = ::AfxBeginThread(&CMfcprocDlg::ThreadProc, this, 0, 0, CREATE_SUSPENDED, NULL);
m_pThread->m_bAutoDelete = TRUE;
m_pThread->ResumeThread();
}
//B.EXEが終了した時
void CMfcprocDlg::Done()
{
//::AfxMessageBox(TEXT("待機完了"), MB_OK, 0);
//ウィンドウを有効化する
this->EnableWindow(TRUE);
this->SetActiveWindow();
//プロセスハンドルの設定をクリアする
SetProcess(NULL);
m_pThread = NULL;
}
//プロセスハンドルを設定する
void CMfcprocDlg::SetProcess(HANDLE hProcess)
{
m_cs.Lock();
m_hProcess = hProcess;
m_cs.Unlock();
}
//設定したプロセスハンドルを取り出す
HANDLE CMfcprocDlg::GetProcess()
{
m_cs.Lock();
HANDLE hProcess = m_hProcess;
m_cs.Unlock();
return hProcess;
}
No.1
- 回答日時:
WaitForSingleObject(pi.hProcess,INFINITE);
により「起動したプロセスがシグナル状態になる(つまり、B.exeが終了する)まで、何もしない」と言う処理をしている為「A.exeが再描画メッセージを受け取っても、再描画を行わない(「何もしない」のだから再描画さえしないのは当然)」のが「跡が残る原因」です。
>※B.exeを起動している間は、A.exeを操作できないようにしたいのです。
・メッセージを処理しないから、A.exeを操作できない
・メッセージを処理しないから、A.exeが再描画をせず跡が残る
上記の2つは相反します。
・メッセージを処理すると、A.exeが操作できてしまう
・メッセージを処理すると、A.exeが再描画され跡が残らない
上記の2つも相反します。
そういう訳で「簡単には解決しない」でしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(IT・Webサービス) エクセルの実行ファイルについての質問です。 1 2023/05/04 03:58
- オープンソース Pythonのコードをexe化 1 2023/07/03 08:01
- 労働相談 合意済み仕様の商品納入後における仕様変更要求への対応について 5 2023/04/19 09:41
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- その他(プログラミング・Web制作) Windowsのメモ帳でジョークウイルスが作りたいです。 3 2022/06/04 12:17
- その他(プログラミング・Web制作) Windowsのメモ帳でジョークウイルスが作りたいです。 1 2022/06/04 11:30
- Windows 10 exeファイルが起動しない 4 2022/06/05 16:13
- Windows 10 Windows11の実行モジュールはどこにある 1 2022/05/31 07:33
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイル 特定ウインドウ...
-
stable diffusionのインストー...
-
unityというゲーム作成ソフトの...
-
N88BASIC
-
バッチファイルで実行ファイル...
-
バッチファイルからftpを実行時...
-
コマンドプロンプトを消したい
-
DOS窓の非表示について
-
gccがコマンドプロンプト上で使...
-
コマンドプロンプト画面で動作...
-
EXCELをバッチコマンドで...
-
Windows版のEmacsのインストール
-
ショートカットの作成とコピー
-
ショートカットのリンク先が参...
-
eclipseのエラーに関する質問で...
-
バッチファイルでの時間差実行
-
コマンドプロンプトのエラーに...
-
コマンドプロンプトの「%1」と...
-
大量のフォルダからひとつのフ...
-
Windows10にデュアルブートでXP...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイル 特定ウインドウ...
-
stable diffusionのインストー...
-
ExcelVBAにてアプリをタスクマ...
-
EXCELをバッチコマンドで...
-
ショートカットの作成とコピー
-
バッチファイル実行時に起動す...
-
VB.NETでDOSコマンドの複数実行
-
プログラムを実行すると、なぜ...
-
exe間での引き値の受け取り方法
-
64bitのwindowsサーバーで32bit...
-
batファイルで立ち上げたaplを...
-
c#でコマンドプロンプトを実行...
-
UWSCについて
-
Shiftキーを押しながら起動
-
gccがコマンドプロンプト上で使...
-
C#でMediaPlayerを立ち上げた後
-
VB.NETでコマンドプロンプトの操作
-
指定したアプリケーションをモ...
-
バッチファイルでAPを終了さ...
-
相対パスのショートカットフォ...
おすすめ情報