No.4ベストアンサー
- 回答日時:
>補足にかけなかったのですがfor(;WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT;) {
>でfor文のループを回したらGetAsyncKeyStateを使えますが1秒で終了してしまいます
で、今はどう書いているんです?
# まぁ、内容がアレなのでforループではなくwhileループでもいいんですけどね。
while(WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT) {
//終了待ちの間に実行したい処理(間隔はWaitForSingleObject()の第2引数の値次第)
}
って感じですかねぇ。
すみませんでした。
1秒で終了するのは書き間違えでした。
うまく対象のアプリケーションが終了するまで起動して
GetAsyncKeyStateを使えるようになりました。
本当に感謝です(^^)
またお世話になるかもしれませんがその時は、よろしくお願い致します。m(__)m
No.3
- 回答日時:
>WaitForSingleObject()を使って対象のアプリケーションが終了するまでProgramを実行することは出来るようになったのですが
>待機している間GetAsyncKeyStateを使ってF1を押すとMessageが出るようにすることは可能ですか?
>考えたプログラムは↓のようにしたのですがダメでした。
そりゃ、指定したプロセスが終了(シグナル状態)になるまでWaitForSingleObject()から戻って来ません(INFINITE=無限待ち)から無理ですわな。
WaitForSingleObject()の第2引数を指定して、ループで回すようにすることで対処できるでしょう。
具体的な例は回答済みですけどね。
#1のコードだと終了までの間、おおよそ1秒毎に"."が表示されるようになってます。
# ちなみに、MessageBox()だと表示中に終了された場合はすぐに検出できませんよ。
この回答への補足
とても丁寧に説明していただきありがとうございます(^^)
ですが無知すぎて申し訳ないのですが
>>WaitForSingleObject()の第2引数を指定して、ループで回すようにすることで対処できるでしょう。
WaitForSingleObject(hProcessHandle,○○○)
○○○のところとwhile文の()のなかどどうやって書けばいい出ようか?
補足にかけなかったのですがfor(;WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT;) {
でfor文のループを回したらGetAsyncKeyStateを使えますが1秒で終了してしまいますGetAsyncKeyStateを使えてなおかつ対象のアプリケーションが終了するまでプログラムを実行するにはどうしたらよいでしょうか?
No.2
- 回答日時:
>printf("\nメモ帳がしました。
\n");printf("\nメモ帳が終了しました。\n");
です。
くだらない間違いですが。
実際に使用する場合には別にスレッド起動して、WaitForMultipleObjects()辺りを使うべきでしょう。
# 監視スレッドを終了させる為のイベントオブジェクトとか設定して。
まかり間違ってもプロシージャ内で無限ループしないように。
「(応答無し)」とかのラベルを授与されますからね。
No.1
- 回答日時:
「WaitForSingleObject プロセス 終了待ち」で検索すれば、そこそこ見つけられるかと。
ただし…
http://oshiete.goo.ne.jp/qa/8101869.html
で指摘されているように自分で起動したものではないプロセス…の場合は面倒かも知れません。
OpenProcess()でハンドルが取れるかどうか…とか。
# 実行ファイル名が同名の別アプリかも知れない。という問題もありますし。
あとは…WaitForSingleObject()の待ち時間を無限に設定したりすると、
自分のアプリの終了に不具合があるかも知れませんので注意が必要かもしれません。
ということで前回の質問の#1さんのプログラムを改造してみました。
# WinExec()で起動したメモ帳は待てましたが…他から起動したメモ帳だとGetModuleBaseName()で実行ファイル名が取得できませんでした。
# 権限の問題かも知れませんな。
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <psapi.h>
#define MAX_STR 500
#define MAX_ARRAY 1024
int main() {
DWORD procIdList[MAX_ARRAY];
DWORD retSize;
int nProc;
int i;
char procName[MAX_STR];
HANDLE hProcess;
HMODULE hMod;
//メモ帳を起動してやる
WinExec("notepad.exe", SW_SHOWNORMAL);
//プロセスIDの一覧を取得
if (!EnumProcesses(procIdList, sizeof(procIdList), &retSize)) {
printf("EnumProcesses関数が失敗\n");
return 1;
}
nProc = retSize / sizeof(DWORD);
//printf("%d個のプロセス\n", nProc);
for (i = 0; i < nProc; i++) {
strcpy(procName, "");
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | SYNCHRONIZE, FALSE, procIdList[i]);
if (hProcess != NULL) {
//プロセス名の取得
retSize = sizeof(hMod);
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &retSize)) {
GetModuleBaseName(hProcess, hMod, procName, MAX_STR / sizeof(char));
}
}
//メモ帳が起動中かどうか確認する
if (strcmp(procName, "notepad.exe") == 0) {
//メモ帳を確認
break;
}
CloseHandle(hProcess);
hProcess = NULL;
}
if (hProcess != NULL) {
printf("メモ帳が起動しています。\n終了を待ちます。\n");
for(;WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT;) {
printf(".");
}
printf("\nメモ帳がしました。\n");
CloseHandle(hProcess);
} else {
printf("メモ帳を確認できません。終了します。\n");
}
return 0;
} //end of main
この回答への補足
WaitForSingleObject()を使って対象のアプリケーションが終了するまでProgramを実行することは出来るようになったのですが
待機している間GetAsyncKeyStateを使ってF1を押すとMessageが出るようにすることは可能ですか?
考えたプログラムは↓のようにしたのですがダメでした。
他にありますでしょうか?
#include <windows.h>
#include<tchar.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
DWORD proccess_ID;
HWND hWnd = FindWindow("classname" ,"windowtitle");
GetWindowThreadProcessId(hWnd, &proccess_ID);
HANDLE hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, NULL, proccess_ID);
if(hProcessHandle != 0){
if( GetAsyncKeyState( VK_F1 ) & 1 ){
MessageBox(NULL, "起動中でもキーが押せます", "F1を押しました。", MB_OK + MB_ICONINFORMATION);
}
WaitForSingleObject(hProcessHandle,INFINITE);
CloseHandle(hProcessHandle);
MessageBox(NULL, "対象のアプリケーション終了", "Success", MB_OK + MB_ICONINFORMATION);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- その他(Microsoft Office) Offece Home&Business2016をアンインストールする方 1 2022/04/08 23:23
- その他(コンピューター・テクノロジー) Ubuntu22.04ltsですが、たまにYou Tubeを聴いたり観たりしていると、無限ループでコ 2 2023/07/21 13:19
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Windows 10 Corei 7-12700(Alder Lake) と Windows11の不具合? 5 2023/01/14 12:06
- ノートパソコン Win10 EXCEL でのエラー 2 2022/04/03 15:57
- iOS Gragebandでのみ左クリックが有効にならない 1 2022/08/19 13:18
- Windows 10 他のPCで実行中のプログラムをリモートで終了させたい 3 2022/06/14 13:44
- その他(ソフトウェア) ソフトが異常終了します 1 2022/08/28 01:41
- 一眼レフカメラ カメラの電源がoffにしても電源が切れない。 4 2022/08/01 09:55
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンソールアプリケーションの...
-
タスクスケジューラからの起動
-
アプリケーションをVBS(WSH?)で...
-
Vba アプリケーションが立ち上...
-
Accessフォームからの外部アプ...
-
OSによるWinExecの動...
-
フレームワーク「4.8.1」で、[S...
-
MFCアプリケーションでの終了コ...
-
VB.NETでMessageBoxを表示した...
-
VBSでのSendKeysでの画面の最小化
-
pccNTmon.exeとntrtscan.exeの違い
-
SYSTEM権限でプロセス機動
-
vb6で異なるのプロジェクト間で...
-
Windowsプログラムのビジー状態...
-
SetWindowPosについて
-
エクセル・アプリケーションエ...
-
イラストレーターCS4のシリアル...
-
javaアプリケーションの起...
-
コマンドライン版ソフトの意義
-
excel VBAで、外部アプリケーシ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンソールアプリケーションの...
-
Vba アプリケーションが立ち上...
-
フレームワーク「4.8.1」で、[S...
-
VBSでのSendKeysでの画面の最小化
-
イラストレーターCS4のシリアル...
-
vb6で異なるのプロジェクト間で...
-
初回接続の遅い原因について
-
VB.NETでMessageBoxを表示した...
-
MFCアプリケーションでの終了コ...
-
pccNTmon.exeとntrtscan.exeの違い
-
Windowsプログラムのビジー状態...
-
実行時のコマンドプロンプトを...
-
自分自身を更新するプログラム
-
VB.NETでフォームアクティブの...
-
Accessフォームからの外部アプ...
-
Console Applicationをタスクト...
-
httpd.pidって何ですか?
-
VB.NETで起動させたExcelの多重...
-
vcxprojファイルの修正法???
-
「AcroRd32.exe」これってウイ...
おすすめ情報