WinExec("Notepad.exe",SW_SHOW)でメモ帳を起動させることができたのですが。
どうしてもボタンを押したイベントとしてメモ帳を終了させる方法が分かりません。
誰かわかりませんか?
Win32環境において,他のプロセスを確実かつ安全に終了させる,汎用の方法は存在しません。
WinExecではなくCreateProcessを利用してNotepadを起動させ,
得たスレッドIDを元にEnumThreadWindowsでNotepadのウィンドウを探し,
WM_CLOSEをpostすることによって,終了してくれるかもしれません。
まぁ,最後の手段はTerminateProcessですが……。
エラーがでてしまいなかなかうまくできません。
サンプルコードなどありましたらのせてもらえないでしょうか?
エラーが出たとはどのようなエラーが出たのですか?
また,エラーが出た周辺の関連するコードも書いてみて下さい。
void CMyDlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CreateProcess("notepad.exe");
char cMsg[128];
wsprintf(cMsg, "メモ帳を使用しますか?");
int iMsg = MessageBox(cMsg,"メッセージボックス", MB_YESNO | MB_ICONQUESTION);
if(iMsg==IDNO)
{
EnumThreadWindows("notepad.exe");
}
}
エラー:'CreateProcessA' : 関数が不正な 1 個の実引数をともなって呼び出されました。
エラー:'EnumThreadWindows' : 関数が不正な 1 個の実引数をともなって呼び出されました。
とりあえず,MSDNでちゃんと関数の仕様を調べて下さい。
http://msdn.microsoft.com/library/en-us/dllproc/base/createprocess.asp
http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/WindowReference/WindowFunctions/EnumThreadWindows.asp
void CMyDlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
/*WinExec("notepad.exe",SW_SHOW);
char cMsg[128];
wsprintf(cMsg, "メモ帳を使用しますか?");
int iMsg = MessageBox(cMsg,"メッセージボックス", MB_YESNO | MB_ICONQUESTION);
if(iMsg==IDYES)
{
CDialog::OnCancel();
}*/
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( "notepad.exe", // No module name (use command line).
"MyChildProcess", // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
ErrorExit( "CreateProcess failed." );
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
--------------------------------------------------------------------
エラー:'ErrorExit' : 定義されていない識別子です。
とまたエラーが出てしまいました。
実際の所、ボタンを押したら本当はメモ帳ではなく、"wmplayer.exe"
Windows Media Playerを立ち上げたいんです。
「Windows Media Playerを使用しますか??」とメッセージボックスを表示させ、「いいえ」を押したら、Windows Media Playerを終了させたいんですが…。
こんにちわ。
ErrorExitって言うのがエラーになってるんですよね?
これって、初心者さんが自作した関数のようですが、
それが間違ってるようですねぇ。
エラーの通り、ちゃんと定義していないだけでは・・・^^;
ちなみに、メディアプレーヤーはたしかパスが通ってないので
ノートパッドの起動のように、EXE名だけではダメだと思います。
フルパスで指定してください。(自分でパス通せばおっけー?)
りばぁさん、こんにちは!
メディアプレーヤー解決しました♪♪
どうもありがとうございました。
YuOさんもホントにありがとうございました!!
かなり助かりました。
というか……。
順序が逆では?
起動するか否かの確認をとって,
IDYESが返ってきたら起動するのが安全ですが……。
#終了させる確実な方法がないから。
> 最後の手段はTerminateProcessですが
とYuOさんもおっしゃっているように、これを行なうと、
OSが不安定になることもあります。
以前、Win98でやってみたら、ブルーバックになった。。
起動するか否かの確認をとって,
IDYESが返ってきたら起動する
ようにしていますから安心です。
さらに質問ですが、メディアプレーヤーを立ち上げたら、
自動的に自分が表示したい画面(曲)が表れるようには出来るのですか??
とりあえず、再生したいメディアファイル名をフルパスで引数に渡したところ
起動と同時に再生を開始しました。
CreateProcess での引数の渡し方についてはMSDNを参考にして下さい。
すみませんがそのサンプルコードを
教えていただけませんか?
お願いします!!
とりあえず、即効で組んだコンソールアプリですが、
一応動作することは確認しました。
私の家の環境(Win2kSP4+VC7)ではメディアプレイヤー(wmplayer.exe)
にはパスが通っていなかったので、フルパスを直打ちしていますが、
これは初心者さんの環境に合わせて変更してください。
(当然メディアファイルのフルパスも)
------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
int main()
{
char exe[] = "C:\\Program Files\\Windows Media Player\\wmplayer.exe";
char cmd[] = "\"C:\\Program Files\\Windows Media Player\\wmplayer.exe\" 適当なムービーファイルのフルパス";
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
ZeroMemory( &pi, sizeof(pi) );
si.cb = sizeof(si);
if( !CreateProcess(exe, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) ) {
fprintf(stderr,"起動失敗\n");
exit(-1);
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
exit(0);
}
------------------------------------------------------------
>> char cmd[] = "\"C:\\Program Files\\Windows Media Player\\wmplayer.exe\" 適当なムービーファイルのフルパス";
最初にスペースがあれば EXEのパスはこちら側に入れなくてもいいですよ。
逆に最初にスペースがないと、引数なしの扱いになるみたい。
(Win2000,sp4,VC++6.0,sp5)
瑣末でした。
とおりすがりさん、どうも親切に教えていただきありがとうございました。
また、なーめさんもご提案ありがとうございました。
本当に助かりました。